无法从 YAML 文件自动配置 log4j 2
Trouble auto-configuring log4j 2 from YAML file
这是我的申请代码。当它是 运行 时,只记录错误字符串。我可以看到复制到 build/resources 文件夹中的 yaml 文件。我无法诊断为什么自动配置不起作用,即使我已经遵循命名约定并将 yaml 文件放在正确的位置。
public class App {
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.trace("Entering application.");
logger.error("Some error");
logger.trace("Exiting application.");
}
}
我的 build.gradle 看起来像这样。
plugins {
id 'java'
id 'application'
id 'groovy'
}
repositories {
jcenter()
}
dependencies {
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.13.1'
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.13.1'
implementation 'com.google.guava:guava:28.0-jre'
testImplementation 'org.codehaus.groovy:groovy-all:2.5.7'
testImplementation 'org.spockframework:spock-core:1.3-groovy-2.5'
testImplementation 'junit:junit:4.12'
}
application {
mainClassName = 'myapp.App'
}
我已将 log4j2.yaml 文件放在 src/main/resources 下。
Configuration:
status: warn
name: YAMLConfigTest
properties:
property:
name: filename
value: target/test-yaml.log
thresholdFilter:
level: debug
appenders:
Console:
name: STDOUT
PatternLayout:
Pattern: "%m%n"
File:
name: File
fileName: ${filename}
PatternLayout:
Pattern: "%d %p %C{1.} [%t] %m%n"
Filters:
ThresholdFilter:
level: error
Loggers:
logger:
-
name: org.apache.logging.log4j.test1
level: debug
additivity: false
ThreadContextMapFilter:
KeyValuePair:
key: test
value: 123
AppenderRef:
ref: STDOUT
-
name: org.apache.logging.log4j.test2
level: debug
additivity: false
AppenderRef:
ref: File
Root:
level: debug
AppenderRef:
ref: STDOUT
更新
我重新阅读了文档,他们提到 JSON 和 YAML 配置文件需要额外的依赖项才能工作。我错过了它,因为我只看了开头的段落和示例文件。
将 Jackson Core 和 Databind 依赖项添加到我的 build.gradle 允许配置生效。
// for JSON and YAML configs
compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.10.3'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.10.3'
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.13.1'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.13.1'
您的记录器是在调试级别配置的。第一个和第三个日志记录调用处于跟踪级别。 Trace 比 debug 粒度更细,因此不会记录这些。这只留下您的错误日志事件。由于默认情况下您的应用程序使用的 Logger 的名称将是 "App" 它将使用根记录器将其路由到控制台。
这是我的申请代码。当它是 运行 时,只记录错误字符串。我可以看到复制到 build/resources 文件夹中的 yaml 文件。我无法诊断为什么自动配置不起作用,即使我已经遵循命名约定并将 yaml 文件放在正确的位置。
public class App {
private static final Logger logger = LogManager.getLogger();
public static void main(String[] args) {
logger.trace("Entering application.");
logger.error("Some error");
logger.trace("Exiting application.");
}
}
我的 build.gradle 看起来像这样。
plugins {
id 'java'
id 'application'
id 'groovy'
}
repositories {
jcenter()
}
dependencies {
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.13.1'
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.13.1'
implementation 'com.google.guava:guava:28.0-jre'
testImplementation 'org.codehaus.groovy:groovy-all:2.5.7'
testImplementation 'org.spockframework:spock-core:1.3-groovy-2.5'
testImplementation 'junit:junit:4.12'
}
application {
mainClassName = 'myapp.App'
}
我已将 log4j2.yaml 文件放在 src/main/resources 下。
Configuration:
status: warn
name: YAMLConfigTest
properties:
property:
name: filename
value: target/test-yaml.log
thresholdFilter:
level: debug
appenders:
Console:
name: STDOUT
PatternLayout:
Pattern: "%m%n"
File:
name: File
fileName: ${filename}
PatternLayout:
Pattern: "%d %p %C{1.} [%t] %m%n"
Filters:
ThresholdFilter:
level: error
Loggers:
logger:
-
name: org.apache.logging.log4j.test1
level: debug
additivity: false
ThreadContextMapFilter:
KeyValuePair:
key: test
value: 123
AppenderRef:
ref: STDOUT
-
name: org.apache.logging.log4j.test2
level: debug
additivity: false
AppenderRef:
ref: File
Root:
level: debug
AppenderRef:
ref: STDOUT
更新
我重新阅读了文档,他们提到 JSON 和 YAML 配置文件需要额外的依赖项才能工作。我错过了它,因为我只看了开头的段落和示例文件。 将 Jackson Core 和 Databind 依赖项添加到我的 build.gradle 允许配置生效。
// for JSON and YAML configs
compile group: 'com.fasterxml.jackson.core', name: 'jackson-core', version: '2.10.3'
compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.10.3'
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.13.1'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.13.1'
您的记录器是在调试级别配置的。第一个和第三个日志记录调用处于跟踪级别。 Trace 比 debug 粒度更细,因此不会记录这些。这只留下您的错误日志事件。由于默认情况下您的应用程序使用的 Logger 的名称将是 "App" 它将使用根记录器将其路由到控制台。