LogJ2:仅在开发中登录到控制台

时间:2017-10-12 12:21:39

标签: java log4j2

在Log4J2中,有一种简单的方法只能在开发中登录控制台吗? 我想在配置中使用appender,只有当我在我的开发环境中时(例如,可以通过System属性找到它)。

在logback中,我有一个可选的include,它将Console appender添加到根记录器,所以它非常方便而且根本没有侵入性。 Log4J2中有类似的东西吗?

由于

2 个答案:

答案 0 :(得分:1)

一种解决方案是配置RoutingAppenderConsoleAppender以及任何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 argument的值完成。如果isDevEnv VM argumenttrue-DisDevEnv=true),则在控制台中记录消息,然后在文件中记录消息。

因此,在您的开发环境中,您可以将此VM argument设置为true以启用登录控制台。对于生产环境,无需设置此VM argument

答案 1 :(得分:-1)

你可以:

  1. 从配置中删除所有ConsoleLogger并以编程方式添加(参见下面的示例) - 您无法以编程方式删除
  2. 加载正确的配置,手动读取正确的文件
  3. 通过system property
  4. 加载正确的配置文件
  5. 如果你使用maven,你可以在午餐前以编程方式重命名文件
  6. 示例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");