Java日志系统log4j2的使用配置和异步日志使用

这篇具有很好参考价值的文章主要介绍了Java日志系统log4j2的使用配置和异步日志使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. log4j2

1.1 log4j2介绍

Apache Log4j2是Log4j的升级版,参考了logback一些优秀的设计,并且修复了logback的一些问题,而且性能上也有了重大提升,主要有:

  • log4j2对Appender提供了一些异常处理机制
  • 参考了logback的设计,提供自动刷新参数配置,可以自动重载配置而不用重启应用
  • log4j2利用缓冲区和重用对象,几乎不会产生临时对象,从而实现无垃圾机制

1.2 Log4j2入门

虽然Log4j2既是日志门面,也是日志框架。但还是推荐使用流行的日志门面slf4j + 功能强大且性能优越的日志框架log4j2

1.2.1 log4j2(日志门面 + 日志框架)使用

在pom.xml添加依赖

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

        <!-- log4j2日志框架 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.18.0</version>
        </dependency>

程序如下:

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


public class Log4j2Test {
    public static final Logger LOGGER = LogManager.getLogger(Log4j2Test.class);

    public static void main(String[] args) {

        // 默认只打印error及以上级别的日志
        LOGGER.fatal("fatal");
        LOGGER.error("error");
        LOGGER.warn("warn");
        LOGGER.info("info");
        LOGGER.debug("debug");
        LOGGER.trace("trace");

    }
}

运行程序,结果如下:

17:51:14.737 [main] FATAL Log4j2Test - fatal
17:51:14.744 [main] ERROR Log4j2Test - error

默认只打印error及以上级别的日志。后面可以通过log4j2.xml日志配置文件进行日志级别和日志输出格式的配置

1.2.2 slf4j + log4j2使用

在pom.xml添加依赖

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

        <!-- log4j2日志框架 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.18.0</version>
        </dependency>

        <!-- slf4j日志门面 -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.36</version>
        </dependency>

        <!--log4j2的适配器,为slf4j绑定日志框架 -->
        <!-- 依赖org.slf4j:slf4j-api:1.7.25 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.18.0</version>
        </dependency>

程序如下:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


public class Log4j2Test {

    public final static Logger LOGGER = LoggerFactory.getLogger(Log4j2Test.class);

    public static void main(String[] args) {

        // 默认只打印error级别的日志
        LOGGER.error("error");
        LOGGER.warn("warn");
        LOGGER.info("info");
        LOGGER.debug("debug");
        LOGGER.trace("trace");

    }
}

运行程序,结果如下:

18:07:44.628 [main] ERROR Log4j2Test - error

默认只打印error级别的日志。后面可以通过log4j2.xml日志配置文件进行日志级别和日志输出格式的配置

1.3 Log4j2配置

在classpath,比如resources目录下,新建log4j2.xml日志配置文件。内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--  status="warn": 日志框架本身的输出日志级别, 默认是warn。日志框架本身的日志输出到控制台 -->
<!-- monitorInterval="5":自动加载log4j2.xml文件的时间间隔, -->
<Configuration status="warn" monitorInterval="5">

    <!-- 定义属性,供其它标签引用。引用方式${name} -->
    <properties>
        <property name="LOG_HOME">C:/Users/dell/Desktop/java11Test/logs</property>
    </properties>

    <!-- 日志处理器 -->
    <Appenders>
        <!-- 控制台输出appender。可选值:SYSTEM_OUT、SYSTEM_ERR -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--
            %d{yyyy-MM-dd HH:mm:ss.SSS}: 日志日期及其格式
            %t/%thread: 日志执行的线程
            %-5level: 日志级别输出占5个字符,左对其
            %c{36}: 日志执行的类的全限定名, 深度为36
            %M: 日志执行的方法名
            %L: 日志执行的具体行号
            %l: 日志执行的位置信息
            %m/%msg: 日志的消息
            %n: 换行符
            -->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %l --- %msg%n" />
        </Console>

        <!-- 日志文件输出appender -->
        <File name="File" fileName="${LOG_HOME}/myFile.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %l --- %msg%n" />
        </File>

        <!-- 使用随机读写流的日志文件输出appender,性能高 -->
        <RandomAccessFile name="RandomAccessFile" fileName="${LOG_HOME}/myAccessFile.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %l --- %msg%n" />
        </RandomAccessFile>

        <!-- 按照一定规则拆分日志文件的appender -->
        <!-- filePattern: 拆分后的文件名。拆分规则如下:
        以天为单位,拆分成文件夹
        一天内按照分钟为单位生成一个日志文件。和policy的TimeBasedTriggeringPolicy对应
        日志文件到达指定大小,再按照指定大小进行拆分,文件序号从1开始递增。和policy的SizeBasedTriggeringPolicy对应
        -->
        <RollingFile name="RollingFile" fileName="${LOG_HOME}/myRollingFile.log" filePattern="${LOG_HOME}/$${date:yyyy-MM-dd}/myRollingFile-%d{yyyy-MM-dd-HH-mm}-%i.log">
            <!-- 日志级别过滤器。高于等于debug级别的(比如info)进行日志记录,低于debug级别的进行拦截 -->
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY" />
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %l --- %msg%n" />
            <!-- 日志消息拆分的规则 -->
            <Policies>
                <!-- 在系统启动时,进行拆分,生成一个新的日志文件进行新日志消息的记录。原来的日志文件按照日志记录时间(非启动时间)归档成一个新的归档日志文件 -->
                <OnStartupTriggeringPolicy />
                <!-- 按照文件大小进行拆分 -->
                <SizeBasedTriggeringPolicy size="10 MB" />
                <!-- 按照时间间隔拆分,规则根据filePattern定义的 -->
                <TimeBasedTriggeringPolicy />
            </Policies>
            <!-- 在同一分钟下,文件的个数限定为30个,超过则进行滚动覆盖(文件序号最大为30) -->
            <DefaultRolloverStrategy max="30" />
        </RollingFile>
    </Appenders>

    <Loggers>
        <!-- 配置日志级别 -->
        <Root level="INFO">
            <!-- 指定日志输出appender。不指定File、RandomAccessFile、RollingFile,也会创建空日志文件 -->
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

