【问题标题】:Why doesn't Slf4j/Logback log filename and row number为什么 Slf4j/Logback 不记录文件名和行号
【发布时间】:2024-01-14 12:22:01
【问题描述】:

我的日志记录有问题,slf4j 没有记录消息/堆栈跟踪的文件名和行号。

代码:

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 中与此类相关的部分

    <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 标头中设置 debug = "on",现在它正在记录类名和行号。

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 中添加重复/新/旧版本的 slf4j 会如何影响日志记录,但是任何版本都应该查找 logback 文件?

-- 更新-- 在检查了很多 build.xml 文件的历史签入后,我发现我们实际上之前有 debug = "on" 并且问题实际上可能是由这个参数设置为 "off" 引起的。

感谢您的帮助。

BR 斯蒂芬

【问题讨论】:

  • 如何提供重要信息...例如您的 logback 配置?
  • 你在 logback 配置文件中放了什么?
  • 乍一看没有什么明显的错误。您最近是否对应用程序的交付/打包/部署方式进行了任何更改?

标签: java logging slf4j logback


【解决方案1】:

您应该首先确保使用调试信息编译您的应用程序。如果直接调用javac,则为-g命令行参数。然而,大多数构建工具(如 maven 或 ant)都有特定的方式来提供此参数。

您可能还想将%F 替换为%C,这样在没有调试信息的情况下应该可以工作。

【讨论】:

  • 这解决了问题,但我想调试不应该是“on”才能工作,我们之前在 ant 中没有 debug =“on”。
  • 您只需要使用调试标志进行编译,您不需要在调试模式下运行应用程序。另见*.com/questions/218033/…
最近更新 更多