【问题标题】:log4J2 logs are not written to the filelog4J2 日志未写入文件
【发布时间】:2019-07-04 21:08:00
【问题描述】:

我想将日志存储在 2 个不同的文件中。一方面,我的日志没有写入文件,而是创建了文件,另一方面,控制台中仅显示“错误”和“致命”级别。 属性文件:

name=PropertiesConfig
property.filename = logs
appenders = console, user, system

appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n



appender.user.type = File
appender.user.name = LOGFILE
appender.user.fileName=${filename}/user.log
appender.user.layout.type=PatternLayout
appender.user.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] c{1} - %msg%n
appender.user.MaxFileSize=5120KB
appender.user.MaxBackupIndex=10


appender.system.type = File
appender.system.name = LOGFILE
appender.system.fileName=${filename}/system.log
appender.system.layout.type=PatternLayout
appender.system.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] c{1} - %msg%n
appender.system.MaxFileSize=5120KB
appender.system.MaxBackupIndex=10




Loggers = file
logger.file.name = de.pares.int_plan
logger.file.level = All
logger.file.appenderRefs = file
logger.file.appenderRef.file.ref  = LOGFILE

这就是我创建记录器的方式:

private static Logger userLog = LogManager.getLogger("user");
private static Logger systemLog = LogManager.getLogger("system");

像这样使用它们:

userLog.debug("UserLogger: This is a debug message");
userLog.info("UserLogger: This is an info message");
userLog.warn("UserLogger: This is a warn message");
userLog.error("UserLogger: This is an error message");
userLog.fatal("UserLogger: This is a fatal message");

systemLog.debug("SystemLogger: This is a debug message");
systemLog.info("SystemLogger: This is an info message");
systemLog.warn("SystemLogger: This is a warn message");
systemLog.error("SystemLogger: This is an error message");
systemLog.fatal("SystemLogger: This is a fatal message");

我做错了什么?

