Сделайте 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 так