log4j2的使用

news2024/11/27 18:25:57

Log4j2的使用

概述

Apache Log4j 2是对Log4j的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:

  • 异常处理,在logback中,Appender中的异常不会被应用感知到,但是在log4j2中,提供了一些异常处理机制。
  • 性能提升, log4j2相较于log4j 和logback都具有很明显的性能提升,后面会有官方测试的数据。
  • 自动重载配置,参考了logback的设计,当然会提供自动刷新参数配置,最实用的就是我们在生产上可以动态的修改日志的级别而不需要重启应用。
  • 无垃圾机制,log4j2在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的jvm gc。

官网https://logging.apache.org/log4j/2.x/

使用

  1. 导入依赖
<!-- Log4j2 门面API-->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.11.1</version>
</dependency>
<!-- Log4j2 日志实现 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.1</version>
</dependency>
</dependencies>
  1. Java 代码

首先是获取Logger对象

private static Logger logger = LogManager.getLogger(xxx.class);

接下来直接使用即可,来演示一下没有配置文件的硬编码程序

Logger logger = LogManager.getLogger(testLog4j2.class);
logger.trace("我是TRACE级别的日志");
logger.debug("我是DEBUG级别的日志");
logger.info("我是INFO级别的日志");
logger.warn("我是WARN级别的日志");
logger.error("我是ERROR级别的日志");
logger.fatal("我是FATAL级别的日志");

这样运行之后,会看到只有error和fatal的日志信息输出出来了,Log4j2默认的日志级别是ERROR(因为缺省配置文件的优先级默认为Error)

日志级别

在Log4j2中,定义了6个日志级别

级别有小到大排序为:trace<debug<info<warn<error<fatal

  • trace: 程序追踪级别,一般不用
  • debug: 调试的日志信息,一般作为最低级别的日志信息使用
  • info: 输出一下你感兴趣的或者重要的信息,这个用的最多了。
  • warn: 警告日志信息,警告不是错误,程序依然能正常运行。
  • error: 错误信息,程序仍然会继续运行
  • fatal: 级别最高的日志信息,这种级别的日志应当终止停止程序了

日志级别只起信息一个标识作用,真正的处理需要视情况而定。

配置文件

log4j2的配置文件名称是log4j2.xml

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

    <!--定义Log4j2的组件-->
    <Appenders>
        <!--        定义控制台输出的组件-->
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] [%-5level] %c{36}:%L --- %m%n"/>
        </Console>

        <!--        定义文件输出的组件-->
        <File name="file" fileName="D:/LOGS/myfile.log">
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n"/>
        </File>

        <!--        定义一个文件输出日志组件-->
        <RandomAccessFile name="accessFile" fileName="D:/LOGS/myAcclog.log">
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %m%n"/>
        </RandomAccessFile>

        <!--        定义一个可滚动的文件输出日志组件-->
        <RollingFile name="rollingFile" fileName="D:/LOGS/myrollog.log"
                     filePattern="D:/LOGS/$${date:yyyy-MM-dd}/myrollog-%d{yyyy-MM-dd-HH-mm}-%i.log">
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] %l %c{36} - %msg%n"/>
            <Policies>
                <OnStartupTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="10 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
            <DefaultRolloverStrategy max="30"/>
        </RollingFile>

    </Appenders>

    <Loggers>
        <!--        设置日志级别是TRACE,等于以及高于此级别的日志才会输出-->
        <Root level="trace">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="file"/>
            <AppenderRef ref="accessFile"/>
            <AppenderRef ref="rollingFile"/>
        </Root>
    </Loggers>
</configuration>

导入配置文件后,再运行上面的测试程序,会看到控制台输出

image-20230105225942645

还可以看到文件日志

image-20230105230521216

image-20230105230523783

配置文件详解

参考文章:https://juejin.cn/post/6972538940855173151

Log4j 2.x版本不再支持像1.x中的.properties后缀的文件配置方式,2.x版本配置文件后缀名只能为".xml",“.json"或者”.jsn"。

常用的是XML格式的配置文件。

我们在日常开发中,使用XML类型的配置文件,注意log4j2的配置文件名必须是log4j2.xml

<configuration>

根标签,有两个属性,有两个子节点<Appenders><Loggers>

  • status,用来指定log4j本身的打印日志的级别,不是我们自定义的程序中的日志级别,是log4j本身日志的级别。
  • monitorInterval,用于指定log4j自动重新配置的检测间隔时间,单位是s,最小是5s。每隔几秒去检测配置文件是否更改,如果更改了就自动重新配置
