【问题标题】:log4j not logging the details coming from some java classeslog4j 没有记录来自某些 java 类的详细信息
【发布时间】:2015-06-01 00:18:18
【问题描述】:

我正在尝试根据输入参数将项目中的数据记录到文件中。我的项目有 5 个类,其中 3 个包含日志消息。

我使用以下代码来配置 log4j。

public static void configureLog4j(String log4j,String logs,String timeStamp) throws IOException {
    PropertyConfigurator.configure(log4j);      
    FileAppender fileapp = (FileAppender) Logger.getRootLogger().getAppender("FILE");
    if(fileapp != null)
        logger.removeAppender(fileapp);
    String filename = logs + "/test_" + info + "_" + timeStamp;
    fileapp.setFile(filename);
    fileapp.setLayout(new PatternLayout("%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n"));
    fileapp.setWriter(new FileWriter(new File(fileapp.getFile())));
    Logger.getRootLogger().addAppender(fileapp);
}

info 代表用户名。现在,一旦我在应用程序的开头配置它,只有两个类在文件中写入日志,第三个包含发送和接收数据的代码的文件不会将日志写入日志文件。有什么我在这里想念的吗。

请帮我解决这个问题。

【问题讨论】:

  • 如果此代码适用于 2 个以上的类,则错误可能来自第三类。给我们第三个的代码,你如何调用你的记录器。还要使用 debug 或 println 检查您是否到达了记录数据的行

标签: java logging log4j


【解决方案1】:

在您有机会配置记录器之前,第三类可能已经在记录。这就是我切换到 logback 的原因之一:它具有更强大(并且文档更完善)的配置文件格式。

上面的代码也包含一个问题:

if(fileapp != null)
    logger.removeAppender(fileapp);

logger 没有在任何地方定义,fileapp 必须不为空,否则您以后会得到 NPE。

【讨论】:

  • logger 是一个静态变量,之前在类中创建。我正在使用相同的记录器来删除附加程序。我在另一个项目中使用了类似的方法,所有日志都运行良好。
  • 但是现在您已经为根记录器配置了两个附加程序。 logger.removeAppender() 不会做任何事情,除非你为它配置了另一个 appender。
  • 在执行上述代码之前,您如何确保没有其他人使用记录器?
【解决方案2】:

请确保在配置之前您的第三类不应记录

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    相关资源
    最近更新 更多