我想有一个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>
答案 0 :(得分:11)
其中一个解决方案可能是为开发和生产环境分离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
)该模式用于许多具有多种环境的应用程序服务器(开发,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>
答案 1 :(得分:8)
使用appender的Threshold
参数和 JVM 系统属性很容易。 E.g。
<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级别。
答案 2 :(得分:0)
使用Log4j2,您也可以使用Java系统属性来切换附加器引用,如下所示:
<?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