当前位置: 首页 > 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
http://www.lryc.cn/news/108486.html

相关文章:

  • 【Java面试】Paxos和Raft协议的区别?
  • 手机浏览器H5打开微信小程序支付,自定义传参
  • Aligning Large Language Models with Human: A Survey
  • windows图标白了,刷新图标
  • C++ 左值和右值
  • c++学习(智能指针)[29]
  • B站高播放又涨粉的带货UP主怎么做?
  • AD21 PCB设计的高级应用(四)FPGA的管脚交换功能
  • 超低功耗LCD段码屏驱动显示芯片VK1621原厂芯片
  • 【深入探索Docker】:开启容器化时代的技术奇迹
  • 【Ajax】笔记-JQuery发送jsonp请求
  • docker更换数据存储路径
  • GPT告诉你如何延长周末体验
  • 一百四十一、Kettle——kettle8.2在Windows本地开启carte服务以及配置子服务器
  • 你知道充电桩控制主板的结构吗?
  • LeetCode 25题:K个一组翻转链表
  • Day 19 C++ 文件操作
  • Nginx源码安装
  • 【数据结构和算法】--N叉树返回根节点到目标节点的路径
  • Flutter环境搭建踩坑集锦
  • WPF上位机7——MySql
  • Linux的基本指令(2)
  • mySql-Linux-安装
  • JS实现IOS标准时间(JSON时间格式)格式转yyyy-mm-dd格式
  • 【Jmeter】 Report Dashboard 生成html图形测试报告
  • 7种有效安全的网页抓取方法,如何避免被禁止?
  • flask服务生成证书文件,采用https访问,开启用户密码验证
  • 上海首个“零工”就业云平台上线
  • 面试必考精华版Leetcode104. 二叉树的最大深度
  • winform panel中放置 usercontrol ,设置usercontrol随着dpi分辨率变化