<Appenders>

这个标签下放的都是日志组件,常见的有三种子节点

<Console>
  • 用来定义日志输出到控制台的组件标签
  • name属性,用来指定标签的名称,方便后面引用
  • target属性,用来指定控制台输出的方式,
    • SYSTEM_OUT是控制台常规输出
    • SYSTEM_ERR是控制台输出报错信息的一种方式,信息显示为红色
  • 子节点<PatternLayout>设置日志信息的输出格式,此标签中使用pattern属性来设置日志的打印格式,需要按照格式化符的规范。关于格式化符,可以看这篇文章https://blog.csdn.net/snail_bi/article/details/103496697
<File>
  • 此标签是用来定义日志文件输出的组件标签
  • name属性
  • fileName属性,设置日志文件的名称(日志文件的路径)
  • 子节点<PatternLayout>设置日志信息格式的标签,使用此标签中的pattern属性来格式化,按照格式化符的规范
<RollingFile>
  • 此标签用来定义滚动日志文件的标签,当日志文件超出某个规则后会自动创建新的日志文件,常用来限制日志文件的大小,当日志文件达到或超过某个大小,自动创建新的日志文件
  • name属性
  • fileName属性:用来指定日志文件名称(带路径名称)
  • filePattern属性:新建的日志文件的名称(带路径名称)
  • 子节点**<PatternLayout>标签**,设置日志信息的格式化
  • 子节点**<Policies>**,滚动日志的策略,当达到什么条件时新建日志文件
    • <Policies>子节点<TimeBasedTriggeringPolicy>标签,基于时间的滚动策略,interval属性用来指定多久滚动一次,默认是1h,modulate=true用来调整时间
    • <Policies>子节点<SizeBasedTriggeringPolicy>基于指定文件大小的滚动策略,size属性用来定义每个日志文件的大小
    • <Policies>子节点<OnStartupTriggeringPolicy>,每次重新启动时触发滚转,但仅当文件大小大于零时才触发。
  • 子节点<DefaultRolloverStrategy>用来指定同一个文件夹下最多有几个日志文件时开始删除最旧的,创建新的(通过max属性)
  • 子节点<ThresholdFilter>标签:level属性表示匹配的日志级别,onMatch属性表示匹配设定的日志级别后是DENY还是ACCEPT,onMismatch属性表示不匹配设定的日志级别是DENY还是ACCEPT还是NEUTRAL。DENY时就会不记录此日志,ACCEPT表示记录此日志,NEUTRAL表示中立。
<Loggers>

常见的子节点有两种:<Root><Logger>.

<Root>

<Root>节点用来指定项目的根日志,如果没有单独指定Logger,那么就会默认使用该Root日志输出

  • level属性:设置项目的日志输出级别,共有8个级别,按照从低到高为:Trace < Debug < Info < Warn < Error < Fatal,ALL表示输出所有级别的日志信息都输出,OFF表示关闭项目日志输出功能。
<Logger>

Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。

  • level属性:日志输出级别,共有8个级别,按照从低到高为:Trace < Debug < Info < Warn < Error < Fatal,ALL表示输出所有级别的日志信息都输出,OFF表示关闭项目日志输出功能。
  • name:用来指定该Logger所适用的类或者类所在的包全路径,继承自Root节点.
<AppenderRef>
  • AppenderRef节点:Root或Logger的子节点,用来指定该日志输出引用哪一个自定义的Appender组件,如果没有指定,就会默认继承自Root。

优化

实际开发中,通常会使用 slf4j + log4j2 进行日志管理;

此时就需要导入slf4j 日志门面、log4j2 适配器、log4j,然后使用 slf4j 方法接口名称来输出日志

<!-- Log4j2 门面API-->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.11.1</version>
</dependency>
<!-- Log4j2 日志实现 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.1</version>
</dependency>


<!-- 使用slf4j 作为日志门面 -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.26</version>
</dependency>
<!-- 使用 log4j2 的适配器进行绑定 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.9.1</version>
</dependency>

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.13.2</version>
    <scope>test</scope>
</dependency>

接下来的SLF4j是一个面向接口的框架,接下来我们在使用时,直接使用SLF4j的接口规范来调用,log4j2是真正底层的实现。

获取Logger对象,使用SLF4j中的工厂

