Java日志框架Log4j 2详解

有时希望能够以文件的形式记录执行过程中出现的异常信息,甚至记录程序正常运行的关键步骤,以便日后查看,那么该如何处理呢?

答:显然,可以自行编程实现这个需求,但是,从更注重效率和性能的方面考虑,还有一个更好的选择,那就是使用开源日志框架。

使用工具 IntelliJ IDEA Community Edition 2023.2.4

使用语言 Java8/JDK1.8

目录

1. Java中的日志框架

1.1 日志的主要用途

1.2  常用日志框架

1.3 Log4j 2的优势

2.Log4j 2下载和配置

2.1 Log4j 2下载地址

2.2 具体操作

3.使用Log4j 2记录日志 

3.1 编写配置文件 

3.2 定义日志记录器

3.3 记录日志

3.3.1 常用的日志记录方法

3.3.2 日志记录器的日志级别

3.3.2.1 日志格式要求

3.3.3 xml案例

3.3.4 xml文件配置文件的各节点及其属性介绍

3.3.5 日志输出格式的常用占位符 

3.3.5.1 常用的占位符及其含义

3.3.6 编写存入的格式注意


1. Java中的日志框架

1.1 日志的主要用途

程序在开发完成后会被不同系统环境的用户使用,在使用过程中可能会出现各类异常,程序出现的技术错误信息是提供给开发人员定位问题并解决问题的。将这些信息直接展示给用户看是没有任何意义的。这时,可以将用户执行的所有操作和程序运行的过程记录到日志中,开发人员可以通过分析日志内容,快速定位并诊断问题。

综上所述,对于一个应用程序来说,日志记录是必不可少的。它类似于生活中的日记,可以用来记录用户操作、系统运行状态等,是一个系统的重要组成部分。日志的主要用途如下:

  1. 问题追踪:辅助排查和定位问题,优化程序运行性能;
  2. 状态监控:通过日志分析,可以监控系统的运行状态;
  3. 安全审计:主要体现在安全上,可以发现非授权操作;

1.2  常用日志框架

1.2.1 Apache Log4j

Apache Log4j是基于Java的日志记录工具,现在是Apache软件基金会的一个项目。Log4j是几种Java日志框架之一;

 1.2.2 Commons Logging

Apache基金会所属的项目,是一套Java日志接口;

1.2.3 SLF4J

类似于Commons Logging,是一套简易Java日志门面,本身并无日志的实现;

1.2.4 Logback

一套日志组件的实现(属于SLF4J阵营);

1.2.5 JUL(Java Util Logging)

自Java1.4以来的官方日志实现;

1.2.6 Log4j 2

Apache重写Log4j 1.x,成立新的项目Log4j 2。Log4j 2是Apache开发的一款升级产品;

1.3 Log4j 2的优势

Log4j 2是一款非常优秀的日志框架,Log4j 2与Log4j相比发生了很大变化,日志的吞吐量及性能有很大的提升,解决了死锁的问题,配置更加简单灵活,它不兼容Log4j。Log4j 2具有Logback的所有特性。

2.Log4j 2下载和配置

2.1 Log4j 2下载地址

要使用Log4j 2,需要下载Log4j 2的.jar文件,登录Log4j官网https://logging.apache.org/log4j/2.x/,下载Log4j 2压缩文件。这次以Log4j 2.13.3为例,压缩包为apache-log4j-2.13-3-bin.zip,该压缩包解压后,将log4j-api-2.13.3.jar和log4j-core-2.13.3两个jar包导入项目中。具体操作如下:(也可以是其他版本,文件类型的前面一个就是版本号)

2.2 具体操作

  1. 在项目文件src文件夹中创建lib文件夹,将log4j-api-2.13.3.jar和log4j-core-2.13.3.jar保存在其中。(版本号可以不同);
  2. 在IntelliJ IDEA开发环境中,执行"File"-"Project Structure"命令,打开"Project Structure"(项目结构)对话框,选择"Modules"(模块)选项,在右侧窗格中选择"Dependencies"(依赖)选项卡后,单击右侧"+"按钮,在打开的菜单中执行"JARs or directories"(JAR 或 目录)命令;
  3. 从lib文件夹中选择两个.jar文件,单击"OK"按钮,将其添加到列表中并选中,单击"OK"按钮。(选中以上图片中的两个jar文件)

3.使用Log4j 2记录日志 

通过前面的操作,已经将Log4j 2所需的.jar文件导入项目中,下面是使用Log4j 2记录日志的步骤。

3.1 编写配置文件 

