简体   繁体   English

Log4J2 - 只写入日志文件而不是控制台

[英]Log4J2 - Write only to log file not console

I am trying to write info to only log file not to console.我正在尝试将信息写入仅日志文件而不是控制台。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
 <Properties>
        <Property name="log-path">log</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
        <RollingFile name="RollingFile" filename="log/logs.log"
            filepattern="${log-path}/$${date:yyyy-MM}/log-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" />
            <Policies>
                <SizeBasedTriggeringPolicy size="100MB" />
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <DefaultRolloverStrategy max="20" />
        </RollingFile>
 
    </Appenders>
    <Loggers>
            <Logger name="org.myapp." level="OFF" additivity="false"> 
            <AppenderRef ref="RollingFile"/> 
            <AppenderRef ref="Console"/>
        </Logger>
        <Root level="error">
            <AppenderRef ref="Console" />
            <AppenderRef ref="RollingFile" />
        </Root>
        
    </Loggers>
</Configuration>

Above configuration neither print in console nor in log file, but I need to print the Logger.info into the log file and not in the console.以上配置既不在控制台打印,也不在日志文件中打印,但我需要将 Logger.info 打印到日志文件中,而不是在控制台中。

How to do this?这个怎么做?

You have a couple of choices.你有几个选择。 First, you can add a level to the appender references:首先,您可以向 appender 引用添加一个级别:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
    <Property name="log-path">log</Property>
</Properties>
<Appenders>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <RollingFile name="RollingFile" filename="log/logs.log"
        filepattern="${log-path}/$${date:yyyy-MM}/log-%d{MM-dd-yyyy}-%i.log.gz">
        <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" />
        <Policies>
            <SizeBasedTriggeringPolicy size="100MB" />
            <TimeBasedTriggeringPolicy/>
        </Policies>
        <DefaultRolloverStrategy max="20" />
    </RollingFile>
 
  </Appenders>
  <Loggers>
        <Logger name="org.myapp." level="trace" additivity="false"> 
        <AppenderRef ref="RollingFile" level="fatal"/> 
        <AppenderRef ref="Console" level="info"/>
    </Logger>
    <Root level="trace">
        <AppenderRef ref="Console" level="info"/>
        <AppenderRef ref="RollingFile" level="error"/>
    </Root>
    
    </Loggers>
</Configuration>

This allows the log events to pass through the Logger's filtering but then be allowed or rejected by the Appender references.这允许日志事件通过 Logger 的过滤,然后被 Appender 引用允许或拒绝。

Another approach is to add filters to the Appenders另一种方法是向 Appenders 添加过滤器

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Properties>
    <Property name="log-path">log</Property>
</Properties>
<Appenders>
    <Console name="Console" target="SYSTEM_OUT">
        <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>
    <RollingFile name="RollingFile" filename="log/logs.log"
        filepattern="${log-path}/$${date:yyyy-MM}/log-%d{MM-dd-yyyy}-%i.log.gz">
        <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
        <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" />
        <Policies>
            <SizeBasedTriggeringPolicy size="100MB" />
            <TimeBasedTriggeringPolicy/>
        </Policies>
        <DefaultRolloverStrategy max="20" />
    </RollingFile>
 
  </Appenders>
  <Loggers>
        <Logger name="org.myapp." level="trace" additivity="false"> 
        <AppenderRef ref="RollingFile"/> 
        <AppenderRef ref="Console"/>
    </Logger>
    <Root level="trace">
        <AppenderRef ref="Console"/>
        <AppenderRef ref="RollingFile"/>
    </Root>
    
    </Loggers>
</Configuration>

In this case logging events are routed to the Appender and filtered there.在这种情况下,日志事件被路由到 Appender 并在那里过滤。

Note that when you use either of these configurations the tests Log4j performs to determine if logging is enabled will return true (since it is).请注意,当您使用其中任何一种配置时,Log4j 执行以确定是否启用日志记录的测试将返回 true(因为它是)。 That means you will be constructing lots of log events that may not get logged since Log4j doesn't know they won't be consumed by any appender.这意味着您将构建许多可能不会被记录的日志事件,因为 Log4j 不知道它们不会被任何附加程序消耗。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM