当前位置: 首页 > news >正文

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节点);

相关文章:

Java日志框架Log4j 2详解

有时希望能够以文件的形式记录执行过程中出现的异常信息&#xff0c;甚至记录程序正常运行的关键步骤&#xff0c;以便日后查看&#xff0c;那么该如何处理呢? 答:显然&#xff0c;可以自行编程实现这个需求&#xff0c;但是&#xff0c;从更注重效率和性能的方面考虑&#x…...

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

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

OSI(Open Systems Interconnection)模型和TCP/IP模型

OSI模型 OSI模型是一个概念模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;在1984年提出&#xff0c;用于促进不同系统间的通信互联。OSI模型将网络通信的过程分为七层&#xff0c;每一层都有其特定的功能&#xff0c;从下至上依次是&#xff1a; 物理层&#x…...

git基础命令(二)

目录 git revert 撤消上一次提交的更改但是会创建一个新的提交来撤消该提交所做的更改git show 显示提交详细信息git mv 重命名文件git rm 从工作树和索引中移除文件git clean 从工作树中移除未跟踪文件git checkout 将文件恢复到工作树git reset 撤销更改、移动 HEAD 指针以及…...

从零开始学习typescript系列 1:typescript 基本了解之是什么,为什么,以及怎么用

初识ts 基本了解 设计者&#xff0c;实现者&#xff1a;微软发行时间&#xff1a;2012年10月1日GitHub&#xff1a;https://github.com/microsoft/TypeScriptts和js关系&#xff1a;ts是js的扩展&#xff0c;ts语法包含js ts是新语言吗&#xff1f; 不是&#xff0c;在js基…...

【数学建模】线性规划

针对未来可能的数学建模比赛内容&#xff0c;我对学习的内容做了一些调整&#xff0c;所以先跳过灰色关联分析和模糊综合评价的代码&#xff0c;今天先来了解一下运筹规划类——线性规划模型。 背景&#xff1a; 某数学建模游戏有三种题型&#xff0c;分别是A&#xff0c;B&am…...

MQTT 的 QoS 等级:QoS 0、QoS 1、QoS 2

MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的通信协议&#xff0c;在物联网和消息传递系统中广泛应用。MQTT 提供了三个不同的 QoS&#xff08;Quality of Service&#xff09;等级&#xff0c;用于确保消息的可靠性和传输效率。本文将详细…...

搭建个人智能家居 3 -第一个设备“点灯”

搭建个人智能家居 3 -第一个外设“点灯” 前言ESPHome点灯 HomeAssistant 前言 前面我们已经完成了搭建这个智能家居所需要的环境HomeAssistant和ESPHome&#xff0c;今天我们开始在这个智能家居中添加我们的第一个设备&#xff08;一颗LED灯&#xff09;&#xff0c;如果环境…...

基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台

tar -xzf prometheus-2.7.0-rc.1.linux-amd64.tar.gzcd prometheus-2.7.0-rc.1.linux-amd64/./prometheus --config.fileprometheus.yml --web.listen-address:5555 Prometheus 默认监听端口号为 9090&#xff0c;为了不与系统上的其它进程监听端口冲突&#xff0c;我们在启动…...

(delphi11最新学习资料) Object Pascal 学习笔记---第7章第1节(创建对象 )

7.1.4 创建对象 ​ 与其他流行的编程语言比较之后&#xff0c;让我们回到 Pascal&#xff0c;看看如何使用类。 ​ 一旦定义了类&#xff0c;我们就可以创建一个该类型的对象&#xff0c;代码片段如下&#xff08;本节所有代码提取自 Dates1 示例&#xff09;那样&#xff1a…...

unity学习笔记 Restsharp 使用心得

Restsharp Restsharp安装使用注意事项api方式的流式调用--子线程中执行代码无响应的问题问题描述问题解决其他问题 Restsharp 安装 可以在github上下载dll文件然后导入到unity中 https://github.com/adrenak/RestSharp.Unity 也可以百度直接搜Restsharp然后下载相关的文件导入…...

