Весенний профиль загрузки и среда в имени файла журнала - PullRequest
0 голосов
/ 06 апреля 2020

Как записать профиль Spring и среду Spring в имя файла журнала для файла журнала с помощью Log4j2. xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="10">
    <Properties>
        <Property name="env">????</Property>
        <Property name="profile">????</Property>
        <Property name="date">%d{yyyy-MM-dd_HHmm}</Property>
    </Properties>
    <Appenders>
        <Console name="LogToConsole" target="SYSTEM_OUT">
            <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %c{1} %-5level %c{1} - %message%n"/>
        </Console>
        <RollingRandomAccessFile name="LogToFile" filePattern="./logs/filename_${env}_${profile}_${date}.log">
            <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level %c{1} - %message%n"/>
            <Policies>
                <OnStartupTriggeringPolicy />
            </Policies>
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="LogToConsole" />
            <AppenderRef ref="LogToFile" />
        </Root>
    </Loggers>
</Configuration>

Ответы [ 4 ]

0 голосов
/ 08 апреля 2020

Используйте Log4j 2.13.1 и включите log4j-spring-cloud-config-client-2.13.1.jar в качестве зависимости. Это предоставит вам доступ к Spring Lookup, который предоставит вам доступ к любому свойству, определенному в вашем application.yml или bootstrap .yml. Затем вы можете добавить

spring:
  profile: lab
  env: dev

в конфигурацию Spring и затем установить свой log4j2. xml как:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="10">
    <Properties>
        <Property name="profile">${spring:spring.profile:-default}</Property>
        <Property name="env">${spring:spring.env:-dev}</Property>
        <Property name="date">%d{yyyy-MM-dd_HHmm}</Property>
    </Properties>
    <Appenders>
        <Console name="LogToConsole" target="SYSTEM_OUT">
            <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %c{1} %-5level %c{1} - %message%n"/>
        </Console>
        <RollingRandomAccessFile name="LogToFile" filePattern="./logs/filename_${env}_${profile}_${date}.log">
            <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level %c{1} - %message%n"/>
            <Policies>
                <OnStartupTriggeringPolicy />
            </Policies>
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="LogToConsole" />
            <AppenderRef ref="LogToFile" />
        </Root>
    </Loggers>
</Configuration>

С помощью этого Log4j будет получать значения из среды Spring один раз он инициализирован. Обратите внимание, что приложение Spring Boot инициализирует ведение журналов не менее 3 раз, причем первое происходит до того, как Spring имеет среду. Для этого случая можно использовать другую конфигурацию ведения журнала, указав ее местоположение в log4j2.component.properties, а затем указав другой файл конфигурации ведения журнала в bootstrap .yml. Log4j 2 предоставляет пример приложения , которое использует это, а также получает доступ к его файлу конфигурации на сервере конфигурации Spring Cloud.

Обратите внимание, что если вы храните файл log4j2. xml в Spring Cloud Конфигурация Вы можете использовать разные конфигурации Log4j для каждой среды и устранить необходимость в переменных.

0 голосов
/ 06 апреля 2020

Надеюсь, этот блог полезен

https://www.logicbig.com/tutorials/spring-framework/spring-boot/profile-logback-logging-config.html

spring.main.banner-mode=off
spring.main.logStartupInfo=false
spring.profiles.active=prod
0 голосов
/ 06 апреля 2020

используйте ${sys:spring.profiles.active}, так как любые аргументы, заданные с -D, считаются SystemProperties.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorInterval="10">
    <Properties>
        <Property name="profile">${sys:spring.profiles.active}</Property>
        <Property name="date">%d{yyyy-MM-dd_HHmm}</Property>
    </Properties>
    <Appenders>
        <Console name="LogToConsole" target="SYSTEM_OUT">
            <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %c{1} %-5level %c{1} - %message%n"/>
        </Console>
        <RollingRandomAccessFile name="LogToFile" filePattern="./logs/filename_${profile}_${date}.log">
            <PatternLayout pattern="%date{yyyy-MM-dd HH:mm:ss.SSS} %-5level %c{1} - %message%n"/>
            <Policies>
                <OnStartupTriggeringPolicy />
            </Policies>
        </RollingRandomAccessFile>
    </Appenders>
    <Loggers>
        <Root level="INFO">
            <AppenderRef ref="LogToConsole" />
            <AppenderRef ref="LogToFile" />
        </Root>
    </Loggers>
</Configuration>
0 голосов
/ 06 апреля 2020

Я бы предложил использовать logback (лучшую версию Log4j), который поставляется напрямую с spring-boot-starter-logging. Таким образом, вам не нужно импортировать другие зависимости журнала.

В моем случае файл conf logback выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <include resource="org/springframework/boot/logging/logback/base.xml" />
  <logger name="org.springframework" level="INFO"/>
  <logger name="com" level="INFO"/>
</configuration>

Во время запуска пружина регистрирует профиль, который имеет загружен, как вы видите здесь: Следующие профили активны: интеграция

Кроме того, если вы хотите регистрировать профиль активной пружины как часть каждого сообщения, вы можете интегрировать с MD C и во время запуска вы можете ввести профиль следующим образом:

@Value("${spring.profiles.active}")
private String activeProfile;

, и после этого вы можете установить этот профиль в контексте MD C:

MDC.put("profile", activeProfile);

В таким образом, все ваши сообщения будут содержать профиль. Например, сообщение журнала будет выглядеть так:

[06/04/20 10: 43: 24.986] lvl = INFO [Тестовый работник] c .mjfspExampleService [ profile =gration ] - что-то случилось в этой службе

...