Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LogJ2:仅在开发中登录到控制台_Java_Log4j2 - Fatal编程技术网

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

Java LogJ2:仅在开发中登录到控制台,java,log4j2,Java,Log4j2,在Log4J2中,是否有一种只在开发中登录控制台的简单方法? 只有在我的开发环境中(例如,可以通过系统属性找到),我才希望在配置中使用appender 在logback中,我有一个可选的include,它将控制台appender添加到根记录器中,因此它非常方便,而且一点也不侵入。 Log4J2中是否有类似的东西 谢谢您可以: 从配置中删除所有ConsoleLogger并以编程方式添加(请参见下面的示例)-您无法以编程方式删除它 通过手动读取正确的文件来加载正确的配置 通过加载正确的配置文件 如果

在Log4J2中,是否有一种只在开发中登录控制台的简单方法? 只有在我的开发环境中(例如,可以通过系统属性找到),我才希望在配置中使用appender

在logback中,我有一个可选的include,它将控制台appender添加到根记录器中,因此它非常方便,而且一点也不侵入。 Log4J2中是否有类似的东西

谢谢

您可以:

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

    一种解决方案是配置
    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变体解决方案