log4J2日志未写入文件

时间:2019-02-11 11:19:02

标签: java logging log4j2 properties-file

我想将日志存储在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");

我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

您说控制台上仅显示错误和致命级别。这是由于您尚未定义根记录器。如log4j2手册states

  

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

由于additivity默认为true,并且您尚未禁用它,因此如上所述,所有日志事件都将发送到默认的根记录器。结果是,由于默认的根记录器级别为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的部分。

希望这会有所帮助!

答案 1 :(得分:0)

事物的结合在此仅凭草率地通过即可看到。我将使用#条评论在行中插入评论

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