Сделайте Logback запись в консоль локально, но для входа в файл на сервере
в веб-приложении, построенном с Maven 3, Есть ли способ использовать Logback либо ConsoleAppender или RollingFileAppender в зависимости от того, где/как работает приложение?
в производство .файл войны развертывается на Tomcat 7. Локально я запускаю плагин Jetty Maven для тестирования во время разработки.
я хотел бы, чтобы ведение журнала работало так:
- когда я запускаю mvn jetty:runлокально: использоватьConsoleAppender
- , когда *.warфайл развертывается на производстве (Tomcat 7): UseRollingFileAppender
во время локальной разработки кажется очень удобным иметь все выходные данные журнала на консоли. В производстве я бы предпочел вместо этого войти в файл: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>
вы можете настроить свой 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 так
