Log4j,禁用依赖于环境的appender

Ash*_*Ash 13 java log4j rollingfileappender

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

这是我目前的配置:

<?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>
Run Code Online (Sandbox Code Playgroud)

Tom*_*Tom 11

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

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

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

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

该解决方案的优点如下:

  • 您可以独立指定记录器(ConsoleAppenderLogFileAppender开发,只有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>
Run Code Online (Sandbox Code Playgroud)

例子 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>
Run Code Online (Sandbox Code Playgroud)

  • 作为对此的变体,您始终可以在配置中引用`log4j.xml`但是具有构建过程(Maven/Ant),在创建生产JAR时将`log4j-production.xml`复制到`log4j.xml`. (4认同)

dpe*_*uha 9

使用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>
Run Code Online (Sandbox Code Playgroud)

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

在开始本地使用的同时 -Dmy.console.level=ALL

这两个OFFALL有效log4j的水平.