【问题标题】:LogBack RollingFileAppender Not Writing Log File (Though FileAppender works)LogBack RollingFileAppender 不写入日志文件(尽管 FileAppender 有效)
【发布时间】:2012-01-15 07:54:43
【问题描述】:

我正在尝试以编程方式配置 LogBack 的 RollingFileAppender (ch.qos.logback.core.rolling.RollingFileAppender),但它似乎不起作用。当我使用FileAppender 时,使用完全相同的配置(更少的策略/触发器)似乎一切正常,所以我猜这不是权限问题。我尝试注释掉所有策略配置,但这也无济于事。下面是我的示例代码,带有一些硬编码值。此外,从来没有任何错误。当我调试 LogBack 源代码时,我没有看到任何可能出错的地方。

任何提示都是赞赏的。我需要在没有配置文件的情况下让它工作,因为这在我的组织中是一个限制。我正在 MacBook 上对此进行测试。

Logger logger = (Logger)LoggerFactory.getLogger(applicationName); 
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
lc.reset(); 

RollingFileAppender<ILoggingEvent> fileAppender = 
    new RollingFileAppender<ILoggingEvent>(); 
fileAppender.setAppend(true); 
fileAppender.setFile("/Users/Jack/Desktop/logs/" + applicationName + ".log"); 
fileAppender.setContext(lc); 

SizeBasedTriggeringPolicy<ILoggingEvent> rPolicy = 
    new SizeBasedTriggeringPolicy<ILoggingEvent>("20MB"); 
fileAppender.setTriggeringPolicy(rPolicy); 
TimeBasedRollingPolicy<ILoggingEvent> tPolicy = 
    new TimeBasedRollingPolicy<ILoggingEvent>(); 
tPolicy.setFileNamePattern("/archive/" + applicationName + ".%d"); 
tPolicy.setMaxHistory(180); 
tPolicy.setParent(fileAppender); 
tPolicy.setContext(lc); 

PatternLayout pl = new PatternLayout(); 
pl.setPattern("%d %5p %t [%c:%L] %m%n)"); 
pl.setContext(lc); 
pl.start(); 

fileAppender.setLayout(pl); 
fileAppender.start(); 

logger.addAppender(fileAppender); 
logger.setLevel(Level.DEBUG); 

logger.debug("Test message");

【问题讨论】:

  • 我发现了这个问题。我忘了设置 RollingPolicy,所以 appender 永远不会启动。我认为它在无法启动时会引发异常,所以我忽略了这部分。
  • 上周设置 RollingPolicy 后运行良好,但突然停止。我目前正在寻找一种以编程方式启用调试模式以查看发生了什么的方法。这绝对不是权限问题,因为 FileAppender 仍然有效。另一个线程在这里可用。 stackoverflow.com/questions/8482359/…

标签: java file logging logback rollingfileappender


【解决方案1】:

关键问题如下:

  • RollingFileAppender 必须有 RollingPolicy
  • RollingFileAppender 需要 PatternLayoutEncoder 而不是 PatternEncoder
  • RollingPolicy 也必须启动,否则某些属性将为空

让我很难弄清楚的原因是我无法弄清楚如何让BasicStatusManager 打印出错误消息。我最终不得不使用以下代码将所有内容打印出来。

for(Status status : logger.getLoggerContext().getStatusManager().getCopyOfStatusList()){
    System.out.println(status.getOrigin() + " - " + status.getMessage());
}

上面的评论中提到了一个单独的线程,关于为什么 LogBack 日志消息没有打印出来。我还有一个关于 Nabble 的电子邮件线程。一旦我或其他人弄清楚这一点,就会在该线程中发布解决方案。

【讨论】:

  • 非常有用的答案。我只想补充一点,在启动RollingFileAppender 之前,您必须先将RollingPolicy 的父级设置为RollingFileAppender 实例,然后再将start() 设置为滚动策略。必须按这个顺序。
猜你喜欢
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多