Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用log4j在一行上获取多个日志_Java_Log4j - Fatal编程技术网

Java 使用log4j在一行上获取多个日志

Java 使用log4j在一行上获取多个日志,java,log4j,Java,Log4j,我正在使用org.apache.log4j.Logger,我经常在日志中看到这样的行: 2013-06-09T00:06:00,092 data data data dat2013-06-09T00:06:10,253 data data2013-06-09T00:06:16,202 data d2013-06-09T00:06:20,750 data data data data public class MyLogger { private final org.apache.log

我正在使用org.apache.log4j.Logger,我经常在日志中看到这样的行:

2013-06-09T00:06:00,092 data data data dat2013-06-09T00:06:10,253 data data2013-06-09T00:06:16,202 data d2013-06-09T00:06:20,750 data data data data
public class MyLogger {
    private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger("com.example.mylog");

    public void info(String info){
        synchronized (log){
            log.info(info);
        }
    }
}
private CallsLogger callsLogger;
/* ... */
myLogger.info(String.format("%s\t%s\t%s\t%s", "data", "data", "data", "data"));
我希望看到的是:

2013-06-09T00:06:00,092 data data data data
2013-06-09T00:06:10,253 data data data data
2013-06-09T00:06:16,202 data data data data
2013-06-09T00:06:20,750 data data data data
也就是说,多个日志行挤在一行上,日志信息被覆盖。我不知道我做错了什么,所以我想知道(A)这是否是显而易见的事情,或者(B)任何可以帮助我解决这个问题的指针

我的logger类如下所示:

2013-06-09T00:06:00,092 data data data dat2013-06-09T00:06:10,253 data data2013-06-09T00:06:16,202 data d2013-06-09T00:06:20,750 data data data data
public class MyLogger {
    private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger("com.example.mylog");

    public void info(String info){
        synchronized (log){
            log.info(info);
        }
    }
}
private CallsLogger callsLogger;
/* ... */
myLogger.info(String.format("%s\t%s\t%s\t%s", "data", "data", "data", "data"));
我是这样使用的:

2013-06-09T00:06:00,092 data data data dat2013-06-09T00:06:10,253 data data2013-06-09T00:06:16,202 data d2013-06-09T00:06:20,750 data data data data
public class MyLogger {
    private final org.apache.log4j.Logger log = org.apache.log4j.Logger.getLogger("com.example.mylog");

    public void info(String info){
        synchronized (log){
            log.info(info);
        }
    }
}
private CallsLogger callsLogger;
/* ... */
myLogger.info(String.format("%s\t%s\t%s\t%s", "data", "data", "data", "data"));
我每天记录大约40000个事件,其中大约200个有格式错误的行,每行有2到11个单独的事件

我的log4j.xml如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "http://logging.apache.org/log4j/docs/api/org/apache/log4j/xml/log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="mylog" class="org.apache.log4j.rolling.RollingFileAppender">
        <rollingPolicy class="org.apache.log4j.rolling.TimeBasedRollingPolicy">
            <param name="FileNamePattern" value="logs/mylog.log.%d.gz"/>
        </rollingPolicy>
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                   value="%d{yyyy-MM-dd'T'HH:mm:ss,SSS}\t%m%n"/>
        </layout>
    </appender>
    <logger name="com.example.mylog" additivity="false">
        <level value="INFO"/>
        <appender-ref ref="mylog"/>
    </logger>
    <root>
        <priority value="ERROR"/>
        <appender-ref ref="appender"/>
    </root>
</log4j:configuration>

非常感谢您的帮助。


<param name="ConversionPattern"
               value="%d{yyyy-MM-dd'T'HH:mm:ss,SSS} - %m%n"/>
请尝试以上模式而不使用\t

使用类似

public class MyPatternLayout extends PatternLayout {
...
public String format(LoggingEvent pEvent) {
    return super.format(pEvent).replace('\n', ' ') + '\n';
}
...
这将从要记录的字符串中删除所有\n,然后在行尾添加一个

在log4j config xml中使用:

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
...
<layout class="....MyPatternLayout">
...
</layout>
</appender>

...
...

myLogger.info(String.format(“%s\t%s\t%s\t%s”、“数据”、“数据”、“数据”+“\n”));尝试this@shreyanshjogi换行符已处于日志模式(
%n
)。缓冲和并行访问记录器可能有问题,请尝试在每次日志操作后强制记录器刷新,方法是添加:在appender标记中,此问题仅影响0.3%的日志行和0.9%的日志事件。Adam,log4j是线程安全的,您不应该在MyLogger中要求额外的同步层,尽管这不会导致您的问题。是否确定只有一个进程正在写入日志?如果同一台机器上有多个进程(或不同机器上的多个进程写入共享磁盘)具有相同的log4j配置,JVM级别的同步将无法保护日志,您将看到您描述的症状。或者,如果您需要选项卡,请将\t替换为 ;试试看。根据me%t用于显示线程名称