当前位置: 首页 > 知识库问答 >
问题:

将log4j版本更新到1.1.5后未创建日志文件

穆鸿波
2023-03-14

使用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");
  }

}

共有1个答案

雷骁
2023-03-14

找到解决办法了!

在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)发出的默认格式。 因此,有两种可能性(想到):