📜  log4j-体系结构(1)

📅  最后修改于: 2023-12-03 15:17:26.551000             🧑  作者: Mango

Log4j体系结构

Log4j是一个广泛使用的日志实用程序,可以帮助程序员在应用程序中实现可扩展的日志记录。它提供了一个简单的配置机制,可以根据需要输出不同级别的日志消息。Log4j具有丰富的体系结构,包括以下组件:

Logger

Logger是Log4j的核心组件之一,用于生成日志消息并将其发送到为其配置的Appenders。 Logger有不同的级别(例如DEBUG、INFO、WARN、ERROR等),可以根据需要输出不同级别的日志消息。Logger还可用于过滤消息,以便只记录特定类型的消息。

以下是创建Logger的示例代码:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class MyClass {
    private static final Logger logger = LogManager.getLogger(MyClass.class);
    // ...
}
Appender

Appender是Log4j的另一个核心组件,用于处理日志消息并将其发送到日志输出。 Appender可以附加到Logger,以便每个消息都在多个位置进行记录。Log4j提供多个内置的Appender,例如ConsoleAppender、FileAppender和SocketAppender,还可以自定义新的Appender。

以下是创建FileAppender的示例代码:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <File name="File" fileName="logs/app.log">
            <PatternLayout>
                <pattern>%d %p %c{1.} [%t] %m%n</pattern>
            </PatternLayout>
        </File>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="File" />
        </Root>
    </Loggers>
</Configuration>
Layout

Layout是Log4j的另一个重要组件,用于格式化日志消息。 Log4j提供多个内置的Layout,例如PatternLayout、HTMLLayout和JSONLayout,也可以自定义新的Layout。

以下是创建PatternLayout的示例代码:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
Filter

Filter是Log4j的另一个组件,用于对消息进行过滤。 Filter可以附加到Appender或Logger,以便选择性地记录或忽略特定类型的消息。Log4j提供多个内置的Filter,例如LevelRangeFilter、ThreadContextMapFilter和MarkerFilter,还可以自定义新的Filter。

以下是创建LevelRangeFilter的示例代码:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
            <LevelRangeFilter minLevel="DEBUG" maxLevel="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>
Context

Context是Log4j的一个组件,用于在整个Log4j实例之间共享数据。 Context有许多用途,例如用于记录跟踪ID或记录应用程序的运行信息。在Log4j中,可以使用ThreadContext来访问上下文。

以下是使用ThreadContext访问Context的示例代码:

import org.apache.logging.log4j.ThreadContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class MyClass {
    private static final Logger logger = LogManager.getLogger(MyClass.class);

    public void myMethod() {
        ThreadContext.put("id", "12345");
        logger.info("This message has ID 12345");
        ThreadContext.clearAll();
    }
}
配置

Log4j的所有组件都可以配置为满足特定需求。可以使用XML、JSON或YAML文件来配置Log4j。此外,还可以使用编程方式来配置Log4j。

以下是从XML文件配置Log4j的示例代码:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %p %c{1.} [%t] %m%n"/>
            <LevelRangeFilter minLevel="DEBUG" maxLevel="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="debug">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

Log4j的体系结构是非常灵活的,可以根据需要进行调整和定制,以满足各种需求。