log4J2 日志没有写入文件
log4J2 logs are not written to the file
我想将日志存储在 2 个不同的文件中。一方面,我的日志没有写入文件,而是创建了文件,另一方面,控制台中仅显示 "error" 和 "fatal" 级别。
属性 文件:
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");
我做错了什么?
只需粗略地浏览一下就可以看到一些事情。我将使用 #
评论
穿插在线评论
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
您定义的属性有几个问题。我将尝试一一解释它们中的每一个。但是,您应该返回参考 log4j2 manual regarding properties configuration and do your own research 以查找使用 log4j2 属性的示例或有关 log4j2 属性的其他问题,以在您遇到困难时帮助您,并将此信息包含在您的问题中。
您说控制台上只显示错误和致命级别。这是因为您尚未定义根记录器。作为 log4j2 手册 states:
Every configuration must have a root logger. If one is not configured
the default root LoggerConfig, which has a level of ERROR and has a
Console appender attached, will be used.
由于默认情况下 additivity 是 true
并且您没有禁用它,所有日志事件都将发送到默认根记录器,如上所述。结果是只有那些错误或致命的事件被记录到控制台,因为默认根记录器的级别是 ERROR
现在,关于您的属性配置,问题在于:
您的文件附加程序具有无效属性 "MaxBackupIndex"、"MaxFileSize"。以下两行不适用于文件附加程序:
appender.user.MaxFileSize=5120KB
appender.user.MaxBackupIndex=10
也许您想要一个滚动文件附加程序?你的问题不是很清楚所以我通过在每行的前面添加'#'来注释掉这些。
如果您使用的是 log4j2 版本 2.6 或更高版本,那么您不需要这些行:
appenders = console, user, system
Loggers = file
您没有指定您使用的是哪个版本,所以我假设您使用的是最新版本,在这种情况下不需要这些行。我也评论了这些行。
您的两个附加程序都使用相同的名称 "LOGFILE"。我将用户附加程序名称更改为 "userLog",将系统附加程序名称更改为 "systemLog"。 (请参阅答案后面的完整属性)
您只定义了一个记录器,它的名称与您用来检索它的名称不匹配。这就是为什么您的所有日志事件都转到默认根记录器的原因。您有 logger.file.name = de.pares.int_plan
但 de.pares.int_plan
不是您在 java 代码中用于获取记录器的名称之一。您使用了 user
和 system
。我在属性中更正了这些(请参阅答案后面的完整属性)。
您在两个文件附加程序的模式中 c{1}
之前缺少“%”。
根据 log4j2 manual.
[= 中的示例,您的记录器定义 logger.file.appenderRefs = file
中有一行似乎没有必要90=]
将所有这些更正放在一起,我得到了以下属性:
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 个不同的文件中。一方面,我的日志没有写入文件,而是创建了文件,另一方面,控制台中仅显示 "error" 和 "fatal" 级别。 属性 文件:
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");
我做错了什么?
只需粗略地浏览一下就可以看到一些事情。我将使用 #
评论
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
您定义的属性有几个问题。我将尝试一一解释它们中的每一个。但是,您应该返回参考 log4j2 manual regarding properties configuration and do your own research 以查找使用 log4j2 属性的示例或有关 log4j2 属性的其他问题,以在您遇到困难时帮助您,并将此信息包含在您的问题中。
您说控制台上只显示错误和致命级别。这是因为您尚未定义根记录器。作为 log4j2 手册 states:
Every configuration must have a root logger. If one is not configured the default root LoggerConfig, which has a level of ERROR and has a Console appender attached, will be used.
由于默认情况下 additivity 是 true
并且您没有禁用它,所有日志事件都将发送到默认根记录器,如上所述。结果是只有那些错误或致命的事件被记录到控制台,因为默认根记录器的级别是 ERROR
现在,关于您的属性配置,问题在于:
您的文件附加程序具有无效属性 "MaxBackupIndex"、"MaxFileSize"。以下两行不适用于文件附加程序:
appender.user.MaxFileSize=5120KB
appender.user.MaxBackupIndex=10
也许您想要一个滚动文件附加程序?你的问题不是很清楚所以我通过在每行的前面添加'#'来注释掉这些。
如果您使用的是 log4j2 版本 2.6 或更高版本,那么您不需要这些行:
appenders = console, user, system
Loggers = file
您没有指定您使用的是哪个版本,所以我假设您使用的是最新版本,在这种情况下不需要这些行。我也评论了这些行。
您的两个附加程序都使用相同的名称 "LOGFILE"。我将用户附加程序名称更改为 "userLog",将系统附加程序名称更改为 "systemLog"。 (请参阅答案后面的完整属性)
您只定义了一个记录器,它的名称与您用来检索它的名称不匹配。这就是为什么您的所有日志事件都转到默认根记录器的原因。您有
logger.file.name = de.pares.int_plan
但de.pares.int_plan
不是您在 java 代码中用于获取记录器的名称之一。您使用了user
和system
。我在属性中更正了这些(请参阅答案后面的完整属性)。您在两个文件附加程序的模式中
c{1}
之前缺少“%”。根据 log4j2 manual.
[= 中的示例,您的记录器定义logger.file.appenderRefs = file
中有一行似乎没有必要90=]
将所有这些更正放在一起,我得到了以下属性:
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 的部分。
希望对您有所帮助!