使Logback在本地写入控制台,但在服务器上记录日志文件

时间:2014-03-10 16:47:10

标签: maven logging log4j logback

在使用Maven 3构建的Web应用程序中,是否有办法让Logback使用ConsoleAppenderRollingFileAppender,具体取决于应用程序的运行位置和方式?

在生产中,.war文件部署在Tomcat 7上。本地我正在运行Jetty Maven插件,以便在开发过程中进行测试。

我希望记录工作如下:

  • 当我在本地运行mvn jetty:run时:使用ConsoleAppender
  • 在生产中部署*.war文件时(Tomcat 7):使用RollingFileAppender

在本地开发期间,在控制台上显示所有日志输出似乎非常舒服。在制作中,我宁愿登录文件:CATALINA_BASE/logs/myApp.log

显然,您可以在ConsoleAppender中同时使用RollingFileAppenderlogback.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>

4 个答案:

答案 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