private static final Logger LOGGER = LoggerFactory.getLogger(testSlf4Log4j2.class);

配置文件不用改,仍然是log4j2的配置文件

    private static final Logger LOGGER = LoggerFactory.getLogger(testSlf4Log4j2.class);

    @Test
    public void test(){
//        接下来正常使用即可
        LOGGER.trace("我是一条TRACE级别的日志信息");
        LOGGER.debug("我是一条DEBUG级别的日志信息");
        LOGGER.info("我是一条INFO级别的日志信息");
        LOGGER.warn("我是一条WARN级别的日志信息");
        LOGGER.error("我是一条ERROR级别的日志信息");
    }

image-20230105231534439

注意:引入了SLF4J门面后,所有的规范都是按照SLF4J来的,log4j2才是真正的实现,但是在调用时需要按照SLF4J的规范中的方法来调用,在SLF4J中,日志级别是5个,取消了log4j2中的FATAL级别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/143071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

若依 ruoyi 配置多数据源 生成代码 导出代码

本文相关库说明&#xff1a;vue&#xff08;若依自带库&#xff09;db_game多数据源从库1db_paystore 多数据源从库2多数据源的情况下&#xff0c;想生成其他从库下数据库表对应的代码&#xff0c;但是若依自带的导入表中 是不会查询到从库各数据表信息的(只查询到若依框架对应…

我是这样解决 HBuilderX 安卓基座安装失败的问题

本文简介 点赞 关注 收藏 学会了 记录一个在使用 HBuilderX 开发 App 时遇到的问题。 同步资源失败&#xff0c;未得到同步资源的授权&#xff0c;请停止运行后重新运行&#xff0c;并注意手机上的授权提示 出现这个问题的原因是我把手机的 HBuilder App 给删掉了&#xff…

【自学Java】Java多维数组

Java多维数组 Java多维数组教程 Java 语言 中有 一维数组&#xff0c;也会有多维数组。如果有一个二维数组&#xff0c;那么数组的每个元素将会是一维数组&#xff0c;而不是单纯的元素。如果是一个多维数组&#xff0c;那么每个位置上面对应的是 纬度 - 1 的数组。 因为在平…

从官方文档学习Rabbit与SpringAMQP-乱版

本文也是笔者一直没有去详细学习的一个重要知识点MQ&#xff0c;也是架构中非常重要的一个中间件。 主要从Rabbit官网于Spring AMQP官方文档的角度去详细学习MQ 官方文档 Rabbit Spring AMQP 学习结果 测试项目地址 导读 本文主要从以下两个角度去学习MQ 一、RabbitMQ 官…

【nodejs】模块的加载机制

1、优先从缓存中加载 模块在第一次加载后会被缓存。意味着多次调用require()不会导致模块的代码被执行多次 注意&#xff1a;不论是内置模块、用户自定义模块、还是第三方模块&#xff0c;它们都会优先从缓存中加载&#xff0c;从而提高模块的加载效率。 &#xff08;1&#x…

【求证】 网上配镜靠谱吗?

肯定也有不少的小伙伴 看着网上琳琅满目的“明星同款”眼镜 心动不已 盘算着给自己弄一副“性价比” 最高“明星同款”那么网上配镜究竟靠不靠谱&#xff1f; 潍坊眼科医院眼健康管理中心提醒您 网上配镜需谨慎 网络平台的价格优势非常明显&#xff0c;部分销量高的店铺&#x…

二叉树基础计算

题目专题二叉树节点个数二叉树叶子节点个数二叉树第k 层节点个数二叉树查找值为x 的节点一共有这么几个题目&#xff0c;主要是用来表现题目的性质 分别是求 二叉树节点个数 二叉树叶子节点个数 二叉树第k 层节点个数 二叉树查找值为x 的节点 如果我使用的还是这个二叉树 其…

【linux】基础IO

文章目录一、复习文件相关知识二、复习C文件相关操作1、复习知识点2、复习操作三、文件的系统调用接口1、open2、write3、read小结四、文件描述符1、初步认识2、两个问题知识点3、文件描述符的分配规则五、重定向1、 dup2函数2、myshell里面实现重定向功能3、知识点六、如何理解…

【C++】stack、queue和deque

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《吃透西嘎嘎》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;stack 的…

密集单目 SLAM 的概率体积融合

