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

用Log4j 2记录日志

说明

maven工程中增加对Log4j 2的依赖

下面代码示例的maven工程中的pom.xml文件中需要增加对Log4j 2的依赖:

  	<dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.20.0</version></dependency>

log4j 2的配置

配置说明参考文档

https://logging.apache.org/log4j/2.x/manual/configuration.html

配置文件中pattern的详细说明

例如,下面配置文件片段中用到了pattern:

  <Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console><File name="File1" fileName="${filename}"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></File></Appenders>

pattern的详细说明请参考:
https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout
在这里插入图片描述

通常给每个类创建自己的Logger

为了便于对日志的过滤、搜索、排序等,通常每个类都获取它自己的带名字的Logger,而不是所有类共用一个Logger。
例如通常的做法:
private static final Logger logger = LogManager.getLogger();
创建一个Logger ,名字就是调用类的全限定名。

建议将Logger 声明为static的

Logger 可以声明为static的、或者非static的,但建议声明为static的。这样做的目的是为了节约实例化的成本。

代码示例

代码示例公共说明

如果没有特别说明,下面代码示例中maven工程中src/main/resources/log4j2.xml的配置内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"><Appenders><Console name="Console" target="SYSTEM_OUT"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></Console><File name="File1" fileName="${filename}"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/></File></Appenders><Loggers><Root level="info"><AppenderRef ref="Console"/></Root></Loggers>
</Configuration>

用LogManager.ROOT_LOGGER_NAME获取root Logger的名字

LogManager.ROOT_LOGGER_NAME是root Logger的名字,这个名字是空字符串""。

