在使用Maven 3构建的Web应用程序中,是否有办法让Logback使用ConsoleAppender
或RollingFileAppender
,具体取决于应用程序的运行位置和方式?
在生产中,.war文件部署在Tomcat 7上。本地我正在运行Jetty Maven插件,以便在开发过程中进行测试。
我希望记录工作如下:
mvn jetty:run
时:使用ConsoleAppender
*.war
文件时(Tomcat 7):使用RollingFileAppender
在本地开发期间,在控制台上显示所有日志输出似乎非常舒服。在制作中,我宁愿登录文件:CATALINA_BASE/logs/myApp.log
。
显然,您可以在ConsoleAppender
中同时使用RollingFileAppender
和logback.xml
。但对我来说,将生产中的所有日志输出写入STDOUT
并写入日志文件似乎是不必要的冗余。此外,从Tomcat文档中可以看出,生产中记录到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>
答案 0 :(得分:8)
您可以使用配置文件在环境之间切换。假设您有本地和prod的两个不同的logback.xml文件。在资源目录中创建一个logback目录。在资源目录中,创建特定于环境的目录。目录名称和属性内的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>
使用running maven命令时,您可以指定配置文件。
mvn run -Plocal
答案 1 :(得分:4)
我有同样的需求,在弹簧启动“ifulness”和条件支持可用于logback的帮助下,结果非常简单。以下是我提出的模板,可以用于任何应用程序,因为它使用spring.applcation.name创建日志文件(如果可用),您可以在bootstrap.properties中定义:
<?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具有启动父级,则只需将以下内容添加到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>
答案 2 :(得分:0)
我过去使用log4j做的一件事是将log4j.xml
配置文件添加到web-app的src/test/resources
目录中。然后,我将Jetty配置为包含测试类目录(<useTestScope>true</useTestScope>
)。
对于您的示例,带有ConsoleLogger的logback.xml将位于src/test/resources
,而带有RollingFileAppender的logback.xml位于src/main/resources
。
在所有情况下,这都不是一个很好的解决方案,但对我来说这很简单并且效果很好。
答案 3 :(得分:0)
您可以配置登录并在其中添加配置文件信息。无需更改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" />
有关更多信息,请查看logback