Весенняя загрузка с log4j2. Настроить log4j2 Spring-lookup - PullRequest
0 голосов
/ 02 марта 2020

В соответствии с документацией log4j2:

Spring Boot Lookup извлекает значения свойств Spring из конфигурации Spring. Этот поиск будет возвращать нулевые значения до тех пор, пока Spring Boot инициализирует ведение журнала приложения.

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

Этот поиск требует, чтобы в приложение был включен log4j-spring-cloud-config-client.

Что правильный способ настроить такой поиск?

Я пытался собрать следующее приложение:

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"
    }
}

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

log4j-spring. xml

<?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>

Я ожидаю, что распознаватель правильно подставит "Demo" в качестве имени приложения, однако этого не происходит. Spring-boot-starter-log4j2 не хватает некоторых зависимостей, чтобы это работало из коробки?

Edit Это наиболее упрощенный случай. На самом деле я хочу передать имя приложения приложению gelf graylog. И я хотел бы использовать одну и ту же конфигурацию регистрации для нескольких компонентов. Поэтому обходные пути, такие как определение свойства log4j или использование конфигурации журналирования пружин, не подходят.

Ответы [ 3 ]

1 голос
/ 03 марта 2020

Spring boot starter log4j2 почти наверняка является версией, которая еще не поддерживает поиск Spring. Вместо использования Spring Boot Starter Log4j2 просто включите необходимые зависимости log4j в версии 2.13.0 или выше.

Я рекомендую вам посмотреть https://github.com/apache/logging-log4j2/tree/log4j-2.13.1/log4j-spring-cloud-config/log4j-spring-cloud-config-samples/log4j-spring-cloud-config-sample-application для примера приложения. Я лично проверил эту настройку и имею несколько проектов на ее основе.

0 голосов
/ 03 марта 2020

На основе ввода @rgoers мне удалось собрать минимальную конфигурацию для запуска log4j2 Spring lookup:

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()
}

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"
    }
}

Дополнительно, чтобы отключить облако -config (который необходим для поиска, но может не потребоваться для приложения):

bootstrap .yml (отдельный файл, дополнительный к application.yml)

spring.cloud.config.enabled: false
0 голосов
/ 02 марта 2020

Как я знаю два способа для 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>

2) Использование конфигурации yaml:

spring:
  application:
    name: DemoApp
logging:
  pattern:
    console: "%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>
...