log4j2打印单独文件中的每个级别的日志 [英] log4j2 to print each level logs in seperate file

查看:79
本文介绍了log4j2打印单独文件中的每个级别的日志的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我需要在单独的文件中打印每个级别的日志.例如,仅调试消息应在调试文件中打印,而其他级别的日志则不应在调试文件中打印. 我是日志新手,所以您可以更正代码.

I need to print each level logs in a seperate file. For example, Debug msg alone should print in debug file and not other level logs should print in debug file.. I am new to logs , so can you correct the code.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration monitorinterval="30" status="info" strict="true">
    <Properties>
        <Property name="debug">D://logs/debug.log</Property>
        <Property name="info">D://logs/info.log</Property>
        <Property name="warn">D://logs/warn.log</Property>
        <Property name="error">D://logs/error.log</Property>
        <Property name="fatal">D://logs/fatal.log</Property>
    </Properties>
    <Appenders>    
        <Appender type="File" name="Debug_file" fileName="${debug}">
            <Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
        </Appender>
        <Appender type="File" name="Info_file" fileName="${info}">
            <Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
        </Appender>
        <Appender type="File" name="Warn_file" fileName="${warn}">
            <Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
        </Appender>
        <Appender type="File" name="Error_file" fileName="${error}">
            <Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
        </Appender>
        <Appender type="File" name="Fatal_file" fileName="${fatal}">
            <Layout type="PatternLayout" pattern="%d %p %C{1.} [%t] %m%n" />
        </Appender>      
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="File" />
        </Root>
    </Loggers>
</Configuration>

推荐答案

至少有2种不同的方法可以实现所需的目标.一种方法是使用LevelRangeFilter(请参阅

There are at least 2 different ways you could achieve what you want. One way is to use the LevelRangeFilter (see log4j2 javadoc) as shown in the following example configuration:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="LOG_PATTERN">%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
    </Properties>
    <Appenders>
        <File name="TraceFile" fileName="logs/Trace.log" immediateFlush="true"
            append="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
            <LevelRangeFilter minLevel="TRACE" maxLevel="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
        </File>
        <File name="DebugFile" fileName="logs/Debug.log" immediateFlush="true"
            append="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
            <LevelRangeFilter minLevel="DEBUG" maxLevel="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
        </File>
        <File name="InfoFile" fileName="logs/Info.log" immediateFlush="true"
            append="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
            <LevelRangeFilter minLevel="INFO" maxLevel="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
        </File>
        <File name="WarnFile" fileName="logs/Warn.log" immediateFlush="true"
            append="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
            <LevelRangeFilter minLevel="WARN" maxLevel="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
        </File>
        <File name="ErrorFile" fileName="logs/Error.log" immediateFlush="true"
            append="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
            <LevelRangeFilter minLevel="ERROR" maxLevel="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
        </File>
        <File name="FatalFile" fileName="logs/Fatal.log" immediateFlush="true"
            append="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
            <LevelRangeFilter minLevel="FATAL" maxLevel="FATAL" onMatch="ACCEPT" onMismatch="DENY"/>
        </File>
    </Appenders>

    <Loggers>
        <Root level="TRACE">
            <AppenderRef ref="TraceFile" />
            <AppenderRef ref="DebugFile" />
            <AppenderRef ref="InfoFile" />
            <AppenderRef ref="WarnFile" />
            <AppenderRef ref="ErrorFile" />
            <AppenderRef ref="FatalFile" />
        </Root>
    </Loggers>
</Configuration>

以上配置可确保每个附加程序仅接受仅一个级别的日志事件.

The above configuration ensures that each appender accepts log events of exactly one level only.

另一种选择是使用RoutingAppender(请参见 log4j2手册),如以下配置所示:

Another option is to use the RoutingAppender (see log4j2 manual) as demonstrated in the following configuration:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="LOG_PATTERN">%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
    </Properties>
    <Appenders>
        <File name="TraceFile" fileName="logs/Trace.log" immediateFlush="true"
            append="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
        </File>
        <File name="DebugFile" fileName="logs/Debug.log" immediateFlush="true"
            append="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
        </File>
        <File name="InfoFile" fileName="logs/Info.log" immediateFlush="true"
            append="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
        </File>
        <File name="WarnFile" fileName="logs/Warn.log" immediateFlush="true"
            append="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
        </File>
        <File name="ErrorFile" fileName="logs/Error.log" immediateFlush="true"
            append="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
        </File>
        <File name="FatalFile" fileName="logs/Fatal.log" immediateFlush="true"
            append="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
        </File>

        <Routing name="Routing">
            <Routes>
                <Script name="RoutingInit" language="JavaScript"><![CDATA[
                    logEvent.getLevel();]]>
                </Script>
                <Route ref="TraceFile" key="TRACE" />
                <Route ref="DebugFile" key="DEBUG" />
                <Route ref="InfoFile" key="INFO" />
                <Route ref="WarnFile" key="WARN" />
                <Route ref="ErrorFile" key="ERROR" />
                <Route ref="FatalFile" key="FATAL" />
            </Routes>
        </Routing>
    </Appenders>

    <Loggers>
        <Root level="TRACE">
            <AppenderRef ref="Routing" />
        </Root>
    </Loggers>
</Configuration>

在此配置中,附加程序对日志事件的级别无动于衷. RoutingAppender是有关哪个事件进入哪个附加程序的决策者.我倾向于使用RoutingAppender,因为可以利用您自己的查找,它将返回名称与日志事件相关联的级别,您可以使用该查找动态地动态创建附加程序.查找和修改后的配置代码如下所示:

In this configuration the appenders are indifferent toward the level of the log event. The RoutingAppender is the decision maker with regard to which events go to which appender. I tend to prefer using RoutingAppender because it can be made more compact by taking advantage of the log4j2 plugin system. If you add your own lookup which returns the name of the level associated with the log event you can use that lookup to dynamically create appenders on the fly. The code for the lookup and the revised configuration are shown below:

import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.lookup.StrLookup;

@Plugin(name = "level", category = "Lookup")
public class LevelLookup implements StrLookup{
    /**
     * Lookup the value for the key.
     * @param key  the key to be looked up, may be null
     * @return The value for the key.
     */
    public String lookup(String key) {
        return null;
    }


    /**
     * Lookup the value for the key using the data in the LogEvent.
     * @param event The current LogEvent.
     * @param key  the key to be looked up, may be null
     * @return The value associated with the key.
     */
    public String lookup(LogEvent event, String key) {
        return event.getLevel().name();
    }
}

以下是修改后的配置,它利用了新的查找功能:

Here is the revised configuration that takes advantage of the new lookup:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Properties>
        <Property name="LOG_PATTERN">%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n</Property>
    </Properties>
    <Appenders>
        <Routing name="Routing">
            <Routes pattern="$${level:}">
                <Route>
                    <File name="${level:}File" fileName="logs/${level:}.log" immediateFlush="true"
                        append="true">
                        <PatternLayout pattern="${LOG_PATTERN}" />
                    </File>
                </Route>
            </Routes>
        </Routing>
    </Appenders>

    <Loggers>
        <Root level="TRACE">
            <AppenderRef ref="Routing" />
        </Root>
    </Loggers>
</Configuration>

与其他配置一样,这将根据日志事件的日志级别将日志消息发送到文件.例如,INFO级事件将记录到logs/INFO.log

As with the other configurations this will send log messages to a file based on the log level of the log event. For example INFO level events will be logged to logs/INFO.log

希望对您有帮助.

这篇关于log4j2打印单独文件中的每个级别的日志的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