package com.thb;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class Test {public static Logger logger = LogManager.getLogger();public static void main(String[] args) {System.out.println("root logger name: " + LogManager.ROOT_LOGGER_NAME);//System.out.println("logger name: " + logger.getName());		}}

运行结果:

在这里插入图片描述
从上面输出结果可以发现,root Logger的名字是空字符串""。

用LogManager的getLogger()获取一个带名字的Logger

LogManager.getLogger()返回一个带名字的Logger,这个Logger的名字就是调用的类的全限定名称。这个方法经常使用。
下面代码中获取Logger的方法是典型的获取方法。

package com.thb;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class Test {private static final Logger logger = LogManager.getLogger();public static void main(String[] args) {		System.out.println("logger name: " + logger.getName());		}}

运行输出:
在这里插入图片描述
从上面输出可以看出,Logger的名字是调用类的全限定名称,此处是com.thb.Test。

在控制台打印一条INFO级别的日志

打印日志的代码:

package com.thb;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class Test {private static final Logger logger = LogManager.getLogger();public static void main(String[] args) {		System.out.println("logger name: " + logger.getName());	logger.info("hello");}}

输出:
在这里插入图片描述

在控制台打印日志,信息为合成信息

package com.thb;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class Test {private static final Logger logger = LogManager.getLogger();public static void main(String[] args) {double r = 2;logger.info("面积为:" + Math.PI * Math.pow(r, 2));}}

运行输出:

15:25:00.167 [main] INFO  com.thb.Test - 面积为:12.566370614359172

两个类都定义了静态的Logger,并且在一个类中调用另外一个类的方法

定义一个类,类中定义了自己的静态Logger:

package com.thb;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class AnotherClass {private static final Logger logger = LogManager.getLogger();public void method() {logger.info("hello from AnotherClass");}
}

定义一个主类,在主类中也定义了一个静态Logger:

package com.thb;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class Test {private static final Logger logger = LogManager.getLogger();public static void main(String[] args) {		logger.info("hello from Test");AnotherClass another = new AnotherClass();another.method();}}

运行结果:

15:10:28.161 [main] INFO  com.thb.Test - hello from Test
15:10:28.199 [main] INFO  com.thb.AnotherClass - hello from AnotherClass

相关文章:

用Log4j 2记录日志

说明 maven工程中增加对Log4j 2的依赖 下面代码示例的maven工程中的pom.xml文件中需要增加对Log4j 2的依赖&#xff1a; <dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.20.0&…...

【Java面试】Paxos和Raft协议的区别?

面试官&#xff1a;你简历上说了解Paxos和Raft协议&#xff0c;说一下你对这两个协议的了解&#xff1f; 我&#xff1a;Paxos算法和Raft算法都是用于实现分布式系统中的一致性的算法&#xff0c;确保不同节点之间的数据一致。 我&#xff1a;Paxos算法它的目标是使多个节点能…...

手机浏览器H5打开微信小程序支付,自定义传参

微信官方提供的开放文档如下&#xff1a; 静态网站 H5 跳小程序 | 微信开放文档 想必大家都能看懂官网提供的文档&#xff0c;但实战时却遇到很多问题&#xff0c;博主总结一下遇到的坑&#xff0c;如果您也有遇到&#xff0c;希望可以帮到您。 1.小程序已经发布上线了&…...

Aligning Large Language Models with Human: A Survey

本文也是LLM相关的综述文章&#xff0c;针对《Aligning Large Language Models with Human: A Survey》的翻译。 对齐人类与大语言模型&#xff1a;综述 摘要1 引言2 对齐数据收集2.1 来自人类的指令2.1.1 NLP基准2.1.2 人工构造指令 2.2 来自强大LLM的指令2.2.1 自指令2.2.2 …...

windows图标白了,刷新图标

1.进入C盘&#xff0c;user(用户文件夹)&#xff0c;进入当前用户文件夹&#xff0c;再进入隐藏文件夹(AppDada)&#xff0c;最后进入Local 2.删除Local文件夹里的IconCache.db文件 3.重启资源管理器 -------------------------------------------- 或者创建bat文件&#xf…...

C++ 左值和右值

C 左值和右值 左值、右值左值引用、右值引用std::move()std::move()的实现引用折叠 完美转发forward()的实现函数返回值是左值还是右值如何判断一个值是左值还是右值 左值、右值 在C11中所有的值必属于左值、右值两者之一&#xff0c;右值又可以细分为纯右值、将亡值。在C11中…...

c++学习(智能指针)[29]

RALL RALL&#xff08;Resource Acquisition Is Initialization&#xff09;是一种 C 的编程技术&#xff0c;用于管理资源的获取和释放。它的基本思想是在对象的构造函数中获取资源&#xff0c;在对象的析构函数中释放资源&#xff0c;从而确保资源的正确获取和释放。 RALL 的…...

B站高播放又涨粉的带货UP主怎么做?

飞瓜数据&#xff08;B站版&#xff09;上线新功能【带货达人榜】&#xff0c;由榜单显示&#xff0c;B站7月带货达人中&#xff0c;平均播放量最高的是UP主下个月一定中100万。 带货视频仅1支&#xff0c;播放量已经高达679万&#xff0c;值得一提的是&#xff0c;6月他也是带…...

AD21 PCB设计的高级应用(四)FPGA的管脚交换功能

&#xff08;四&#xff09;FPGA的管脚交换功能 高速 PCB 设计过程中,涉及的 FPGA等可编程器件管脚繁多,也因此导致布线的烦琐与困难&#xff0c;Altium Designer 可实现 PCB 中 FPGA 的管脚交换&#xff0c;方便走线。 1.FPGA管脚交换的要求 (1)一般情况下,相同电压的 Bank之…...

超低功耗LCD段码屏驱动显示芯片VK1621原厂芯片

型 号&#xff1a;VK1621 / 品 牌&#xff1a;VINKA/永嘉微电 最新年份 VK1621 是一个324的LCD驱动器&#xff0c;可软体程式控制使其适用于多样化的LCD应用线路&#xff0c;仅用到3至4条信号线便可控制LCD驱动器&#xff0c;除此之外也可介由指令使其進入省电模式 M1855 …...

【深入探索Docker】:开启容器化时代的技术奇迹

深入探索Docker 深入探索Docker&#xff1a;开启容器化时代的技术奇迹前言1. 容器化&#xff1a;实现快速部署和可移植性2. 虚拟化&#xff1a;提高安全性和可靠性3. 映像&#xff1a;打包应用及依赖项的模板4. 网络管理&#xff1a;连接容器和主机5. 持久化数据&#xff1a;保…...

【Ajax】笔记-JQuery发送jsonp请求

前端 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>jQuery-jsonp</title><style>#re…...

docker更换数据存储路径

1. 先停掉docker服务 sudo systemctl stop docker 可能会出现的问题&#xff1a; 这样会导致docker关闭失败,解决办法&#xff1a;systemctl stop docker.socket 确保docker关闭: 2.备份现在的 Docker 数据存储目录 /var/lib/docker(默认路径) mv /var/lib/docker /var/lib/…...

GPT告诉你如何延长周末体验

对于常常感到疲劳的打工人和学生党&#xff0c;过周末需要找到一种平衡&#xff0c;既能够休息放松&#xff0c;又能够提升身心能量。以下是一些建议&#xff0c;希望对你有所帮助&#xff1a; 制定休息计划&#xff1a;在周末前&#xff0c;制定一个休息计划&#xff0c;明确…...

一百四十一、Kettle——kettle8.2在Windows本地开启carte服务以及配置子服务器

一、目的 在kettle建好共享资源库后&#xff0c;为了给在服务器上部署kettle的carte服务躺雷&#xff0c;先在Windows本地测试一下怎么玩carte服务 二、Kettle版本以及在Windows本地安装路径 kettle版本是8.2 pdi-ce-8.2.0.0-342 kettle本地安装路径是D:\j…...

你知道充电桩控制主板的结构吗?

你知道充电桩控制主板的结构吗? 你是否曾经遇到过电动车行驶途中突然没电的情况?不用担心&#xff0c;解决这个问题的方法之一就是使用充电桩。那么&#xff0c;控制主板是如何控制充电桩的呢?让我们一起来探究一下。 充电桩控制主板由多种元件组成&#xff0c;包括主控芯片…...

LeetCode 25题:K个一组翻转链表

题目&#xff1a; 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯…...

Day 19 C++ 文件操作

C 文件操作 文件为什么要使用文件文件类型文本文件 - 文件以文本的ASCII码形式存储在计算机中二进制文件 - 文件以文本的二进制形式存储在计算机中 操作类型ofstream&#xff1a;写操作ifstream&#xff1a; 读操作fstream &#xff1a; 读写操作 文本文件写文件引入头文件 \&l…...

Nginx源码安装

文章目录 Nginx源码安装注安装pcre库安装openssl库创建用户及用户组安装编译环境解压文件检测环境重要目录检查配置服务启动脚本查看效果&#xff1a; Nginx源码安装 注 本实验基于RHEL73.10.0-327.el7.x86_64&#xff0c;尽量使用RHEL7或CentOS7。 安装pcre库 安装 pere 库…...

【数据结构和算法】--N叉树返回根节点到目标节点的路径

目录 一、前言二、Java代码实现 一、前言 项目中接触一个问题&#xff1a;在大量有父子关系的列表中&#xff0c;需要筛选出特定约束的数据【要求某个目标节点延续到根节点的数据】。这个问题抽象为数据结构&#xff0c;就是&#xff1a;N叉树返回根节点到目标节点的路径 二、…...

Qwen3.5-4B-Claude-Opus效果集:编译器后端寄存器分配策略生成

Qwen3.5-4B-Claude-Opus效果集&#xff1a;编译器后端寄存器分配策略生成 1. 模型概述 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF是一个专注于结构化分析和逻辑推理的轻量级AI模型。这个基于Qwen3.5-4B的推理蒸馏版本特别强化了处理代码生成、算法解释和编译器相…...

Venera:打造你的跨平台漫画图书馆,告别碎片化阅读体验

Venera&#xff1a;打造你的跨平台漫画图书馆&#xff0c;告别碎片化阅读体验 【免费下载链接】venera A comic app 项目地址: https://gitcode.com/gh_mirrors/ve/venera 还在为漫画文件散落在手机、平板和电脑上而烦恼吗&#xff1f;是否厌倦了在不同漫画应用之间来回…...

sndcpy:无需Root权限实现Android音频无线转发的完整指南

sndcpy&#xff1a;无需Root权限实现Android音频无线转发的完整指南 【免费下载链接】sndcpy Android audio forwarding PoC (scrcpy, but for audio) 项目地址: https://gitcode.com/gh_mirrors/sn/sndcpy sndcpy是一款专为Android设备设计的音频转发工具&#xff0c;能…...

Pixel Script Temple 环境配置详解:Anaconda虚拟环境管理最佳实践

Pixel Script Temple 环境配置详解&#xff1a;Anaconda虚拟环境管理最佳实践 1. 为什么需要虚拟环境&#xff1f; 在开始之前&#xff0c;我们先聊聊为什么需要虚拟环境。想象一下&#xff0c;你正在开发一个Python项目&#xff0c;突然发现新安装的包和之前的项目冲突了&am…...

Wan2.2-I2V-A14B新手指南:无需代码,通过ComfyUI界面轻松操作

Wan2.2-I2V-A14B新手指南&#xff1a;无需代码&#xff0c;通过ComfyUI界面轻松操作 1. 认识Wan2.2视频生成模型 Wan2.2-I2V-A14B是一款专为创意工作者设计的视频生成工具&#xff0c;它能将静态图片转化为动态视频。这个50亿参数的轻量级模型特别适合快速内容创作&#xff0…...

语音转文字太乱?BERT文本分割帮你自动整理段落

语音转文字太乱&#xff1f;BERT文本分割帮你自动整理段落 你是不是经常遇到这样的困扰&#xff1a;语音转文字后的内容密密麻麻连成一片&#xff0c;没有段落分隔&#xff0c;阅读起来费时费力&#xff1f;或者会议记录、采访稿等长文本缺乏结构&#xff0c;难以快速定位关键…...

HY-MT1.5翻译模型部署教程:快速搭建个人翻译API服务

HY-MT1.5翻译模型部署教程&#xff1a;快速搭建个人翻译API服务 1. 模型简介与核心优势 1.1 模型架构概览 HY-MT1.5是腾讯开源的双版本翻译模型系列&#xff0c;包含两个不同规模的模型&#xff1a; HY-MT1.5-1.8B&#xff1a;轻量级模型&#xff0c;18亿参数&#xff0c;专…...

QT图形界面应用智能化:Phi-4-mini-reasoning实现自然语言操控与界面逻辑生成

QT图形界面应用智能化&#xff1a;Phi-4-mini-reasoning实现自然语言操控与界面逻辑生成 1. 引言&#xff1a;当QT遇上AI 想象一下这样的场景&#xff1a;你在开发一个数据可视化工具&#xff0c;用户只需要说"帮我画一个过去半年销售额的柱状图&#xff0c;用蓝色柱子&…...

WinClaw安全实战 02|五层纵深防护体系全解析:从原理到实操,打造零风险AI智能体

摘要:2026年AI智能体爆发式普及,OpenClaw以27.3万GitHub星标成为现象级工具,但恶意Skill投毒、提示词注入、数据外泄等安全事故频发,国家互联网应急中心、工信部等多部门接连发布风险警示。威努特基于国家关键信息基础设施安全防护经验,打造WinClaw安全版AI智能体,其核心…...

本地离线运行更安全!AI人脸隐私卫士,保护隐私无需上传云端

本地离线运行更安全&#xff01;AI人脸隐私卫士&#xff0c;保护隐私无需上传云端 在社交媒体分享、企业宣传、新闻报道等场景中&#xff0c;我们常常需要发布包含人物的照片。然而&#xff0c;未经处理的人脸信息一旦公开&#xff0c;就可能面临隐私泄露的风险。手动给照片中…...