用Log4j 2记录日志

news2024/10/1 19:22:14

说明

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.coloradmin.cn/o/836629.html

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

相关文章

纯小白也能看懂,十分钟帮你快速了解云原生概念

纯小白也能看懂&#xff0c;十分钟帮你了解云原生技术 一、麻烦的一天二、魔法的种子1. Docker2. Kubernetes 三、渐入佳境1. 技术与术语容器化技术DevOps弹性伸缩Sidecar服务网格 2. 组件与框架DockerKubernetesHelmIstioPrometheusJaegerEnvoy 四、前路漫漫 随着云原生相关技…

PHP实践:用openssl打造安全可靠的API签名验证系统

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f3c6;本文已…

clickhouse断电重启故障解决方案

业务场景 公司的一个日志系统用到了clickhouse。一线运维反映说有个生产环境因为异常断电造成服务器重启。在执行日志系统的启动脚本时&#xff0c;一直报clickhouse启动不起来&#xff0c;日志系统无法使用。 问题排查 通过阅读启动脚本代码&#xff0c;以及启动日志系统&a…

【安全测试】Web应用安全之XSS跨站脚本攻击漏洞

目录 前言 XSS概念及分类 反射型XSS(非持久性XSS) 存储型XSS(持久型XSS) 如何测试XSS漏洞 方法一&#xff1a; 方法二&#xff1a; XSS漏洞修复 原则&#xff1a;不相信客户输入的数据 处理建议 资料获取方法 前言 以前都只是在各类文档中见到过XSS&#xff0c;也进…

接口测试前置基础学习

网址结构&#xff08;面试重点&#xff09; 网址就是浏览器请求的地址。 网址组成&#xff1a;&#xff08;6个部分&#xff09; 1 协议http协议&#xff0c;超文本传输协议&#xff0c;https协议&#xff0c;s表示ssl加密。传输更安全。 2 域名&#xff1a;就是ip地址。从…