1.4 Log4j2异步日志

同步日志处理流程图如下:

log4j2异步日志配置,Java,log4j2,log4j,日志系统,Java,异步日志异步日志处理流程图如下:

log4j2异步日志配置,Java,log4j2,log4j,日志系统,Java,异步日志log4j2的异步日志带来了很大的性能提升。为了实现异步日志需要在pom.xml添加如下依赖:

        <!-- org.apache.logging.log4j:log4j:2.18.0依赖com.lmax:disruptor:3.4.4 -->
        <!-- 异步日志依赖 -->
        <dependency>
            <groupId>com.lmax</groupId>
            <artifactId>disruptor</artifactId>
            <version>3.4.4</version>
        </dependency>

提供了两种异步日志实现方法,一个是AsyncLogger(对应Logger组件,推荐使用),一个是AsyncAppender(对应Appender组件)

log4j2的全局异步AsyncLogger性能最好,第二个是混合异步AsyncLogger,性能最差的是AsyncAppender(和同步日志相比没有什么性能提升。和logback性能一样)

如果使用异步日志,全局异步AsyncLogger、混合异步AsyncLogger、AsyncAppender,不要同时使用。否则会使用性能较低的一种异步方式

1.4.1 全局异步AsyncLogger

所有appender的所有日志级别的日志都异步的记录,不需要改动log4j2.xml配置文件。只需要在classpath,比如resources目录下,新建log4j2.component.properties配置文件。内容如下:

Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

1.4.2 混合异步AsyncLogger

可以同时使用同步日志和异步日志,这使得日志的配置方式更加灵活

log4j2.xml配置如下:文章来源地址https://www.toymoban.com/news/detail-780833.html

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="5">

    <properties>
        <property name="LOG_HOME">C:/Users/dell/Desktop/java11Test/logs</property>
    </properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %l --- %msg%n" />
        </Console>
    </Appenders>

    <Loggers>
        <!-- 自定义异步logger对象, name必须是LoggerFactory.getLogger(Log4j2Test.class)对应 -->
        <!-- 如果设置includeLocation=true, 开启日志记录行号信息会急剧降低异步日志的性能,比同步日志还要慢 -->
        <!-- 这里设置includeLocation=false,则PatternLayout的%l将不会打印出来 -->
        <!-- additivity="false": 不再继承RootLogger对象. 这里建议强制设置成false -->
        <AsyncLogger name="Log4j2Test" level="WARN" includeLocation="false" additivity="false">
            <AppenderRef ref="Console"/>
        </AsyncLogger>

        <!-- RootLogger是同步的。除Log4j2Test外,其它名称的logger使用RootLogger进行输出 -->
        <Root level="INFO">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

输出如下:

2022-07-10 15:55:23.037 [main] [ERROR]  --- error
2022-07-10 15:55:23.039 [main] [WARN ]  --- warn

可以看到打印了WARN级别的日志,且没有打印日志执行的位置信息

1.4.3 AsyncAppender

