Java LogJ2:仅在开发中登录到控制台
在Log4J2中,是否有一种只在开发中登录控制台的简单方法? 只有在我的开发环境中(例如,可以通过系统属性找到),我才希望在配置中使用appender 在logback中,我有一个可选的include,它将控制台appender添加到根记录器中,因此它非常方便,而且一点也不侵入。 Log4J2中是否有类似的东西 谢谢您可以:Java LogJ2:仅在开发中登录到控制台,java,log4j2,Java,Log4j2,在Log4J2中,是否有一种只在开发中登录控制台的简单方法? 只有在我的开发环境中(例如,可以通过系统属性找到),我才希望在配置中使用appender 在logback中,我有一个可选的include,它将控制台appender添加到根记录器中,因此它非常方便,而且一点也不侵入。 Log4J2中是否有类似的东西 谢谢您可以: 从配置中删除所有ConsoleLogger并以编程方式添加(请参见下面的示例)-您无法以编程方式删除它 通过手动读取正确的文件来加载正确的配置 通过加载正确的配置文件 如果
final LoggerContext loggerContext = (LoggerContext) LogManager.getContext(false);
final Configuration loggerContextConfiguration = loggerContext.getConfiguration();
final Layout layout = PatternLayout.createDefaultLayout();
final Appender appender = ConsoleAppender.createDefaultAppenderForLayout(layout);
appender.start();
loggerContextConfiguration.addAppender(appender);
loggerContextConfiguration.getLoggers().values().forEach(l -> l.addAppender(appender, Level.DEBUG, null));
loggerContext.updateLoggers();
例2:
Configurator.initialize(null, "./resources/log4j2-dev.xml");
一种解决方案是配置
RoutingAppender
以及ConsoleAppender
和任何FileAppender
等RollingFileAppender
下面是示例log4j2.xml
配置文件,其中出现了RoutingAppender
-
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Configuration>
<Configuration status="warn" name="xml_configuration">
<Properties>
<Property name="basePath">./log/</Property>
</Properties>
<Appenders>
<RollingFile name="fileLogger" fileName="${basePath}app.log"
filePattern="${basePath}app_%d{yyyyMMdd}.log.gz">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%c] [%M] [%l] - %msg%n" />
<Policies>
<TimeBasedTriggeringPolicy interval="1"
modulate="true" />
</Policies>
</RollingFile>
<Console name="consoleLogger" target="SYSTEM_OUT">
<PatternLayout
pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %level [%t] [%c] [%M] [%l] - %msg%n" />
</Console>
<Routing name="RoutingLogger">
<!-- Condition is - if isDevEnv VM argument is true (-isDevEnv=true),
then log messages in console else log messages in file -->
<Script name="RoutingCondition" language="JavaScript"><![CDATA[
var imports = new JavaImporter(java.lang);
with (imports) {
System.getProperty("isDevEnv") == "true" ? "console" : "file";
}]]>
</Script>
<Routes>
<Route ref="consoleLogger" key="console" />
<Route ref="fileLogger" key="file" />
</Routes>
</Routing>
</Appenders>
<Loggers>
<Logger name="mypackage" level="info" additivity="false">
<appender-ref ref="RoutingLogger" />
</Logger>
<Root level="error" additivity="false">
<appender-ref ref="RoutingLogger" />
</Root>
</Loggers>
</Configuration>
/日志/
日志路由将基于isDevEnv VM参数的值来完成。如果isDevEnv VM参数
为true
(-DisDevEnv=true
),则在控制台中记录消息,否则在文件中记录消息
因此,在您的开发环境中,您可以使用true
值设置此VM参数
,以启用登录控制台。对于生产环境,无需设置此VM参数
以编程方式更改配置将涉及编写基于log4j2实现的代码,而不仅仅依赖公共API,如果可能,应避免使用。是的,这是一种#2变体解决方案