巨量算数:2023中国家居行业洞察报告(附下载

关于报告的所有内容&#xff0c;公众【营销人星球】获取下载查看 核心观点 回首过去几年&#xff0c;在疫情反复、地产热度消减、人口出生率下降等各种不利因素影响下&#xff0c;家居行业及其上下游面临极大挑战&#xff0c;整体行业遇冷&#xff0c;市场规模的增速进一步放…

超前端相关的学习网站和一些靠谱的小工具

CSS相关 1. CSS Battle - 在线比拼 CSS https://cssbattle.dev 在线比拼 CSS &#xff0c;一个挺有趣的竞争性游戏&#xff0c;一共有12个级别&#xff0c;需要你用 HTML和 CSS 100%还原它给出的页面&#xff0c;然后再尽量减少代码&#xff0c;你也可以查看全球的排行榜&am…

初级职称评审流程是什么?如何才能评初级职称呢?

职称主要代表社会地位&#xff0c;有高职称的人享有较高的社会经济和福利待遇&#xff0c;与实际技能未必有直接关联。 初级职称评审流程&#xff1a;初级职称评审需要以企业名义参加评审才可以&#xff0c;提交资料到人社局&#xff0c;人社局核实资料和基本情况&#xff0c;确…

[Qt]FrameLessWindow实现调整大小、移动弹窗并具有Aero效果

说明 我们知道QWidget等设置了this->setWindowFlags(Qt::FramelessWindowHint);后无法移动和调整大小&#xff0c;但实际项目中是需要窗口能够调整大小的。所以以实现FrameLess弹窗调整大小及移动弹窗需求&#xff0c;并且在Windows 10上有Aero效果。 先看一下效果&#xf…

光环云入选“算力服务方阵”成员单位,共筑算力新生态,赋能数字经济发展

7月26日&#xff0c;由中国信息通信研究院、中国通信标准化协会联合主办的“2023第十届可信云大会”在北京举办。会上&#xff0c;光环云正式入选国内首个算力服务研究组织——算力服务方阵&#xff0c;携手方阵成员共筑算力新生态&#xff0c;赋能数字经济发展。 算力服务方阵…

日撸java_day56-57

文章目录 day56-57kMeans 聚类代码运行截图 day56-57kMeans 聚类 1.kMeans 聚类需要中心点收敛时结束. 2.数据集为 iris, 所以最后一个属性没使用. 如果对于没有决策属性的数据集, 需要进行相应修改. 3.数据没有归一化. 4.getRandomIndices() 和 knn 的完全相同, 拷贝过来. 本…

markdown语法速记

markdown语法速记 这里只记录兼容性强的语法格式&#xff1a; [markdown官方文档]https://markdown.com.cn 标题 #号后跟一个空格如&#xff1a;“# title_level_1” 代表一级标题&#xff0c;两个#号代表二级标题&#xff0c;以此类推&#xff1b;最小为6级标题换行 直接…

两数相加 II

给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。 你可以假设除了数字 0 之外&#xff0c;这两个数字都不会以零开头。 示例1&#xff1a; 输入&#xff1a;l1 [7,2,4,3], l2 [5,6,4] 输…

【ASP.NET MVC】使用动软(五)(13)

一、问题 前文完成的用户登录后的首页如下&#xff1a; 后续账单管理、人员管理等功能页面都有相同的头部&#xff0c;左边和下边&#xff0c;唯一不同的右边内容部分&#xff0c;所以要解决重复设计的问题。 二、解决方法——使用布局页 在Views上右键添加新建项&#xff…

鸿蒙4.0发布会说了啥?关注个性与效率,小艺智能程度令人惊艳

鸿蒙4.0系统的发布会已经结束&#xff0c;整个发布会看下来&#xff0c;给我最深刻的印象就是——鸿蒙4.0是一个让手机更接近个人终端的系统。但选择系统难免掺杂个人喜好和偏见&#xff0c;因此本文我只会从鸿蒙4.0那些让我感到惊喜的功能入手介绍&#xff0c;不对系统进行评价…

【深度学习Week4】MobileNet_ShuffleNet

报错&#xff1a;unsafe legacy renegotiation disabled 解决方案&#xff1a; 尝试了更换cryptography36.0.2版本&#xff0c;以及更换下载链接的方法&#xff0c;都不行&#xff0c;最后采用了手动下载mat文件并上传到colab的方法 高光谱图像分类数据集简介Indian Pines&…

免疫疗法勘察兵——DC细胞

DC细胞又叫树状细胞或者树突细胞&#xff0c;1869年由保罗兰格尔翰斯发现&#xff0c;一开始被误以为是神经细胞的一种&#xff0c;直到1973年皮肤科医师Inga Silberberg发现了他的免疫功能&#xff0c;同年&#xff0c;被拉尔夫斯坦曼和赞威尔A科恩两人正式命名为“dendritic…

《凤凰架构》第一章——演进中的部分

前言 刚开始决定弄懂文中所提到的所有东西&#xff0c;就像我写ByteByteGo呢几篇文章一样&#xff0c;把每一句话都弄懂。但是对于《凤凰架构》来说&#xff0c;这有点太费时间了&#xff0c;并且没有必要&#xff0c;有些东西可能永远都不会用到&#xff0c;但文章为了全面的…

【基础类】—CSS盒模型的全面认识

一、基本概念&#xff1a;标准IE模型 盒模型&#xff1a;margin border padding content 标准模型&#xff1a;将元素的宽度和高度仅计算为内容区域的尺寸&#xff08;content-box&#xff0c;默认&#xff09; 当CSS盒模型为 标准盒模型 &#xff08;box-sizing: conten…

【安全测试】安全测试威胁建模设计方法STRIDE

目录 背景 TM(ThreatModeling) 实践 具体流程 资料获取方法 背景 目前安全测试一般都存在如下问题&#xff1a; 安全测试人员不懂业务&#xff0c;业务测试人员不懂安全&#xff0c;安全测试设计出现遗漏是无法避免的安全测试点繁多复杂&#xff0c;单点分析会导致风险暴…