在Log4J2中,是否有一種簡單方法可以在開發中登錄到控制檯? 我想在配置中擁有appender,只有當我在我的開發環境中時(例如可以通過System屬性找到)。LogJ2:僅在開發中登錄到控制檯
在logback中,我有一個可選的包括將控制檯appender添加到根記錄器的包含,所以它非常方便,並且根本沒有侵入性。 Log4J2中有類似的東西嗎?
感謝
在Log4J2中,是否有一種簡單方法可以在開發中登錄到控制檯? 我想在配置中擁有appender,只有當我在我的開發環境中時(例如可以通過System屬性找到)。LogJ2:僅在開發中登錄到控制檯
在logback中,我有一個可選的包括將控制檯appender添加到根記錄器的包含,所以它非常方便,並且根本沒有侵入性。 Log4J2中有類似的東西嗎?
感謝
,你可以:
實施例1之前的文件重命名:
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");
一種解決方案是與ConsoleAppender
和任何沿配置RoutingAppender
FileAppender
like RollingFileAppender
。
下面是RoutingAppender
樣本log4j2.xml
配置文件 -
<?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 argument
值來完成。如果isDevEnv VM argument
是true
(-DisDevEnv=true
),則在控制檯中記錄消息,否則在文件中記錄消息。
因此,在您的開發環境中,您可以將此VM argument
設置爲true
值以啓用在控制檯中的日誌記錄。對於生產環境,無需設置此VM argument
。
以編程方式更改配置將涉及編寫基於log4j2實現的代碼,而不是僅依賴公共API,應儘可能避免。 –
是的,這是#2變體解決方案 –