配置文件用来配置日志信息,自定义日志的输出位置、格式和内容。配置文件的扩展名可为.xml、.json或.jsn等。Log4j 2中没有默认的配置文件,需要手工创建,一般使用log4j2.xml命名配置文件(必须使用log4j2作为文件名,不然控制台上不会显示日志信息,log4j2文件必须放在src首级目录中); 

3.2 定义日志记录器

 在使用Log4j 2时,需要先在类中获取一个Logger对象,然后通过调用静态方法LogManager.getLogger()实现。这个Logger对象被称为日志记录器。获取日志记录器的方法如下:

import org.apache.logging.log4j.LogManager;//这个一定不要选错了,不然不会使用你编写的xml文件的
import org.apache.logging.log4j.Logger;
//省略代码
private static Logger 对象名=LogManager.getLogger(类名.class.getName());

在上面的代码中,使用getLogger()方法获取了一个Logger对象,该方法有一个String类型参数,使用".class.getName()"获取当前类全名作为参数。 

3.3 记录日志

3.3.1 常用的日志记录方法

Logger类可供开发人员记录日志信息,它提供了一系列方法来输出不同级别的日志信息,Logger类常用的日志记录方法如下:

3.3.1.1 记录debug级别日志 

public void debug(Object msg)
public void debug(Object msg,Throwable t)


3.3.1.2 记录info级别日志

public void info(Object msg)
public void info(Object msg,Throwable t)

3.3.1.3 记录warn级别日志

public void warn(Object msg)
public void warn(Object msg,Throwable t)

3.3.1.4 记录error级别日志

public void error(Object msg)
public void error(Object msg,Throwable t)

3.3.1.5 记录fatal级别日志

public void fatal(Object msg)
public void fatal(Object msg,Throwable t)

3.3.2 日志记录器的日志级别

all<trace<debug<info<warn<error<fatal<OFF

  • all:最低等级,用于打开所有日志记录
  • trace:用于程序追踪输出
  • debug:指出细粒度信息事件,对调试应用程序是非常有帮助的。
  • info:在粗粒度级别上指明消息,强调应用程序的运行过程。
  • warn:表示警告信息,即可能出现的潜在错误。
  • error:指出错误事件,但仍然不影响系统的继续运行。
  • fatal:指出严重的错误事件,将会导致应用程序退出。
  • OFF:最高等级,用于关闭所有日志记录。

在获取了Logger对象后,就可以在代码中调用这些方法记录日志了。

3.3.2.1 日志格式要求

为了让日志有所区分,在信息输入及正常执行的情况下,信息记录为debug级别的日志;在发生异常的情况下,信息记录为error级别的日志。格式要求如下: 

  • 控制台日志的记录内容:执行位置、记录日志级别及输出信息;
  • 文本日志的记录内容:日期和时间(精确到秒)、执行位置、记录日志级别及输出信息;
  • 编写配置文件log4j2.xml

XML即可扩展标记语言,是一类较简单的数据存储语言。可用一系列的标记描述数据。XML文件格式时一种较灵活地方纯文本格式,XML文件在许多方面类似于HTML文件。

3.3.3 xml案例

 在以上配置文件中,file节点设置日志的输出位置为log/test.log文件,并在其中配置了日志输出格式。在root节点中,配置的level值为"all",表示可以输出所有级别的日志信息。如果只需输出error级别的日志,则只需将level的值改为"error"。appender-ref节点用于指定日志按appenders集合中的哪个配置进行输出,appender-ref引用的值需与appenders中匹配节点的name属性一致,而不与节点名一致,这里要引起注意。

3.3.4 xml文件配置文件的各节点及其属性介绍

3.3.4.1 configuration

根节点,其中可定义appenders节点和loggers节点,属性包含以下内容:
status:可以用来指定Log4j 2本身打印日志的级别;
monitorinterval:用来设置配置文件的动态加载时间,单位是秒,最小是5秒;

3.3.4.2 appenders

日志输出目的地集合,包含Console、RollingFile、File三类appender节点,这些节点可配置日志输出位置; 

3.3.4.3 Console

日志输出到控制台的配置节点,属性包含如下内容:
name:指定节点名称;
target:SYSTEM_OUT或SYSTEM_ERR,一般默认为SYSTEM_OUT;
PatternLayout:设置输出格式 ;

3.3.4.4 File

日志输出到控制台的配置节点,属性包含如下内容:
name:指定appender名称;
filename:指定输出日志的目的文件,必须是全路径的文件名;
PatternLayout:输出格式,不设置时,默认为%m%m ;

3.3.4.5 loggers

logger节点集合,其常见的子节点包含Root和Logger,可配置多个logger; 

3.3.4.6 root

用来指定项目的根日志。如果没有单独的logger节点,则会默认按此节点配置进行日志输出;
level:指出日志级别,从高到低有八个级别;

