Java 带有log4j2的弹簧靴。配置log4j2spring查找

Java 带有log4j2的弹簧靴。配置log4j2spring查找,java,spring-boot,logging,log4j2,Java,Spring Boot,Logging,Log4j2,根据log4j2文件: Spring引导查找从中检索Spring属性的值 弹簧配置。此查找将返回空值,直到 Spring引导初始化应用程序日志记录 <File name="Application" fileName="application.log"> <PatternLayout> <pattern>%d %p %c{1.} [%t] $${spring:spring.application.name} %m%n</pattern>

根据log4j2文件:

Spring引导查找从中检索Spring属性的值 弹簧配置。此查找将返回空值,直到 Spring引导初始化应用程序日志记录

<File name="Application" fileName="application.log">
  <PatternLayout>
    <pattern>%d %p %c{1.} [%t] $${spring:spring.application.name} %m%n</pattern>
  </PatternLayout>
</File>
main

@SpringBootApplication
public class DemoApplication implements ApplicationRunner {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

    private final Logger logger = LogManager.getLogger();

    @Override
    public void run(ApplicationArguments args) throws Exception {
        logger.debug("Debugging log");
        logger.info("Info log");
        logger.warn("Hey, This is a warning!");
        logger.error("Oops! We have an Error. OK");
        logger.fatal("Damn! Fatal error. Please fix me.");
    }
}
application.yml

spring.application.name: Demo
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <PatternLayout>
                <pattern>%d %p %c{1.} [%t] $${spring:spring.application.name} %m%n</pattern>
            </PatternLayout>
        </Console>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="ConsoleAppender" />
        </Root>
    </Loggers>
</Configuration>
spring.cloud.config.enabled: false
log4j spring.xml

spring.application.name: Demo
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <PatternLayout>
                <pattern>%d %p %c{1.} [%t] $${spring:spring.application.name} %m%n</pattern>
            </PatternLayout>
        </Console>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="ConsoleAppender" />
        </Root>
    </Loggers>
</Configuration>
spring.cloud.config.enabled: false

%d%p%c{1.}[%t]${spring:spring.application.name}%m%n
我希望解析器正确地将“Demo”替换为应用程序名,但是这不会发生。 spring-boot-starter-log4j2是否缺少一些依赖项以使其开箱即用

编辑 这是最简单的情况。 实际上,我想将应用程序名传递给gelf graylog appender。 我希望在多个组件中共享相同的日志记录配置。所以解决方法,比如定义log4j属性,或者使用spring日志配置,
不合适。

因为我知道log4j2有两种方法:

1) 使用log4j2-spring.xml

    <Properties>
      <Property name="APP_NAME">DemoApp</Property>
    </Properties>

    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT" follow="true">
            <PatternLayout>
                <pattern>%d %p %c{1.} [%t] ${APP_NAME} %m%n</pattern>
            </PatternLayout>
        </Console>
    </Appenders>

    <Loggers>
        <Root level="info">
            <AppenderRef ref="ConsoleAppender" />
        </Root>
    </Loggers>

DemoApp
%d%p%c{1.}[%t]${APP_NAME}%m%n
2) 使用yaml配置:

spring: application: name: DemoApp logging: pattern: console: "%d %p %c{1.} [%t] ${spring.application.name} - %m%n" 春天: 应用程序: 名称:DemoApp 登录中: 模式: 控制台:“%d%p%c{1.}[%t]${spring.application.name}-%m%n” 3) 使用logback。示例logback-spring.xml:

<configuration>
    <springProperty scope="context" name="APP_NAME" source="spring.application.name"/>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d %-5level [${APP_NAME}] [%c{10}] - %msg%n</pattern>
        </encoder>
    </appender>

    <springProfile name="default">
        <root level="INFO">
            <appender-ref ref="STDOUT"/>
        </root>
    </springProfile>
</configuration>

%d%-5级[${APP_NAME}][%c{10}]-%msg%n

几乎可以肯定,Spring boot starter log4j2是一个不支持Spring查找的版本。不使用SpringBootStarter Log4j2,只需直接包含版本2.13.0或更高版本所需的log4j依赖项


我建议您查看一个示例应用程序。我曾亲自测试过此设置,并且在我工作的地方有一些基于此设置的项目。

更新14.05.2021: 从log4j 2.14.0开始,有一个单独的spring查找模块。 不幸的是,spring boot对log4j的依赖性仍然不够高。但至少可以避免使用整个云配置依赖项

implementation "org.apache.logging.log4j:log4j-api:${log4j2version}"
implementation "org.apache.logging.log4j:log4j-core:${log4j2version}"
implementation "org.apache.logging.log4j:log4j-spring-boot:${log4j2version}"
+++++++++++++++++++

基于@rgoers输入,我能够组装最小配置来运行log4j2 Spring查找:

build.gradle

plugins {
    id 'org.springframework.boot' version '2.2.5.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}

sourceCompatibility = '13'

repositories{
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-log4j2'
}

configurations {
    all {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
        exclude group: "ch.qos.logback", module: "logback-classic"
    }
}
plugins {
    id 'org.springframework.boot' version '2.2.5.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}

sourceCompatibility = '13'

repositories{
    mavenCentral()
}

ext{
    log4j2version = '2.13.1'
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    implementation 'org.springframework.boot:spring-boot-starter-log4j2'
    
    implementation "org.apache.logging.log4j:log4j-spring-cloud-config-client:${log4j2version}"
    implementation "org.apache.logging.log4j:log4j-api:${log4j2version}"
    implementation "org.apache.logging.log4j:log4j-core:${log4j2version}"
}

configurations {
    all {
        exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
        exclude group: "ch.qos.logback", module: "logback-classic"
        exclude group: "org.springframework.cloud", module: "spring-cloud-bus"
    }
}
此外,要禁用云配置(查找需要云配置,但应用程序可能不需要云配置):

bootstrap.yml(application.yml之外的单独文件)


org.apache.logging.log4j
log4j spring云配置客户端
org.springframework.cloud
春云巴士
org.springframework.boot
spring-boot-starter-log4j2
我的log4j2.xml



很遗憾,这两个选项都不适用,请参见编辑。@IgorPiddubnyi,能否将日志记录器更改为logback?为logback添加示例是的,我知道logback扩展,以及将spring属性发布为系统道具的变通方法。然而,log4j2文档定义了对spring引导查找的支持,我对“propper”解决方案感兴趣。基于您对版本和示例项目的评论,我能够组装最小的工作示例。然而,在我看来,仅仅为了运行spring查找,配置整个云配置依赖链,然后禁用它是相当痛苦的。您认为在未来版本的log4j2中这可能会得到改进吗?值得提交一个问题吗?主要问题是Spring Boot中嵌入了Log4j的版本。一旦Spring创建了包含Log4j 2.13.0或更高版本的发行版,您就不会有这些问题。当然,到那时,您可能需要更新版本的Log4j来实现一些新功能。我相信Spring可能有一个变量,你可以重写它。您还可以排除Spring引导日志启动程序,并将其替换为Log4j的BOM pom.xmlI,这实际上并不意味着版本问题,而是需要为Spring查找提供云配置客户端依赖项。在我看来,它们不应该被限制。我已经将spring查找分离为一个Log4J spring引导模块,该模块将在2.14.0版本中发布。我在2.3.4.0版本中使用spring引导查找时遇到了同样的问题。排除确实为我解决了这个问题。非常感谢。对于Gradle,请使用以下内容:
implementation('org.apache.logging.log4j:log4j spring cloud config client:2.14.0'){exclude group:'org.springframework.cloud',module:'spring cloud bus'}