Сделайте Logback запись в консоль локально, но для входа в файл на сервере

в веб-приложении, построенном с Maven 3, Есть ли способ использовать Logback либо ConsoleAppender или RollingFileAppender в зависимости от того, где/как работает приложение?

в производство .файл войны развертывается на Tomcat 7. Локально я запускаю плагин Jetty Maven для тестирования во время разработки.

я хотел бы, чтобы ведение журнала работало так:

  • когда я запускаю mvn jetty:run локально: использовать ConsoleAppender
  • , когда *.war файл развертывается на производстве (Tomcat 7): Use RollingFileAppender

во время локальной разработки кажется очень удобным иметь все выходные данные журнала на консоли. В производстве я бы предпочел вместо этого войти в файл:CATALINA_BASE/logs/myApp.log.

очевидно, что вы могли бы просто использовать ConsoleAppender и RollingFileAppender на logback.xml. Но мне кажется излишне избыточным иметь все выходные данные журнала на производстве, записанные в STDOUT и в файл журнала. Кроме того, из Кот документации похоже, что вход в STDOUT на производстве-плохая практика в целом.

я не мог найти никаких хороших решений в интернете. Есть ли хорошее решение для этого?

вот мой нынешний logback.xml который всегда входит в STDOUT и в нужный файл журнала:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${catalina.base}/logs/myApp.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${catalina.base}/logs/myApp.%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>

        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.myDomain.myApp" level="DEBUG" />

    <root level="DEBUG">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE" />
    </root>
</configuration>

4 ответов


Вы можете использовать профили для переключения между окружающей средой. Скажем, у вас есть два разных logback.xml-файлы для локальных и prod. Создайте каталог logback внутри каталога ресурсов. В каталоге resources создайте каталог, специфичный для среды. имя каталога и envName внутри свойства должны совпадать. Вот пример.

<profiles>
        <profile>
            <id>local</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <properties>
                <envName>local</envName>
            </properties>
        </profile>
        <profile>
            <id>prod</id>
            <properties>
                <envName>prod</envName>
            </properties>
        </profile>
</profiles>

<build>
    <finalName>kp-prj</finalName>
    <outputDirectory>${project.build.directory}/classes</outputDirectory>
    <sourceDirectory>${project.basedir}/src/main/java</sourceDirectory>
    <resources>
        <resource>
            <directory>${basedir}/src/main/java</directory>
            <includes>
                <include>**/*.class</include>
            </includes>
        </resource>
        <resource>
            <directory>src/main/resources/logback/${envName}</directory>
        </resource>
    </resources>
</build>

и при использовании команды Maven вы указываете профиль.

mvn run -Plocal

у меня была такая же потребность, и это оказалось довольно легко с помощью spring boot "ifulness" и условной поддержки, доступной для logback. Ниже приведен шаблон, который я придумал, который может быть для любого приложения, поскольку он создает файл журнала с помощью spring.аплодисменты.имя, если доступно, которое можно определить в bootstrap.свойства:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE project>
<configuration>
    <if condition='isDefined("logging.path")'>
        <then>
            <!--  get application name from external properties file -->
            <property resource="bootstrap.properties" />

            <!--  set local properties here for better visibility -->
            <!--  TODO: make these profile conditional based on profiles -->
            <property name="logging.maxfilesize" value="1GB" />
            <property name="logging.maxdays" value="180" />

            <!-- Assume file strategy for appender if logging path given -->
            <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
                <!-- Use application.log if s.a.n not defined in bootstrap.properties -->
                <file>${logging.path}/${spring.application.name:-application}.log</file>
                <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                    <!-- daily rollover -->
                    <fileNamePattern>${logging.path}/${spring.application.name:-application}.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
                    <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                        <!-- or whenever the file size reaches maxFileSize -->
                        <maxFileSize>${logging.maxfilesize}</maxFileSize>
                    </timeBasedFileNamingAndTriggeringPolicy>
                    <!-- keep max days' worth of history -->
                    <maxHistory>${logging.maxdays}</maxHistory>
                </rollingPolicy>
                <encoder>
                    <pattern>%date [%thread] %-5level %logger{36} - %msg%n</pattern>
                </encoder>
            </appender>
            <root>
                <appender-ref ref="FILE" />
            </root>
        </then>
        <else>
            <!-- The logging path not specified so assume console output -->
            <!-- Note: In this case we don't care about the full date just the hour minutes seconds -->
            <appender name="CON" class="ch.qos.logback.core.ConsoleAppender">
                <encoder>
                    <pattern>%d{HH:mm:ss.SSS} %-5level %logger{35} - %msg %n</pattern>
                </encoder>
            </appender>
            <root>
                <appender-ref ref="CON" />
            </root>
        </else>
    </if>

    <!-- in-house loggers -->


    <!-- 3rdparty Loggers -->

    <logger name="org.springframework">
        <level value="WARN" />
    </logger>

    <!-- default root level for everything else -->

    <root>
        <level value="INFO" />
    </root>

</configuration>

Если spring boot app с родителем starter, вам нужно только добавить следующее к вашему pom.XML-код:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-logging</artifactId>
</dependency>
<!-- Needed for conditional logback.xml statement support - very cool stuff -->
<dependency>
    <groupId>org.codehaus.janino</groupId>
    <artifactId>janino</artifactId>
</dependency>

одна вещь, которую я сделал в прошлом с log4j-это добавить log4j.xml config для веб-приложения


вы можете настроить свой logback и добавить в него информацию о профиле. Никаких изменений в POM не требуется

 <springProfile name="local">
    <root level="DEBUG">
<!-- no appenders -->
        <appender-ref ref="stdout"/>
    </root>
</springProfile>
<springProfile name="prod">
    <root level="INFO">
        <appender-ref ref="FILE_APPENDER"/>
    </root>
</springProfile>

Вам может потребоваться включить ниже spring файлы, а также

<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />

для получения дополнительной информации checkout Logback так