3.3.4.6 logger

用来单独指定日志的形式。例如,需要为包下的class指定不同的日志级别等。属性包含如下内容。
name:指定该logger所适用的类或类所在包的全路径;
level:日志输出级别;
appender-ref:指定日志输出的目标appender;

3.3.5 日志输出格式的常用占位符 

3.3.5.1 常用的占位符及其含义

%d:用来设置输出日志的日期和时间,默认格式为ISO8601。也可以在其后指定格式如%d{yyyy-MM-dd HH:mm:ss},输出的格式类似于2021-03-10 16:43:08;
%m:输出代码中指定的消息;
%t:用来输出当前线程的名称;
%5level:输出日志级别,-5表示左对齐并固定输出5个字符;如果不足,则在右边补0。
%l(这个是L的小写,不要看成I或者1了):用来输出日志事件的发生位置,包括类名、发生的线程,以及在代码中的行数。例如,如果输出为cn.java.log.Test.main(Test.java:25),则说明日志事件发生在cn.java.log包下的Test类的main线程中,在代码中的行数为第25行;
%logger:输出logger名称;
%msg:日志文本;
%n:换行; 

3.3.6 编写存入的格式注意

只需在xml文件中编写存入的格式,然后调用Logger对象(不要选错了,要是对应的xml文件的Logger对象),对象值是导入的xml文件(LogManager).getLogger(类名.class.getName());然后调用这个对象的对应级别日志就会按照你输入的内容存入文件中(File节点)和打印到控制台中(Console节点);

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

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

相关文章

物联网终端telegraf采集设备信息

背景 低功耗设备上资源有限&#xff0c;但又比较重要。对其的管理难度很大&#xff0c;有些时候又必须时刻了解其运行状况。我们自然想到的是能否有办法监控它呢&#xff1f;当时是有的&#xff01;而且很成熟的解决方案。TICK技术栈&#xff0c;那TICK是什么呢&#xff1f; TI…

【剪枝实战】使用VGGNet训练、稀疏训练、剪枝、微调等,剪枝出只有3M的模型

摘要 本次剪枝实战是基于下面这篇论文去复现的&#xff0c;主要是实现对BN层的γ/gamma进行剪枝操作&#xff0c;本文用到的代码和数据集都可以在我的资源中免费下载到。 相关论文&#xff1a;Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017…

Ubuntu18.04下opencv基础操作(打开图片及视频)

文章目录 一、认识opencv一、编写一个打开图片进行特效显示的代码二、使用opencv库编写打开摄像头压缩视频的程序2.1 虚拟机获取摄像头权限2.2 播放视频2.3 录制视频 三、总结四、参考资料 一、认识opencv 开源计算机视觉(OpenCV)是一个主要针对实时计算机视觉的编程函数库。 …

WanAndroid(鸿蒙版)开发的第四篇

前言 DevEco Studio版本&#xff1a;4.0.0.600 WanAndroid的API链接&#xff1a;玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考&#xff1a; 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …

Gitee 服务器

Git 服务器集成 1. 创建仓库 2. 远程仓库简易操作指令 # Git 全局设置&#xff0c;修改成自己的信息 git config --global user.name "Muko" git config --global user.email "txk0x7d2163.com" # 创建 git 仓库&#xff0c;基本操作指令和其他远程仓库一…

Ps 滤镜:中间值

Ps菜单&#xff1a;滤镜/杂色/中间值 Filter/Noise/Median 中间值 Median滤镜可用于减少或消除图像中的噪点和杂色&#xff0c;同时能较好地保留图像边缘和细节信息。 中间值滤镜通过计算一个像素周围一定区域内的像素值的中间值&#xff08;即这些值的中位数&#xff09;&…

群集----Memcached

一、NoSQL介绍 NoSQL是对 Not Only SQL、非传统关系型数据库的统称。 NoSQL一词诞生于1998年&#xff0c;2009年这个词汇被再次提出指非关系型、分布式、不提供ACID的数据库设计模式。 随着互联网时代的到来&#xff0c;数据爆发式增长&#xff0c;数据库技术发展日新月异&a…

怎么避免电脑数据被拷贝?电脑如何禁用USB功能?

在无纸化办公的今天&#xff0c;很多重要数据都存放在电脑中。为了避免数据泄露&#xff0c;需要采用安全的方式保护电脑数据。那么&#xff0c;该如何避免电脑数据被拷贝呢&#xff1f;下面我们就来了解一下。 方法一&#xff1a;物理隔绝 物理隔绝是一种原始但有效的USB禁用…

《小程序从入门到入坑》框架语法

