【问题标题】:Log4j, disable appenders dependent on environmentLog4j,根据环境禁用附加程序
【发布时间】:2013-01-04 10:58:37
【问题描述】:

我想要一个 log4j.xml 配置,并能够在开发我的应用程序时登录到控制台。一旦部署到环境中,我只想登录到文件附加程序而不是控制台。我怎样才能做到这一点?

这是我当前的配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
        <param name="Threshold" value="DEBUG" />
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" />
        </layout>
    </appender>

    <appender name="LogFileAppender" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="${log-base-dir}/${adapter-name}.log" />
        <param name="MaxFileSize" value="5000KB" />
        <param name="MaxBackupIndex" value="99" />
        <param name="append" value="true" />        
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" />
        </layout>
    </appender>

    <root>
        <level value="info" />
        <appender-ref ref="ConsoleAppender" />
        <appender-ref ref="LogFileAppender" />
    </root>

</log4j:configuration>

【问题讨论】:

  • 你想使用同一个文件并实现它吗?如果您执行测试用例和部署,您可以区分日志。我认为您必须手动更改文件。

标签: java log4j rollingfileappender


【解决方案1】:

其中一个解决方案可能是为 开发 和 生产 环境分离 log4j 配置文件,例如:

  • log4j-development.xml - 用于开发环境
  • log4j-production.xml - 用于生产环境

然后您的应用程序启动命令可以具有指定 log4j 配置文件的参数,例如java -Dlog4jconfig=log4j-development.xml -jar Application.jar

您可以通过在代码中获取 log4jconfig 属性的值来配置 log4j,例如System.getProperty("log4jconfig").

该解决方案的优点如下:

  • 您可以独立指定记录器(ConsoleAppender 和 LogFileAppender 在开发中,只有 LogFileAppender 在生产中)
  • 您可以指定每个环境的日志记录级别(例如,error 在生产中,debug 在开发中)
  • 您可以独立配置文件记录器,例如在生产环境中保留 X 天的日志(出于审计目的等),并且在开发等中只有一个日志文件。

该模式在您拥有多个环境(开发、UAT、暂存、生产等)的许多应用程序服务器中使用

log4j-development.xml 的示例

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender">
        <param name="Threshold" value="DEBUG" />
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" />
        </layout>
    </appender>

    <root>
        <level value="debug" />
        <appender-ref ref="ConsoleAppender" />
    </root>

</log4j:configuration>

log4j-production.xml 的示例

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <appender name="LogFileAppender" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="${log-base-dir}/${adapter-name}.log" />
        <param name="MaxFileSize" value="5000KB" />
        <param name="MaxBackupIndex" value="99" />
        <param name="append" value="true" />        
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{dd-MM-yyyy HH:mm:ss} %-5p%c{1} - %m%n" />
        </layout>
    </appender>

    <root>
        <level value="error" />
        <appender-ref ref="LogFileAppender" />
    </root>

</log4j:configuration>

【讨论】:

  • 作为一种变体,您始终可以在配置中引用log4j.xml,但有您的构建过程(Maven / Ant),在创建生产 JAR 时将 log4j-production.xml 复制到 log4j.xml。
  • 我知道这个解决方案,但我想知道是否有另一种聪明的方法可以只使用一个 log4j.zml 文件而不是两个来满足我的要求。
【解决方案2】:

使用 appender 的 Threshold 参数和 JVM 系统属性很容易做到。例如

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
    <param name="Threshold" value="${my.console.level}" />
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d %-5p [%c{1}] %m%n" />
    </layout>
</appender>

然后在 prod 上启动应用程序时使用 -Dmy.console.level=OFF

本地启动的同时使用-Dmy.console.level=ALL

OFF 和 ALL 都是有效的 log4j 级别。

【讨论】:

  • 对我来说很好,避免为生产添加其他 log4j 文件,谢谢
【解决方案3】:

使用 Log4j2,您也可以使用 Java 系统属性切换 appender 引用,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="error">
    <Appenders>
        <!-- Log file location uses Tomcat system variable, change for other web servers -->
        <RollingFile name="rolling-file"/>
        <Console name="console"/>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="${sys:log4j.loggers.root.appender:-rolling-file}"/>
        </Root>
    </Loggers>
</Configuration>

(由于某种原因,sys prop 变量中默认值前面的减号- 是必需的)

从默认的“滚动文件”切换到控制台”

-Dlog4j.loggers.root.appender=console

【讨论】:

    猜你喜欢
    • 2019-11-03
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 2011-09-04
    • 2018-08-16
    • 1970-01-01
    相关资源
    最近更新 更多