Java LogBack RollingFileAppender未写入日志文件(尽管FileAppender可以工作)

Java LogBack RollingFileAppender未写入日志文件(尽管FileAppender可以工作),java,file,logging,logback,rollingfileappender,Java,File,Logging,Logback,Rollingfileappender,我试图以编程方式配置LogBack的RollingFileAppender(ch.qos.LogBack.core.rolling.RollingFileAppender),但它似乎不起作用。当我使用FileAppender时,在完全相同的配置下(更少的策略/触发器),一切似乎都正常工作,所以我猜这不是权限问题。我尝试对所有策略配置进行注释,但也没有任何帮助。下面是我的示例代码,带有一些硬编码的值。而且,根本没有任何错误。当我调试LogBack源代码时,我没有看到任何可能出错的地方 任何暗示都是

我试图以编程方式配置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");
Logger=(Logger)LoggerFactory.getLogger(applicationName);
LoggerContext lc=(LoggerContext)LoggerFactory.getILoggerFactory();
lc.reset();
RollingFileAppender文件追加器=
新的RollingFileAppender();
setAppend(true);
fileAppender.setFile(“/Users/Jack/Desktop/logs/”+applicationName+”.log”);
setContext(lc);
SizeBasedTriggeringPolicy rPolicy=
新的SizeBasedTriggeringPolicy(“20MB”);
fileAppender.setTriggeringPolicy(rPolicy);
TimeBasedRollingPolicy tPolicy=
新的TimeBasedRollingPolicy();
tPolicy.setFileNamePattern(“/archive/”+applicationName+“%d”);
tPolicy.setMaxHistory(180);
tPolicy.setParent(fileAppender);
tPolicy.setContext(lc);
PatternLayout pl=新的PatternLayout();
pl.setPattern(“%d%5p%t[%c:%L]%m%n)”;
pl.setContext(lc);
pl.start();
setLayout(pl);
fileAppender.start();
logger.addAppender(fileAppender);
logger.setLevel(Level.DEBUG);
logger.debug(“测试消息”);

关键问题如下:

  • RollingFileAppender
    必须具有
    RollingPolicy
  • RollingFileAppender
    需要
    PatternLayoutEncoder
    而不是
    patterncoder
  • RollingPolicy
    也必须启动,否则某些属性将为空
让我很难理解的是,我无法理解如何使
BasicStatusManager
打印出错误消息。最后,我不得不使用以下代码来打印所有内容

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

正如上面的评论中提到的,有一个单独的线程正在运行,解释为什么不打印回日志消息。我还有一个关于Nabble的电子邮件帖子。我或其他人一发现问题,就会在该线程中发布解决方案。

我发现了问题所在。我忘记设置RollingPolicy,因此appender从未启动。我假设它无法启动时会抛出异常,所以我忽略了这一部分。上周设置了RollingPolicy后,它工作正常,突然停止。我目前正在寻找一种以编程方式启用调试模式的方法,以查看发生了什么。这绝对不是权限问题,因为FileAppender仍然有效。另一个线程在这里可用。非常有用的答案。我只想补充一点,在启动
RollingFileAppender
之前,必须首先将
RollingPolicy
的父对象设置为
RollingFileAppender
实例,然后设置滚动策略。必须按这个顺序。