前言 哈喽大家好&#xff0c;我是 SuperYing&#xff0c;我们继续小程序入门系列&#xff0c;本文将对小程序框架语法进行比较全面的介绍。在《小程序从入门到入坑》简介及工程创建中&#xff0c;我们提到小程序项目结构&#xff0c;主要包括 app.json&#xff0c;app.js&…

STM32初识1

什么是单片机&#xff1f; 单片机&#xff08; Single-Chip Microcomputer &#xff09;是一种集成电路芯片&#xff0c;把具有数据处理能力的中央处 理器 CPU 、随机存储器 RAM 、只读存储器 ROM 、多种 I/O 口和中断系统、定时器 / 计数器等功 能&#xff08;可能还包括显示…

部署快捷、使用简单、推理高效!大模型部署和推理框架 Xinference 来了!

今天为大家介绍一款大语言模型&#xff08;LLM&#xff09;部署和推理工具——Xinference[1]&#xff0c;其特点是部署快捷、使用简单、推理高效&#xff0c;并且支持多种形式的开源模型&#xff0c;还提供了 WebGUI 界面和 API 接口&#xff0c;方便用户进行模型部署和推理。 …

【iOS】ARC学习

文章目录 前言一、autorelease实现二、苹果的实现三、内存管理的思考方式__strong修饰符取得非自己生成并持有的对象__strong 修饰符的变量之间可以相互赋值类的成员变量也可以使用strong修饰 __weak修饰符循环引用 __unsafe_unretained修饰符什么时候使用__unsafe_unretained …

蓝桥杯--冶炼金属

目录 一、题目 二、解决代码 &#xff08;1&#xff09;版本一&#xff08;报错&#xff1a;超时&#xff09; 代码分析 &#xff08;2&#xff09;版本二&#xff08;不会超时&#xff09; 代码分析 &#xff08;3&#xff09;版本三&#xff08;最终精简版&#xff09;…

Python自学☞序列和索引的相关操作

一、基本概念 1、概念 序列是一个用于存储多个值的连续空间&#xff0c;每个值都对应一个整数的编号&#xff0c;称为索引 2、切片的语法结构 注&#xff1a;切片可以访问序列一定范围内的元素 序列[start&#xff1a;end&#xff1a;step] start-->切片的开始索…

Python数据分析-5

1.时间序列 2.pandas重采样 重采样&#xff1a;指的是将时间序列从一个频率转化为另一个频率进行处理的过程&#xff0c;将高频率数据转化为低频率数据为降采样&#xff0c;低频率转 化为高频率为升采样。 统计出911数据中不同月份电话次数的变化情况&#xff1a…

vue3中的文字滚动播报

vue3中的文字滚动播报 之前UI框架一直使用的elementPlus&#xff0c;有个需求&#xff0c;需要在页面上写个滚动播放新闻的功能&#xff0c;发现UI框架居然没有这个组件。花了一下午&#xff0c;在ChatGPT的帮助下&#xff0c;总算写成功了&#xff0c;先看最终展示效果 web页…

GPT-5:人工智能的下一个前沿即将到来

当我们站在人工智能新时代的门槛上时&#xff0c;GPT-5即将到来的呼声愈发高涨且迫切。作为革命性的GPT-3的继任者&#xff0c;GPT-5承诺将在人工智能领域迈出量子跃迁式的进步&#xff0c;其能力可能重新定义我们与技术的互动方式。 通往GPT-5之路 通往GPT-5的旅程已经标记着…

Unreal发布Android在刘海屏手机上不能全屏显示问题

Unreal 4.27发布Android在刘海屏手机上不能全屏显示问题 Android设置全屏刘海屏全屏设置4.27设置刘海屏在部分手机不能显示问题 Android设置全屏 AndroidManifest.xml文件配置 ...<activity android:name"com.epicgames.ue4.GameActivity" android:label"st…

给电脑加硬件的办法 先找电脑支持的接口,再买相同接口的

需求&#xff1a;我硬盘太小&#xff0c;换或加一个大硬盘 结论&#xff1a;接口是NVMe PCIe 3.0 x4 1.找到硬盘型号 主硬盘 三星 MZALQ512HALU-000L2 (512 GB / 固态硬盘) 2.上官网查 或用bing查 非官方渠道信息&#xff0c;不确定。

CompletableFuture原理与实践-外卖商家端API的异步化

背景 随着订单量的持续上升&#xff0c;美团外卖各系统服务面临的压力也越来越大。作为外卖链路的核心环节&#xff0c;商家端提供了商家接单、配送等一系列核心功能&#xff0c;业务对系统吞吐量的要求也越来越高。而商家端API服务是流量入口&#xff0c;所有商家端流量都会由…