使用log4j library 1.1.4和slf4j-api 1.7.25在我的应用程序中进行日志记录可以很好地工作。
但是在将log4j库从1.1.4版本更新到1.1.5(或更高版本)之后,日志文件只会停止创建,不会产生任何异常或警告。即使是1.1.5版本也相当老,所以我宁愿使用更新的版本。配置的工作方式一定发生了变化,但我找不到是什么。
这段简单的代码将在Log4J1.1.4中创建滚动日志文件,但不会生成更新版本的日志文件。少了什么?
Maven依赖项包括:
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.1.4</version>
</dependency>
</dependencies>
代码:
package com.scratch.mylogtest; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.encoder.PatternLayoutEncoder; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.rolling.*; import static java.nio.charset.StandardCharsets.UTF_8; /** * A test of log file configuration and roll-over. It should simply create a log file then write enough data to it to cause the * file to roll-over to a new log file. */ public class LogbackTest1 { public static void main(String[] args) { final String LOG_LAYOUT = "%-5level \\(%logger{0}\\) [%date]: %m%n"; final org.slf4j.Logger rootLogger = org.slf4j.LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME); rootLogger.info("Test of root logger prior to initialization"); ((ch.qos.logback.classic.Logger) rootLogger).setLevel(ch.qos.logback.classic.Level.DEBUG); //set up the logging SLF4JBridgeHandler.removeHandlersForRootLogger(); //remove normal JUL logging... SLF4JBridgeHandler.install(); //...and route JUL logging to SLF4J LoggerContext loggerContext = ((ch.qos.logback.classic.Logger) rootLogger).getLoggerContext(); //appender RollingFileAppender rollingFileAppender = new RollingFileAppender(); rollingFileAppender.setContext(loggerContext); rollingFileAppender.setFile("C:\\ProgramData\\LogTest\\log-test.log"); //encoder PatternLayoutEncoder patternLayoutEncoder = new PatternLayoutEncoder(); patternLayoutEncoder.setContext(loggerContext); patternLayoutEncoder.setCharset(UTF_8); patternLayoutEncoder.setPattern(LOG_LAYOUT); patternLayoutEncoder.start(); //rolling policy FixedWindowRollingPolicy fixedWindowRollingPolicy = new FixedWindowRollingPolicy(); fixedWindowRollingPolicy.setContext(loggerContext); fixedWindowRollingPolicy.setParent(rollingFileAppender); fixedWindowRollingPolicy.setFileNamePattern("C:\\ProgramData\\LogTest\\log-test.log.%i"); fixedWindowRollingPolicy.setMaxIndex(3); fixedWindowRollingPolicy.start(); //triggering policy SizeBasedTriggeringPolicy triggeringPolicy = new SizeBasedTriggeringPolicy(); triggeringPolicy.setMaxFileSize("100KB"); //start appender rollingFileAppender.setEncoder(patternLayoutEncoder); rollingFileAppender.setRollingPolicy(fixedWindowRollingPolicy); rollingFileAppender.setTriggeringPolicy(triggeringPolicy); rollingFileAppender.start(); //add appender ((ch.qos.logback.classic.Logger) rootLogger).addAppender(rollingFileAppender); final org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(LogbackTest1.class); // Write some data into the logs. Write enough data that it should cause the log file to roll-over to a new file logger.info("Starting"); int logTestLines = 5000; for (int i = logTestLines; i > 0; i--) { logger.info("Log test line: " + i); } logger.info("Exiting"); } }
找到解决办法了!
在logback版本1.1.5中启动时,需要调用SizeBasedTriggeringPolicy.start()
。在1.1.3版本中,这是不必要的。
从1.1.9版本开始,设置最大文件大小的方法也会发生变化,因此代码应该如下所示:
SizeBasedTriggeringPolicy<ILoggingEvent> triggeringPolicy = new SizeBasedTriggeringPolicy<>();
triggeringPolicy.setMaxFileSize(FileSize.valueOf("100KB"));
triggeringPolicy.start();
我用调试的方法发现了问题
StatusPrinter.print(loggerContext);
打印此信息的:
15:47:22,788 |-WARN in ch.qos.logback.core.rolling.RollingFileAppender[null] - TriggeringPolicy has not started. RollingFileAppender will not start
但如果不使用statusprinter
,则不会打印任何警告。
我不清楚java程序是如何知道xml文件的位置的。我想这就是问题所在。这就是我在代码中的设置, 任何帮助都是徒劳的。谢了。
我使用log4j进行日志记录,并且使用.log格式的所有日志文件,其结构简单,如; log4j.rootcategory=info,C,R log4j.appender.c=org.apache.log4j.consoleappender log4j.appender.c.layout=org.apache.log4j.patternlayout log4j.appender.r.layout=o
刚开始写作本书时Kubernetes1.6刚刚发布,随后Kubernetes基本以每3个月发布一个版本的速度不断迭代,为了追踪不同版本的新特性,我们有必要在此记录一下。 每个Kubernetes版本的详细更新日志请参考:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md 发布记录 2017年6月29日,Kubernet
我试图在springboot中配置log4j2。我已经从pom.xml.中删除(排除)了登录依赖项,我正在名为log4j2.xml的资源文件夹下使用此xml 这是我的控制器类。 我在这里错过了什么吗?我尝试使用application.properties也使用最新版本的Log4j2.But仍然没有created.When我运行应用程序,我看不到任何日志文件在xml中指定的路径上动态创建。
问题内容: 我想在我的Java项目中使用Log4j,我应该在配置文件中提供该配置,该配置文件每天晚上12:00将生成一个新文件,并且文件名应类似于 -output- log-of-MyProjectName-HostName-2013-Dec-10。 txt 名称)。我的配置文件就是这样- 它每天都在创建新文件,但在文件名后附加日期。请帮我。提前致谢。 问题答案: 我认为您想要DailyRolli
问题内容: 我正在尝试配置log4j以将消息记录到文件中。现在,确实使用我提供的名称创建了该文件,但是日志未写入该文件。我的代码: 我文件的内容: 运行此命令时,将在控制台中获得以下输出: 该文件确实在我的主目录中创建。但是它是空的。 有什么想法我做错了吗?我正在使用log4j 1.2.17版。 问题答案: 输出似乎是Java标准日志记录框架(JUL)发出的默认格式。 因此,有两种可能性(想到):