[英]Log4j, disable appenders dependent on environment
I would like to have one log4j.xml config and be able to log to console while developing my application.我想要一个 log4j.xml 配置并且能够在开发我的应用程序时登录到控制台。 Once deployed to an environment I want to only log to a file appender and not the console.
一旦部署到环境中,我只想登录到文件附加程序而不是控制台。 How can I achieve this?
我怎样才能做到这一点?
This is my current config:这是我当前的配置:
<?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>
One of the solutions could be separation of log4j configuration files for development and production environments eg:解决方案之一可能是分离用于开发和生产环境的 log4j 配置文件,例如:
log4j-development.xml
- for development environment log4j-development.xml
- 用于开发环境log4j-production.xml
- for production environment log4j-production.xml
- 用于生产环境Then your application startup command could have parrameter specifying log4j configuration file eg java -Dlog4jconfig=log4j-development.xml -jar Application.jar
然后你的应用程序启动命令可以有参数指定 log4j 配置文件,例如
java -Dlog4jconfig=log4j-development.xml -jar Application.jar
You can configure log4j by getting value of log4jconfig
property in your code eg System.getProperty("log4jconfig")
.您可以通过获取代码中
log4jconfig
属性的值来配置 log4j,例如System.getProperty("log4jconfig")
。
Pros of that solution are as follows:该解决方案的优点如下:
ConsoleAppender
and LogFileAppender
in development and only LogFileAppender
in production)ConsoleAppender
和LogFileAppender
发展,只有LogFileAppender
生产)error
in production and debug
in development)error
和开发中的debug
) That pattern is used in many application servers where you have multiple environments (Development, UAT, Staging, Production etc.)该模式用于许多具有多个环境(开发、UAT、登台、生产等)的应用程序服务器中。
Example of log4j-development.xml
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>
Example of log4j-production.xml
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>
It is easy to do using appender's Threshold
parameter and JVM system property.使用 appender 的
Threshold
参数和JVM系统属性很容易做到。 Eg例如
<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>
Then when starting application on prod use -Dmy.console.level=OFF
然后在 prod 上启动应用程序时使用
-Dmy.console.level=OFF
At the same time when starting locally use -Dmy.console.level=ALL
同时在本地启动时使用
-Dmy.console.level=ALL
Both OFF
and ALL
are valid log4j levels. OFF
和ALL
都是有效的 log4j 级别。
With Log4j2 you could alternatively switch the appender reference with a Java system property like so:使用 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>
(the minus -
in front of the default value in the sys prop variable is required for some reason) (负
-
在SYS丙变量的默认值的前面需要出于某些原因)
To switch from the default "rolling-file" to the console"从默认的“滚动文件”切换到控制台“
-Dlog4j.loggers.root.appender=console
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.