点击进入—>3D视觉工坊学习交流群笔者简述&#xff1a;这篇论文主要还是在于深度估计这块&#xff0c;深度估计由于硬件设备的不同是有很多方法的&#xff0c;双目&#xff0c;RGBD&#xff0c;激光雷达&#xff0c;单目&#xff0c;其中最难大概就是单目了。在该论文中作者…

Flutter不常用组件(四)

Offstage 创建一个在视觉上隐藏其子项的小部件。隐藏后不占空间。 该组件有以下几个属性&#xff1a; Key? key&#xff1a;标识键bool offstage true&#xff1a;是否隐藏。默认为trueWidget? child&#xff1a;子组件 Center(child: Column(mainAxisAlignment: MainAx…

【设计篇】36 # 如何理解可视化设计原则?

说明 【跟月影学可视化】学习笔记。 可视化设计的四个基本原则 基本原则一&#xff1a;简单清晰原则 我们可以看下面一张图&#xff1a;国际茶叶委员会制作的全球茶叶消费排行榜图表&#xff0c;目的是想说明喝茶最多的不是中国人 我们可以用更简单的直方图方式去表现 基本…

c++11 标准模板(STL)(std::deque)(九)

定义于头文件 <deque> std::deque 修改器 移除末元素 std::deque<T,Allocator>::pop_back void pop_back(); 移除容器的最末元素。 在空容器上调用 pop_back 是未定义的。 指向被擦除元素的迭代器和引用被非法化。尾后迭代器是否被非法化是未指定的。其他迭代…

YOLOv5-common.py文件

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 目录一、任务说明二、导入相关包和配置1.基本组件1.1 autopad1.2 Conv1.3 Focus1.4 Bottleneck1.5 BottleneckCSP1.6 C31.7 SPP1.8 Concat1.…

C3P0数据库连接池详解 及连接JDBC步骤

目录 一、基本定义 二、使用C3P0&#xff08;数据库连接池&#xff09;的必要性 1.JDBC传统模式开发存在的主要问题 三、数据库连接池的详细说明 四、使用连接池的明显优势 1.资源的高效利用 2.更快的系统反应速度 3.减少了资源独占的风险 4.统一的连接管理&#xff0c…

SQL优化实战-0001:SQL查找是否存在,不要再使用count

文章目录1.需求分析与普遍SQL写法2.问题分析3.优化方案4.总结5.补充5.1 还有什么时候可以使用LIMIT 15.2 什么时候没必要使用LIMIT 11.需求分析与普遍SQL写法 业务代码中&#xff0c;需要根据一个或多个条件&#xff0c;查询是否存在记录而不关心有多少条记录。普遍的SQL及代码…

大战谷歌!微软Bing引入ChatGPT;羊了个羊高·薪招纳技术人才;Debian彻底移除Python2;GitHub今日热榜 | ShowMeAI资讯日报

&#x1f440;日报合辑 | &#x1f3a1;AI应用与工具大全 | &#x1f514;公众号资料下载 | &#x1f369;韩信子 &#x1f3a1; 『微软Bing』将引入 ChatGPT&#xff0c;与 Google 一场大战难免 微软计划2023年3月底之前推出 Bing 搜索引擎的新版本&#xff0c;使用 ChatGPT …

Lua中self 、自索引及其面向对象应用代码示例

一、Lua表的self标识 在lua中&#xff0c;表拥有一个标识&#xff1a;self。self类似于c中的this指针和python中的self。在lua中&#xff0c;提供了冒号操作符来隐藏这个参数&#xff0c;例如&#xff1a; t1 {id 1, name "panda",addr "beijing" }-…

快过年了,看我使用python制作一个灯笼的小程序

哈喽呀&#xff0c;最近一直在写一些关于新年的的python小东西&#xff0c;今天也不例外&#xff0c;我把那些都放到了一个专辑里面了&#xff0c;感兴趣的朋友们可以去看看一下哦 目录 前言 画外轮廓 画灯笼的提线 画灯笼盖 画一下各种柱子 小小的外壳来一下 其他的小装饰…

Python打包(问题记录,待解决)

引言 文章用于测试在Python3.8的版本&#xff0c;打包Obspy地震包&#xff0c;最后集成到PyQt5上。 部署或冻结应用程序是 Python 项目的重要组成部分&#xff0c; 这意味着捆绑所有必需的资源&#xff0c;以便应用程序找到它需要的一切 能够在客户端计算机上运行。 但是&…