Записывать логи в файл и консоль в весеннем загрузочном проекте, используя log4j2.xml - PullRequest
0 голосов
/ 27 апреля 2019

Я попытался создать простое приложение с весенней загрузкой, в котором журнал должен быть напечатан как на консоли, так и в файле, который находится за пределами папки проекта. Журнал может печатать в консоли, но не может записывать в файл. Я указал местоположение файла (файл не создан, я думаю, что файл генерируется автоматически)

Здесь добавлена ​​зависимость

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>

    <!-- Add Log4j2 Dependency -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
</dependencies>

Вот файл log4j.xml (расположение src / main / resources / log4j2.xml)

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">
            %d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex
        </Property>
    </Properties>

    <Appenders>
        <Console name="ConsoleAppender" target="SYSTEM_OUT"
            follow="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
        </Console>

        <!-- Rolling File Appender -->
        <RollingFile name="FileAppender"
            fileName="/home/ubuntu/Documents/eclipse/logs/log4j2-demo.log"
            filePattern="logs/log4j2-demo-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout>
                <Pattern>${LOG_PATTERN}</Pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" />
                <SizeBasedTriggeringPolicy size="10MB" />
            </Policies>
            <DefaultRolloverStrategy max="10" />
        </RollingFile>
    </Appenders>

    <Loggers>

        <Root level="debug">
            <AppenderRef ref="ConsoleAppender" />
            <AppenderRef ref="FileAppender" />
        </Root>
    </Loggers>
</Configuration>

Я добавил функцию регистрации в основной класс

    import org.apache.logging.log4j.LogManager;

    import org.apache.logging.log4j.Logger;

    import org.springframework.boot.SpringApplication;

    import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class LoggingApplication {

    private static final Logger logger = LogManager.getLogger(LoggingApplication.class);


    public static void main(String[] args) {
        logger.info("in main class");
        logger.info("info logging is printed");
        logger.debug("logger debud is worked");
        logger.warn("logging warn is worked");
        SpringApplication.run(LoggingApplication.class, args);
    }

}

Вот консоль: enter image description here

Ответы [ 3 ]

1 голос
/ 30 апреля 2019

Первое, что я хотел бы сделать, это попытаться удалить привязку logback из вашего classpath, как указано в документации .

Итак, ваша конфигурация pom.xml будет содержать исключение,например:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<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-log4j2</artifactId>
</dependency>

Кроме того, я бы рекомендовал не использовать API-классы log4j напрямую, а вместо этого использовать sfl4j API.Spring-boot уже настроен на использование SL4J с любым компоновщиком, который вы настроили на пути к классам (в данном случае это log4j).

Поэтому вместо использования org.apache.logging.log4j.Logger я бы использовал org.slfj.Logger для вашего класса регистратора исоздайте его с помощью org.slf4j.LoggerFactory.getLogger().Преимущество использования этого по сравнению с непосредственным использованием классов log4j состоит в том, что вы можете переключать подшивки под slf4j без необходимости изменять весь ваш код.На всякий случай, если позже вы решите, что хотите использовать logback или что-то еще.

Если вы сделаете это изменение в pom и используете API-интерфейсы slf4j, я думаю, подпружиненная загрузка автоматическиКонфигурация загрузит вашу конфигурацию и начнет входить в файл appender, а также в консоль.

0 голосов
/ 06 мая 2019

Вы можете сделать следующее:

application.properties

#####LOGGING. . . .
logging.level.org.springframework.web=ERROR
logging.level.com.hsc.adauth.*=DEBUG

# Logging pattern for the console
logging.pattern.console="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"

# Logging pattern for file
logging.pattern.file= "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"

#output to a temp_folder/file(give your file path here)
logging.file=${java.io.tmpdir}/application.log

Вы также можете использовать AOP для централизованного входа в приложение .....

0 голосов
/ 06 мая 2019

Пожалуйста, следуйте приведенному ниже подходу, здесь я настроил два приложения для одного регистратора. Если вы регистрируете что-либо, используя это имя регистратора, все сообщения журнала будут отправлены в оба места. В вашем случае и консоль и файл.

 <logger name="pushnotification" level="debug" additivity="false">
            <appender-ref ref="NOTIFICATION-FILE-APPENDER" />
    <appender-ref ref="NOTIFICATION-CONSOLE-APPENDER" />
        </logger>

    <appender name="NOTIFICATION-CONSOLE-APPENDER" class="ch.qos.logback.core.ConsoleAppender">
            <encoder
        class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <pattern>[%date{yyyy-MM-dd HH:mm:ss}][%level][%c][%t] - %msg%n
        </pattern>
    </encoder>
        </appender>

    <appender name="NOTIFICATION-FILE-APPENDER"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${logs.home}/applogs/notification.log</file>
            <append>true</append>
        </appender>
...