YOLOV5 部署:QT的可视化界面推理(创建UI,并编译成py文件)

1、前言 之前用YOLOV5 做了一个猫和老鼠的实战检测项目,本章将根据之前训练好的权重进行部署,搭建一个基于QT的可视化推理界面,可以检测图片和视频 本章使用的数据集和权重参照:YOLOV5 初体验:简单猫和老鼠数据集模型训练-CSDN博客 可视化界面如下: 2、安装Pyside6 本…...

Python:自动化处理PDF文档集合,提取文献标题、合并文献PDF并生成目录和页码

Python&#xff1a;自动化处理PDF文档集合&#xff0c;提取文献标题、合并文献PDF并生成目录和页码 引言&#xff1a;功能概述步骤一&#xff1a;提取PDF标题步骤二&#xff1a;生成目录和页码&#xff0c;合并PDF技术亮点 代码步骤一&#xff1a;提取PDF标题&#xff08;Step_…...

vue 基于elementUI/antd-vue, h函数实现message中嵌套链接跳转到指定路由 (h函数点击事件的写法)

效果如图&#xff1a; 点击message 组件中的 工单管理&#xff0c; 跳转到工单管理页面。 以下是基于vue3 antd-vue 代码如下&#xff1a; import { message } from ant-design-vue; import { h, reactive, ref, watch } from vue; import { useRouter } from vue-router; c…...

数字排列 - 华为OD统一考试(C卷)

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 200分 题解&#xff1a; Java / Python / C 题目描述 小明负责公司年会&#xff0c;想出一个趣味游戏: 屏幕给出 1−9 中任意 4 个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第 n 位置…...

yocto 编译raspberrypi 4B并启动

yocto 编译raspberrypi 4B并启动 环境准备 最近到手一个树莓派4B&#xff0c;准备拿来玩一玩&#xff0c;下面记录下使用yocto构建RaspberryPi的镜像并刷写启动的过程。 首先准备主机编译环境&#xff0c;必要组件安装&#xff1a; sudo apt install gawk wget git diffstat…...

Nginx、LVS、HAProxy工作原理和负载均衡架构

当前大多数的互联网系统都使用了服务器集群技术&#xff0c;集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务&#xff0c;这些集群可以是 Web 应用服务器集群&#xff0c;也可以是数据库服务器集群&#xff0c;还可以是分布式缓存服务器集群等等。 在实际应用…...

C语言标准库函数qsort( )——数据排序

大家好&#xff01;我是保护小周ღ&#xff0c;本期为大家带来的是深度解剖C语言标准库函数 qsort()&#xff0c;qsort()函数他可以对任意类型的数据排序&#xff0c;博主会详细解释函数使用方法&#xff0c;以及使用快速排序的左右指针法模拟实现函数功能&#xff0c;这样的排…...

基础---nginx 启动不了,跟 Apache2 服务冲突

文章目录 查看 nginx 服务状态nginx 启动后 访问页面 127.0.0.1停止 nginx 服务&#xff0c;访问不了页面停止/启动 Apache2 服务&#xff0c;启动 Apache2 页面访问显示正确nginx 莫名启动不了卸载 Apache2 服务器 启动 nginx &#xff0c;但是总是不能实现反向代理&#xff0…...

如何利用百度SEO优化技巧将排到首页

拥有一个成功的网站对于企业和个人来说是至关重要的&#xff0c;在当今数字化的时代。在互联网上获得高流量和优质的访问者可能并不是一件容易的事情&#xff0c;然而。一个成功的SEO战略可以帮助你实现这一目标。需要一些特定的技巧和策略、但要在百度搜索引擎中获得较高排名。…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

Unity中的transform.up

2025年6月8日&#xff0c;周日下午 在Unity中&#xff0c;transform.up是Transform组件的一个属性&#xff0c;表示游戏对象在世界空间中的“上”方向&#xff08;Y轴正方向&#xff09;&#xff0c;且会随对象旋转动态变化。以下是关键点解析&#xff1a; 基本定义 transfor…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...