为什么 Slf4j/Logback 不记录文件名和行号
Why doesn't Slf4j/Logback log filename and row number
我的日志记录有问题,slf4j 不记录 message/stacktrace.
的文件名和行号
代码:
private static Logger log = LoggerFactory.getLogger(SomeService.class);
@Override
public void aService(ServiceAdmin sa) throws Exception {
log.debug(LoggerFactory.class.toString());
log.debug(log.getClass().getName());
log.debug("Setup Example");
SomeService.setDefault(Example.getInstance());
log.debug("Example finished");
}
日志:
2015-04-20 14:47:26.573 DEBUG [main] null:-1 - class org.slf4j.LoggerFactory
2015-04-20 14:47:26.574 DEBUG [main] null:-1 - ch.qos.logback.classic.Logger
2015-04-20 14:47:26.574 DEBUG [main] null:-1 - Setup Example
2015-04-20 14:47:26.575 DEBUG [main] null:-1 - SomeService finished
这是我的 logback.xml 中与此相关的部分 class
<logger name="com.bredband.nexusgw.services">
<level value="debug" />
<appender-ref ref="nexusservice" />
</logger>
<appender name="nexusservice"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>/var/log/nexus/nexusjgw/jgw/Service.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>/var/log/nexus/nexusjgw/jgw/Service.log.%i
</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>200MB</MaxFileSize>
</triggeringPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %F:%L - %m%n</Pattern>
</layout>
</appender>
有没有人以前看过这个并能指出正确的方向?
BR
斯特凡
-- 更新--
我将 %F 更改为 %C,但这并没有改变日志中的任何内容。然后我尝试在我的 ant 文件中的 javac header 中设置 debug = "on",现在它正在记录 class 名称和行号。
2015-04-21 08:28:55.910 DEBUG [main] Service.java:20 - class org.slf4j.LoggerFactory
2015-04-21 08:28:55.911 DEBUG [main] Service.java:21 - ch.qos.logback.classic.Logger
2015-04-21 08:28:55.911 DEBUG [main] Service.java:22 - Setup Example
2015-04-21 08:28:55.912 DEBUG [main] Service.java:24 - Example finished
虽然这行得通,但我以前没有更改过。随着时间的推移,这个项目中唯一发生变化的是添加了其他外部 jar。我不太确定在另一个外部 jar 中添加 duplicate/newer/older 版本的 slf4j 会如何影响日志记录,但是任何版本都应该查找 logback 文件?
-- 更新 --
在检查了 build.xml 文件的大量历史签入后,我发现我们之前实际上有 debug = "on" 并且这个问题实际上可能是由这个参数 beeing 设置为 "off".
感谢您的帮助。
BR
斯特凡
您应该首先确保使用调试信息编译您的应用程序。如果直接调用javac
,那么就是-g
命令行参数。然而,大多数构建工具(如 maven 或 ant)都有提供此参数的特定方式。
您可能还想将 %F
替换为 %C
,这应该可以在没有调试信息的情况下工作。
我的日志记录有问题,slf4j 不记录 message/stacktrace.
的文件名和行号代码:
private static Logger log = LoggerFactory.getLogger(SomeService.class);
@Override
public void aService(ServiceAdmin sa) throws Exception {
log.debug(LoggerFactory.class.toString());
log.debug(log.getClass().getName());
log.debug("Setup Example");
SomeService.setDefault(Example.getInstance());
log.debug("Example finished");
}
日志:
2015-04-20 14:47:26.573 DEBUG [main] null:-1 - class org.slf4j.LoggerFactory
2015-04-20 14:47:26.574 DEBUG [main] null:-1 - ch.qos.logback.classic.Logger
2015-04-20 14:47:26.574 DEBUG [main] null:-1 - Setup Example
2015-04-20 14:47:26.575 DEBUG [main] null:-1 - SomeService finished
这是我的 logback.xml 中与此相关的部分 class
<logger name="com.bredband.nexusgw.services">
<level value="debug" />
<appender-ref ref="nexusservice" />
</logger>
<appender name="nexusservice"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<File>/var/log/nexus/nexusjgw/jgw/Service.log</File>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<FileNamePattern>/var/log/nexus/nexusjgw/jgw/Service.log.%i
</FileNamePattern>
<MinIndex>1</MinIndex>
<MaxIndex>5</MaxIndex>
</rollingPolicy>
<triggeringPolicy
class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<MaxFileSize>200MB</MaxFileSize>
</triggeringPolicy>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %F:%L - %m%n</Pattern>
</layout>
</appender>
有没有人以前看过这个并能指出正确的方向?
BR 斯特凡
-- 更新--
我将 %F 更改为 %C,但这并没有改变日志中的任何内容。然后我尝试在我的 ant 文件中的 javac header 中设置 debug = "on",现在它正在记录 class 名称和行号。
2015-04-21 08:28:55.910 DEBUG [main] Service.java:20 - class org.slf4j.LoggerFactory
2015-04-21 08:28:55.911 DEBUG [main] Service.java:21 - ch.qos.logback.classic.Logger
2015-04-21 08:28:55.911 DEBUG [main] Service.java:22 - Setup Example
2015-04-21 08:28:55.912 DEBUG [main] Service.java:24 - Example finished
虽然这行得通,但我以前没有更改过。随着时间的推移,这个项目中唯一发生变化的是添加了其他外部 jar。我不太确定在另一个外部 jar 中添加 duplicate/newer/older 版本的 slf4j 会如何影响日志记录,但是任何版本都应该查找 logback 文件?
-- 更新 -- 在检查了 build.xml 文件的大量历史签入后,我发现我们之前实际上有 debug = "on" 并且这个问题实际上可能是由这个参数 beeing 设置为 "off".
感谢您的帮助。
BR 斯特凡
您应该首先确保使用调试信息编译您的应用程序。如果直接调用javac
,那么就是-g
命令行参数。然而,大多数构建工具(如 maven 或 ant)都有提供此参数的特定方式。
您可能还想将 %F
替换为 %C
,这应该可以在没有调试信息的情况下工作。