已创建 Log4j2 文件但未写入日志
Log4j2 file created but not log written
我在springboot中使用了log4j2,日志文件已经创建但是日志没有写入文件。
log4j2.properties
name=PropertiesConfig
property.filename = /export/home/apps/logs
appenders = console, file
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.file.type = File
appender.file.name = LOGFILE
appender.file.fileName=${filename}/app-frontend.log
appender.file.layout.type=PatternLayout
appender.file.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
loggers=file
logger.file.name=guru.springframework.blog.log4j2properties
logger.file.level = debug
logger.file.appenderRefs = file
logger.file.appenderRef.file.ref = LOGFILE
rootLogger.level = debug
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
使用记录器的方法
private static Logger logger = LogManager.getLogger();
@RequestMapping(value="/check", method = RequestMethod.GET)
public String healthCheck() {
logger.debug("Health-check invoked");
return "Hey, I am fine";
}
上面我已经提到了我使用过的代码。还是找不到办法解决。日志甚至没有出现在控制台中。
在 spring-boot 中使用“log4j2.properties”进行配置有一定的限制。 Log4J 2 最初发布时不支持通过属性文件进行配置。从 Log4J 2.4 开始,再次添加了对属性文件的支持,但是 the documentation
中提到的 syntax.As 完全不同
As of version 2.4, Log4j now supports configuration via properties files. Note that the property syntax is NOT the same as the syntax used in Log4j 1.
As of version 2.6, this list of identifiers is no longer required as names are inferred upon first usage, however if you wish to use more complex identifies you must still use the list. If the list is present it will be used.
从 spring 引导版本 1.4.0 开始,使用的 log4j2 api 版本是 2.6.2。请注意,spring-boot 使用 slf4j api 来支持多个底层日志记录框架。在不处理 slf4j 绑定的类路径依赖性的情况下为 log4j2 使用基于属性的配置时似乎存在问题。
使用基于 XML(或 yaml/json)的配置来实现相同的目的并启用 log4j2 能够使用的所有功能是有意义的。
这是相同属性的基于 xml 的配置。
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">
<Properties>
<Property name="filename">export/home/apps/logs</Property>
</Properties>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
</Console>
<File name="LOGFILE"
fileName="${filename}/app-frontend.log">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Logger name="guru.springframework.blog.log4j2properties" level="debug">
<AppenderRef ref="LOGFILE"
level="debug" />
</Logger>
<Root level="debug">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
我尝试了多种方法,但 log4j2.properties 不起作用。我尝试了这么多版本的 spring-boot(最高 1.4.3)和 log4j2 组合并得出结论
- Log4j2 - 2.7 工作正常,但 spring-boot 直到版本 (1.4.x).
才随 log4j2-2.7 一起提供
- 不要去log4j2.properties使用springboot组合进行日志记录
- 最好将 log4j2.yml 与此组合一起使用,因为这些天极客对使用 xml 不感兴趣。
这是我如何实现的示例。
build.gradle
依赖项{
[
"org.springframework:spring-context",
"org.springframework.boot:spring-boot-starter-web",
"org.springframework.boot:spring-boot-starter-data-jpa",
"org.springframework.boot:spring-boot-starter-test",
"org.springframework:spring-context-support:4.1.6.RELEASE"
].each { dep -> compile(dep) {
exclude module: "spring-boot-starter-logging"
}
}
compile("org.springframework.boot:spring-boot-starter-log4j2")
compile ('org.apache.logging.log4j:log4j-api:2.6.2')
compile ('org.apache.logging.log4j:log4j-core:2.6.2')
compile ('org.apache.logging.log4j:log4j-slf4j-impl:2.6')
compile ('org.hibernate:hibernate-entitymanager:5.2.2.Final')
compile ('org.hibernate:hibernate-core:5.2.2.Final')
compile ('org.hibernate:hibernate-java8:5.2.2.Final')
compile 'mysql:mysql-connector-java:5.1.31'
compile 'org.apache.commons:commons-lang3:3.0'
compile 'org.freemarker:freemarker:2.3.20'
//compile 'org.apache.velocity:velocity:1.7'
compile 'commons-dbcp:commons-dbcp:1.4'
compile 'javax.servlet:jstl:1.2'
compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.8.5'
testCompile 'junit:junit:4.12'
providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper'
}
log4j2.yml
将此文件放入 src->main->resources
configuration:
name: Default
properties:
property:
- name: log-path
value: c:\logs
- name: archive
value: ${log-path}/archive
appenders:
Console:
PatternLayout:
pattern: '[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n'
name: Console-Appender
target: SYSTEM_OUT
File:
PatternLayout:
pattern: '[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n'
fileName: ${log-path}/amc.log
name: File-Appender
RollingFile:
DefaultRolloverStrategy:
max: '30'
PatternLayout:
pattern: '[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n'
Policies:
SizeBasedTriggeringPolicy:
size: 1 KB
fileName: ${log-path}/rollingfile.log
filePattern: ${archive}/rollingfile.log.%d{yyyy-MM-dd-hh-mm}.gz
name: RollingFile-Appender
loggers:
logger:
additivity: 'false'
appender-ref:
- level: info
ref: Console-Appender
- level: info
ref: File-Appender
- level: info
ref: RollingFile-Appender
level: debug
name: <your package>
root:
appender-ref:
ref: File-Appender
level: info
请将您的 logger.file.name 重命名为您自己的 属性。
Logger logger = LogManager.getLogger("My_logger");
在log4j2.xml中我们应该说出getLogger("String")
的名称来监听和写入文件。
<Logger name ="My_logger" level="debug">
终于得到解决方案:
让你的 logger.file.appenderRefs 成为 root logger
rootLogger.appenderRefs = file, stdout
rootLogger.appenderRef.file.ref = LOGFILE
rootLogger.level = debug
rootLogger.appenderRef.stdout.ref = STDOUT
这绝对有用!!但我无法限制文件大小。甚至超过了 log4j2 中默认文件最大大小 (10M) 的限制。
就我而言,我必须添加下一行:
rootLogger.appenderRef.file.ref = 日志文件
还有评论存在:
appender.file.fileName
////////////////////////////////////////// ///
配置 Log4j2.xml
////////////////////////////////////////////////////
property.filename = logs
appenders = console, file
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.file.type = File
appender.file.name = LOGFILE
appender.file.fileName = ${filename}/application.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} -%msg%n
loggers = file
logger.file.name = guru.springframework.blog.log4j2properties
logger.file.level = debug
logger.file.appenderRefs = file
logger.file.appenderRef.file.ref = LOGFILE
rootLogger.level = debug
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT
rootLogger.appenderRef.file.ref = LOGFILE
////////////////////////////////////////// ///
配置 Log4j2.xml(结束)
////////////////////////////////////////////////////
对我有用。
对不起我的英语。
问候
我在springboot中使用了log4j2,日志文件已经创建但是日志没有写入文件。
log4j2.properties
name=PropertiesConfig
property.filename = /export/home/apps/logs
appenders = console, file
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.file.type = File
appender.file.name = LOGFILE
appender.file.fileName=${filename}/app-frontend.log
appender.file.layout.type=PatternLayout
appender.file.layout.pattern=[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n
loggers=file
logger.file.name=guru.springframework.blog.log4j2properties
logger.file.level = debug
logger.file.appenderRefs = file
logger.file.appenderRef.file.ref = LOGFILE
rootLogger.level = debug
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
使用记录器的方法
private static Logger logger = LogManager.getLogger();
@RequestMapping(value="/check", method = RequestMethod.GET)
public String healthCheck() {
logger.debug("Health-check invoked");
return "Hey, I am fine";
}
上面我已经提到了我使用过的代码。还是找不到办法解决。日志甚至没有出现在控制台中。
在 spring-boot 中使用“log4j2.properties”进行配置有一定的限制。 Log4J 2 最初发布时不支持通过属性文件进行配置。从 Log4J 2.4 开始,再次添加了对属性文件的支持,但是 the documentation
中提到的 syntax.As 完全不同As of version 2.4, Log4j now supports configuration via properties files. Note that the property syntax is NOT the same as the syntax used in Log4j 1.
As of version 2.6, this list of identifiers is no longer required as names are inferred upon first usage, however if you wish to use more complex identifies you must still use the list. If the list is present it will be used.
从 spring 引导版本 1.4.0 开始,使用的 log4j2 api 版本是 2.6.2。请注意,spring-boot 使用 slf4j api 来支持多个底层日志记录框架。在不处理 slf4j 绑定的类路径依赖性的情况下为 log4j2 使用基于属性的配置时似乎存在问题。
使用基于 XML(或 yaml/json)的配置来实现相同的目的并启用 log4j2 能够使用的所有功能是有意义的。
这是相同属性的基于 xml 的配置。
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="60">
<Properties>
<Property name="filename">export/home/apps/logs</Property>
</Properties>
<Appenders>
<Console name="STDOUT" target="SYSTEM_OUT">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
</Console>
<File name="LOGFILE"
fileName="${filename}/app-frontend.log">
<PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
</File>
</Appenders>
<Loggers>
<Logger name="guru.springframework.blog.log4j2properties" level="debug">
<AppenderRef ref="LOGFILE"
level="debug" />
</Logger>
<Root level="debug">
<AppenderRef ref="STDOUT"/>
</Root>
</Loggers>
我尝试了多种方法,但 log4j2.properties 不起作用。我尝试了这么多版本的 spring-boot(最高 1.4.3)和 log4j2 组合并得出结论
- Log4j2 - 2.7 工作正常,但 spring-boot 直到版本 (1.4.x). 才随 log4j2-2.7 一起提供
- 不要去log4j2.properties使用springboot组合进行日志记录
- 最好将 log4j2.yml 与此组合一起使用,因为这些天极客对使用 xml 不感兴趣。
这是我如何实现的示例。
build.gradle
依赖项{
[
"org.springframework:spring-context",
"org.springframework.boot:spring-boot-starter-web",
"org.springframework.boot:spring-boot-starter-data-jpa",
"org.springframework.boot:spring-boot-starter-test",
"org.springframework:spring-context-support:4.1.6.RELEASE"
].each { dep -> compile(dep) {
exclude module: "spring-boot-starter-logging"
}
}
compile("org.springframework.boot:spring-boot-starter-log4j2")
compile ('org.apache.logging.log4j:log4j-api:2.6.2')
compile ('org.apache.logging.log4j:log4j-core:2.6.2')
compile ('org.apache.logging.log4j:log4j-slf4j-impl:2.6')
compile ('org.hibernate:hibernate-entitymanager:5.2.2.Final')
compile ('org.hibernate:hibernate-core:5.2.2.Final')
compile ('org.hibernate:hibernate-java8:5.2.2.Final')
compile 'mysql:mysql-connector-java:5.1.31'
compile 'org.apache.commons:commons-lang3:3.0'
compile 'org.freemarker:freemarker:2.3.20'
//compile 'org.apache.velocity:velocity:1.7'
compile 'commons-dbcp:commons-dbcp:1.4'
compile 'javax.servlet:jstl:1.2'
compile 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.8.5'
testCompile 'junit:junit:4.12'
providedRuntime 'org.apache.tomcat.embed:tomcat-embed-jasper'
}
log4j2.yml
将此文件放入 src->main->resources
configuration:
name: Default
properties:
property:
- name: log-path
value: c:\logs
- name: archive
value: ${log-path}/archive
appenders:
Console:
PatternLayout:
pattern: '[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n'
name: Console-Appender
target: SYSTEM_OUT
File:
PatternLayout:
pattern: '[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n'
fileName: ${log-path}/amc.log
name: File-Appender
RollingFile:
DefaultRolloverStrategy:
max: '30'
PatternLayout:
pattern: '[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n'
Policies:
SizeBasedTriggeringPolicy:
size: 1 KB
fileName: ${log-path}/rollingfile.log
filePattern: ${archive}/rollingfile.log.%d{yyyy-MM-dd-hh-mm}.gz
name: RollingFile-Appender
loggers:
logger:
additivity: 'false'
appender-ref:
- level: info
ref: Console-Appender
- level: info
ref: File-Appender
- level: info
ref: RollingFile-Appender
level: debug
name: <your package>
root:
appender-ref:
ref: File-Appender
level: info
请将您的 logger.file.name 重命名为您自己的 属性。
Logger logger = LogManager.getLogger("My_logger");
在log4j2.xml中我们应该说出getLogger("String")
的名称来监听和写入文件。
<Logger name ="My_logger" level="debug">
终于得到解决方案: 让你的 logger.file.appenderRefs 成为 root logger
rootLogger.appenderRefs = file, stdout
rootLogger.appenderRef.file.ref = LOGFILE
rootLogger.level = debug
rootLogger.appenderRef.stdout.ref = STDOUT
这绝对有用!!但我无法限制文件大小。甚至超过了 log4j2 中默认文件最大大小 (10M) 的限制。
就我而言,我必须添加下一行:
rootLogger.appenderRef.file.ref = 日志文件
还有评论存在: appender.file.fileName
////////////////////////////////////////// /// 配置 Log4j2.xml ////////////////////////////////////////////////////
property.filename = logs
appenders = console, file
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.file.type = File
appender.file.name = LOGFILE
appender.file.fileName = ${filename}/application.log
appender.file.layout.type = PatternLayout
appender.file.layout.pattern = [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} -%msg%n
loggers = file
logger.file.name = guru.springframework.blog.log4j2properties
logger.file.level = debug
logger.file.appenderRefs = file
logger.file.appenderRef.file.ref = LOGFILE
rootLogger.level = debug
rootLogger.appenderRefs = stdout
rootLogger.appenderRef.stdout.ref = STDOUT
rootLogger.appenderRef.file.ref = LOGFILE
////////////////////////////////////////// /// 配置 Log4j2.xml(结束) ////////////////////////////////////////////////////
对我有用。
对不起我的英语。 问候