我正在使用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
我期望看到的是:
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)任何可以帮我解决这个问题的指针。
我的记录器类看起来像这样:
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"));
我每天记录~40,000个事件,其中大约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>
非常感谢任何帮助。
答案 0 :(得分:1)
<param name="ConversionPattern"
value="%d{yyyy-MM-dd'T'HH:mm:ss,SSS} - %m%n"/>
不使用\ t
尝试上述模式OR
答案 1 :(得分:1)
使用类似
的类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>