【问题讨论】:

    标签: java logging log4j2 properties-file


    【解决方案1】:

    您定义的属性存在几个问题。我将尝试一一解释它们。但是,您应该返回log4j2 manual regarding properties configuration 并自己做research 以查找使用 log4j2 属性的示例或有关 log4j2 属性的其他问题,以便在您遇到困难时为您提供帮助,并将此信息包含在您的问题中。

    您说控制台上只显示错误和致命级别。这是因为您没有定义根记录器。如log4j2手册states

    每个配置都必须有一个根记录器。如果没有配置 默认的根 LoggerConfig,其级别为 ERROR,并具有 附加的控制台附加程序,将被使用。

    由于默认情况下additivitytrue,并且您没有禁用它,所有日志事件都将发送到默认的根记录器,如上所述。结果是只有那些错误或致命的事件被记录到控制台,因为默认根记录器的级别是ERROR

    现在,关于您的属性配置,这里有问题:

    1. 您的文件附加程序具有无效的属性“MaxBackupIndex”、“MaxFileSize”。以下两行不适用于文件追加器:

      appender.user.MaxFileSize=5120KB

      appender.user.MaxBackupIndex=10

      也许您想要一个滚动文件附加程序?你的问题不是很清楚,所以我通过在每行前面添加“#”来注释掉这些内容。

    2. 如果您使用的是 log4j2 2.6 或更高版本,则不需要这些行:

      appenders = console, user, system

      Loggers = file

      您没有指定您使用的版本,所以我假设您使用的是最新版本,在这种情况下不需要这些行。我也评论了这些行。

    3. 您的两个附加程序都使用相同的名称“LOGFILE”。我将用户附加程序名称更改为“userLog”,将系统附加程序名称更改为“systemLog”。 (请参阅答案后面的完整属性)

    4. 您只定义了一个记录器,其名称与您用于检索它的名称不匹配。这就是为什么您的所有日志事件都转到默认的根记录器的原因。您有logger.file.name = de.pares.int_plan,但de.pares.int_plan 不是您在Java 代码中用于获取记录器的名称之一。您使用了usersystem。我在属性中更正了这些(请参阅答案后面的完整属性)。

    5. 您在两个文件附加程序的模式中都缺少c{1} 之前的“%”。

    6. 根据log4j2 manual 中的示例,您的记录器定义logger.file.appenderRefs = file 中有一个额外的行似乎没有必要。

    将所有这些更正放在一起,我得出了以下属性:

    name=PropertiesConfig
    property.filename = logs
    #Removed the following line since latest log4j2 does not need it
    #appenders = console, user, system
    
    appender.console.type = Console
    appender.console.name = STDOUT
    appender.console.layout.type = PatternLayout
    appender.console.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
    
    appender.user.type = File
    appender.user.name = userLog
    appender.user.fileName=${filename}/user.log
    appender.user.layout.type=PatternLayout
    appender.user.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
    #Removed attributes that do not apply to file appender
    #appender.user.MaxFileSize=5120KB
    #appender.user.MaxBackupIndex=10
    
    appender.system.type = File
    appender.system.name = systemLog
    appender.system.fileName=${filename}/system.log
    appender.system.layout.type=PatternLayout
    appender.system.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
    #Removed attributes that do not apply to file appender
    #appender.system.MaxFileSize=5120KB
    #appender.system.MaxBackupIndex=10
    
    #Removed the following line since latest log4j2 does not need it
    #Loggers = file
    logger.userFile.name = user
    logger.userFile.level = All
    logger.userFile.appenderRef.user.ref  = userLog
    
    logger.systemFile.name = system
    logger.systemFile.level = All
    logger.systemFile.appenderRef.system.ref = systemLog
    
    #Adding the following commented lines for reference - this is how you define the root logger in the properties.
    #rootLogger.level = info
    #rootLogger.appenderRef.console.ref = STDOUT
    

    为了测试这个配置,我使用了以下代码:

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    
    public class SomeClass {
    
        private static Logger userLog = LogManager.getLogger("user");
        private static Logger systemLog = LogManager.getLogger("system");
    
        public static void main(String[] args){
    
            systemLog.debug("This is the top of main method");
            if(userLog.isDebugEnabled())
                userLog.debug("This is some debug!");
            userLog.info("Here's some info!");
            userLog.error("Some error happened!");
            systemLog.info("This is the end of main method");
            systemLog.error("woops an error occurred");
        }
    }
    

    结果是两个日志文件:

    system.log

    [DEBUG] 2019-02-16 18:04:04.980 [main] system - This is the top of main method
    [INFO ] 2019-02-16 18:04:04.980 [main] system - This is the end of main method
    [ERROR] 2019-02-16 18:04:04.980 [main] system - woops an error occurred
    

    user.log

    [DEBUG] 2019-02-16 18:04:04.980 [main] user - This is some debug!
    [INFO ] 2019-02-16 18:04:04.980 [main] user - Here's some info!
    [ERROR] 2019-02-16 18:04:04.980 [main] user - Some error happened!
    

    和控制台输出:

    [DEBUG] 2019-02-16 18:04:04.980 [main] system - This is the top of main method
    [DEBUG] 2019-02-16 18:04:04.980 [main] user - This is some debug!
    [INFO ] 2019-02-16 18:04:04.980 [main] user - Here's some info!
    [ERROR] 2019-02-16 18:04:04.980 [main] user - Some error happened!
    [INFO ] 2019-02-16 18:04:04.980 [main] system - This is the end of main method
    [ERROR] 2019-02-16 18:04:04.980 [main] system - woops an error occurred
    

    要全面了解控制台输出,请参阅 log4j2 手册 - 标题为 Additivity 的部分。

    希望这会有所帮助!

    【讨论】:

    • 是的,这很有帮助!谢谢!
    【解决方案2】:

    只需粗略地通过即可看到几件事。我将使用# cmets 将 cmets 穿插在行内

    appender.user.type = File
    appender.user.name = LOGFILE
    #                    ^^^^^^^ This must be distinct - it conflicts with appender.system
    appender.user.fileName=${filename}/user.log
    appender.user.layout.type=PatternLayout
    appender.user.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] c{1} - %msg%n
    #                                                         missing % here ^^^^
    appender.user.MaxFileSize=5120KB
    appender.user.MaxBackupIndex=10
    
    appender.system.type = File
    appender.system.name = LOGFILE
    #                      ^^^^^^^ This must be distinct - it conflicts with appender.user
    appender.system.fileName=${filename}/system.log
    appender.system.layout.type=PatternLayout
    appender.system.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] c{1} - %msg%n
    #                                                           missing % here ^^^^
    appender.system.MaxFileSize=5120KB
    appender.system.MaxBackupIndex=10
    

    【讨论】:

    • 好的,谢谢...不幸的是,它没有成功。我已经尝试了一些其他设置,但没有成功
    • 我唯一能建议的另一件事是打开-Dlog4j2.debug。里面可能有一些可以提供帮助的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2018-06-28
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多