log4j2.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="5">

    <properties>
        <property name="LOG_HOME">C:/Users/dell/Desktop/java11Test/logs</property>
    </properties>

    <Appenders>
        <File name="File" fileName="${LOG_HOME}/myFile.log">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] %l --- %msg%n" />
        </File>

        <!-- AsyncAppender引用appender -->
        <Async name="Async">
            <AppenderRef ref="File"/>
        </Async>
    </Appenders>

    <Loggers>
        <Root level="INFO">
            <!-- 直接引用AsyncAppender -->
            <AppenderRef ref="Async" />
        </Root>
    </Loggers>
</Configuration>

到了这里,关于Java日志系统log4j2的使用配置和异步日志使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入理解 SpringBoot 日志框架:从入门到高级应用——(五)Log4j2配置文件详解

    Log4j2 官方文档:https://logging.apache.org/log4j/2.x/manual/index.html Log4j2 是一个Java日志框架,用于记录应用程序在运行时的信息。它是 Log4j 的升级版本,提供了更快的处理速度,更快的日志记录和更丰富的日志记录功能,并支持异步日志记录,减少了对应用程序性能的影响。它可以

    2024年02月05日
    浏览(45)
  • 应用中日志的优雅使用(整合log4j2与SLF4J)

    应用中不可直接使用日志系统( Log4j、 Logback) 中的 API,而应依赖使用日志框架( SLF4J、 JCL–Jakarta Commons Logging) 中的 API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。 日志框架( SLF4J、 JCL–Jakarta Commons Logging)的使用方式(推荐使用 SLF4J) 所有

    2023年04月09日
    浏览(42)
  • Spring Boot中集成各种日志框架Logback、Log4j2和Java Util Logging

    Spring Boot支持多种日志框架,包括Logback、Log4j2和Java Util Logging(JUL)。在Spring Boot中,可以通过简单的配置来集成这些热门的日志框架。 下面将详细说明如何集成Logback、Log4j2和Java Util Logging,并提供相应的源代码示例。 集成Logback: Logback是Spring Boot默认的日志框架,它提供了高

    2024年02月05日
    浏览(57)
  • java 项目配置slf4j - log4j2

    2024年02月13日
    浏览(43)
  • springboot 日志管理之 log4j2

    1、log4j2 简介         Apache Log4j2是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些问题。 被誉为是目前最优秀的Java日志框架。 2、项中引入 log4j2 的方式 2.1、springboot 项目中 2.2、普通 java 项目中 3、在项

    2024年01月15日
    浏览(47)
  • SpringBoot整合Log4j2日志框架

    SpringBoot底层默认使用logback日志框架。 切换使用Log4j2日志框架。 pom.xml配置 log4j2-spring.xml 文件命名固定 log4j2-spring.xml ,让SpringBoot加载配置文件。 文件名为 log4j2.xml ,文件将绕过SpringBoot直接调用日志框架。 控制台日志输出信息 日志文件生成 说明:日志文件生成在当前项目下

    2024年03月09日
    浏览(49)
  • 【springboot】--集成log4j2日志功能

    springboot2.0版本默认集成logback日志框架,由于项目业务采集各种日志(系统日志、接口调用日志、业务日志)等,需要做一些定制化的业务。为了,这里介绍如何集成log4j2,按照规格输出日志,另外按照要求输出成文件。下面将具体介绍! pom引入

    2024年02月12日
    浏览(57)
  • log4j2同步日志引发的性能问题

    在项目的性能测试中,相关的接口的随着并发数增加,接口的响应时间变长,接口吞吐不再增长,应用的CPU使用率较高。 谁导致的CPU较高,阻塞接口TPS的增长?接口的响应时间的调用链分布是什么样的,有没有慢的点? 1)使用火焰图分析应用的CPU如下,其中log4j2日志占了

    2024年02月08日
    浏览(38)
  • Linux服务器使用Redis作为数据缓存,并用log4j2进行日志记录

    前言 个人网站使用Vue作为前端,SpringBoot作为后端,MySQL作为数据库,但前端每次请求都会从MySQL数据库中读取数据,而MySQL数据库的数据是存储于服务器磁盘中,所以响应速度有一定影响。之前了解过一点Redis数据库,该数据库数据存储于内存中(也可以持久化于磁盘中),数

    2024年02月08日
    浏览(54)
  • Springboot日志框架logback与log4j2

    目录 Springboot日志使用 Logback日志 日志格式 自定义日志格式 日志文件输出 Springboot启用log4j2日志框架 Springboot底层是使用slf4j+logback的方式进行日志记录 trace:级别最低 debug:调试级别的,常用于跟踪程序的进展 info:普通的打印信息(默认的日志级别) warn:警告级别,不影响

    2024年01月19日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包