log4j2日志实现

1.导入依赖

log4j2也是一种日志门面技术,但主流依然是slf4j

已经导入了slf4j的日志门面依赖,为什么还要导入log4j2的日志门面,如下:

1.导入slf4j的日志门面
2.导入log4j2的适配器
3.导入log4j2的日志门面
4.导入log4j2的日志实现

执行原理:
    slf4j门面调用的是log4j2的门面,再由log4j2的门面调用log4j2的实现
        <!-- slf4j日志门面 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <!-- log4j适配器 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.12.1</version>
        </dependency>

        <!-- log4j2日志门面 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.12.1</version>
        </dependency>

        <!-- log4j2日志实现 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.12.1</version>
        </dependency>

 异步日志的实现方式-->1

异步日志实现(单独分配线程做日志的记录)
    方式1:使用AsyncAppender的方式

    1.添加异步日志依赖
    2.在Appenders标签中,对于异步进行配置
        使用Async标签
    3.rootlogger引用Async

 异步日志依赖

        <!-- 异步日志依赖 -->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.3.7</version>
        </dependency>

 log4j2.xml配置

    <!-- 配置appender -->
    <Appenders>

        <!-- 配置控制台输出 -->
        <Console name="consoleAppender" target="SYSTEM_OUT">

        </Console>

        <!-- 配置异步日志 -->
        <Async name="myAsync">
            <!--将控制台输出做异步的操作-->
            <AppenderRef ref="consoleAppender"/>
        </Async>

    </Appenders>

    <!-- 配置logger -->
    <Loggers>

        <!-- 配置rootlogger -->
        <Root level="trace">
            <!-- 引用Appender -->
            <AppenderRef ref="myAsync"/>
        </Root>

    </Loggers>

 异步日志的实现方式-->2

异步日志实现(单独分配线程做日志的记录)
    方式2:使用AsyncLogger的方式
    全局异步
        所有的日志都是异步的日志记录,在配置文件上不用做任何的改动
        只需要在类路径resources下添加一个properties属性文件,做一步配置即可
        文件名要求是:log4j2.component.properties
        内容是:Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

需求: 

异步日志实现(单独分配线程做日志的记录)
    方式2:使用AsyncLogger的方式
    混合异步:
        可以在应用中同时使用同步日志和异步日志,这使得日志的配置及输出会更加的灵活

    需求:
        假设我们现在有自定义的logger -- com.bjpowernode
        让自定义的logger是异步的
        让rootlogger是同步的

    注意:
        在做测试前,一定要将全局的异步配置注释掉

    对于当前的logger,Log4j2Test01.class
    Log4j2Test01本身就是在我们自定义的logger路径下的

    注意:
        如果使用异步日志
            AsyncAppender、AsyncLogger不要同时出现,没有这个需求,效果也不会叠加
            如果同时出现,那么效率会以AsyncAppender为主

            AsyncLogger的全局异步和混合异步也不要同时出现,没有这个需求,效果也不会叠加

test代码: 

        Logger logger = LoggerFactory.getLogger(Log4j2Test01.class);

        //日志的记录
        for (int i = 0; i < 2000; i++) {

            logger.error("error信息");
            logger.warn("warn信息");
            logger.info("info信息");
            logger.debug("debug信息");
            logger.trace("trace信息");

        }

        //系统业务逻辑
        //在进行异步日志实现时加入,体现出效果
        for (int i = 0; i < 1000; i++) {

            System.out.println("------------------");

        }

 完整的log4j2.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>

    <!--

        配置全局通用属性

    -->
    <properties>
        <property name="logDir">D://test</property>
    </properties>

    <!-- 配置appender -->
    <Appenders>

        <!-- 配置控制台输出 -->
        <Console name="consoleAppender" target="SYSTEM_OUT">

        </Console>

        <!-- 配置文件输出-->
        <File name="fileAppender" fileName="${logDir}//log4j2.log">

            <!-- 配置文件输出格式 -->
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>

        </File>

        <!--
            按照指定规则来拆分日志文件

            fileName:日志文件的名字
            filePattern:日志文件拆分后文件的命名规则
                        $${date:yyyy-MM-dd}:根据日期当天,创建一个文件夹
                                    例如:2021-01-01这个文件夹中,记录当天的所有日志信息(拆分出来的日志放在这个文件夹中)
                                          2021-01-02这个文件夹中,记录当天的所有日志信息(拆分出来的日志放在这个文件夹中)
          rollog-%d{yyyy-MM-dd-HH-mm}-%i.log
                        为文件命名的规则:%i表示序号,从0开始,目的是为了让每一份文件名字不会重复
        -->
        <RollingFile name="rollingFile" fileName="${logDir}/rollog.log"
                        filePattern="${logDir}/$${date:yyyy-MM-dd}/rollog-%d{yyyy-MM-dd-HH-mm}-%i.log">

            <!-- 日志消息格式 -->
            <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} %m%n"/>

            <Policies>

                <!-- 在系统启动时,触发拆分规则,产生一个日志文件 -->
                <OnStartupTriggeringPolicy/>

                <!-- 按照文件的大小进行拆分 -->
                <SizeBasedTriggeringPolicy size="10KB"/>

                <!-- 按照时间节点进行拆分 拆分规则就是filePattern-->
                <TimeBasedTriggeringPolicy/>

            </Policies>

            <!-- 在同一目录下,文件的个数限制,如果超出了设置的数值,则根据时间进行覆盖,新的覆盖旧的规则-->
            <DefaultRolloverStrategy max="30"/>

        </RollingFile>

        <!-- 配置异步日志 -->
        <!--<Async name="myAsync">
            &lt;!&ndash;将控制台输出做异步的操作&ndash;&gt;
            <AppenderRef ref="consoleAppender"/>
        </Async>-->

    </Appenders>


    <!-- 配置logger -->
    <Loggers>

        <!-- 自定义logger,让自定义的logger为异步logger -->
        <!--

            includeLocation="false"
            表示去除日志记录中的行号信息,这个行号信息非常的影响日志记录的效率(生产中都不加这个行号)
            严重的时候可能记录的比同步的日志效率还有低

            additivity="false"
            表示不继承rootlogger

        -->
        <AsyncLogger name="com.bjpowernode" level="trace"
                            includeLocation="false" additivity="false">

            <!-- 将控制台输出consoleAppender,设置为异步打印 -->
            <AppenderRef ref="consoleAppender"/>

        </AsyncLogger>

        <!-- 配置rootlogger -->
        <Root level="trace">

            <!-- 引用Appender -->
            <!--<AppenderRef ref="consoleAppender"/>-->
            <!--<AppenderRef ref="fileAppender"/>-->
            <!--<AppenderRef ref="rollingFile"/>-->
            <!--<AppenderRef ref="myAsync"/>-->
            <AppenderRef ref="consoleAppender"/>
        </Root>

    </Loggers>

</Configuration>

おすすめ

転載: blog.csdn.net/DDDM456/article/details/127763026