Log4j

 通过Log4j,我们可以控制日志信息输送到目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器。我们可以控制每一条日志的输出格式。通过定义每一条日志信息的级别,能更加细致地控制日志的生成过程。

1 log4j、log4j2与@SLF4J

2015年9月,Apache宣布不再维护Log4j。建议所有相关项目升级到Log4j2。Log4j2是Apache开发的一个新的日志框架,改进了Log4j的缺点,同时也借鉴了LogBack,号称在性能上也完胜LogBack。

log4j

log4j2

配置文件

以.properties的文件为主。

采用的是.xml,.json或者.jsn

核心JAR包

只需引入一个jar包:log4j

需要两个核心包:log4j-core和log4j-api

配置文件方式

两者基本不同

表 log4j与log4j2在用法上的主要区别

SFL4J 全称是Simple Logging Facade for Java(Java的简单日志门面),是外观模式的典型应用。

不同的日志框架,需要引入不同的jar包,及使用不同的代码获取Logger。如果项目升级需要更换不同的框架,那么就需要修改所有的地方来获取新的Logger,这将产生巨大的工作量。

而SFL4J,运用门面外观模式,提供一个接口,将不同的日志框架的使用统一起来。

图 SLF4J 的工作原理

2 Log4J

级别标准是:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATA < OFF。

ALL

所有级别包括自定义级别

WARN

用于警告消息。

TRACE

低于DEBUG。

ERROR

错误消息日志,应用程序可以继续执行。

DEBUG

调试消息日志。

FATA

严重错误消息日志,必须中止运行程序。

INFO

信息消息。

OFF

最高级别,旨在关闭日志记录。

表 Log4j 日志级别说明

图 log4j的配置文档结构

配置文档主要有两个标签:<appender>用来配置日志输出目标的信息。<root>更节点来配置日志输出级别、输出目标等信息。

3 appender

log输出源,常用的输出源有:ConsoleAppender(控制台)、FileAppender(文件)、DailyRollingFileAppender(日常日志文件,FileAppender的子类)等。

这些输出源公有等配置选项有:

1、Threshold,指定日志信息的最低输出级别,默认DEBUG。

2、ImmediateFlush, 表示所有的消息都会被立即输出,默认true。

ConsoleAppender

Target,输出流,默认是System.out。

FileAppender

Append,表示增加到指定文件中,false则将消息覆盖指定的文件内容,默认值是true。

File,当前消息输出的文件地址

DailyRollingFileAppender

DatePattern,输出频率,yyy-MM 表示每月产生一个新的日志文件,命名规则是:文件名.后缀.yyyy-MM

RollingFileAppender

MaxFileSize,文件到达该大小时,将会自动产生一个新的日志文件,后缀可以是KB,MB或者GB。

MaxBackupIndex,可以产生的滚动文件最大数,假如设为2,则可产生app.log.1、app.log.2两个滚动文件和app.log。

表 常见输出源的相关配置

3.1 layout

配置日志信息的输出格式的布局。常见的布局有:HTMLLayout(以HTML表格形式布局)、PatternLayout(可以灵活指定布局模式)、SimpleLayout(包含日志信息的级别和信息字符串)、TTCCLayout(包含日志产生的时间、线程、类别等信息)。

%p

日志信息的优先级,即DEBUG、INFO、WARN等。

%F

产生日志消息所在的文件名称。

%d

输出日志的时间,其后可以指定格式,如:%d{yyyy-MM-dd HH:mm:ss}。

%L

代码中的行号。

%r

自应用程序启动到输出该log信息耗费到毫秒数。

%m

输出代码中指定的具体消息。比如log.warn(“hello”); 则输出hello。

%t

产生该日志事件的线程名。

%n

一个回车换行符。

%l

日志事件发生位置,相当于%c.%M(%F:%L)的组合,包括类的全名、方法、文件名以及在代码中的行数。

%x

输出和当前线程相关联的NDC(嵌套诊断环境)。

%c

产生日志信息所属的类目。

%%

输出一个%字符。

%M

产生日志信息的方法名。

表 PatternLayout 布局格式化符号说明

例如:%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

输出:

2023-11-22 21:25:43 INFO   Application:25 – info

2023-11-22 21:25:43 WARN  Application:26 – warn

%-5 表示左对齐5个字符。

4 输出实战

log4j 日志可以输出到文件、邮件及数据库等。下面将大致介绍输出到邮件及文件到用法。

4.1 输出到邮件

首先,需要添加邮件发送的依赖:

<dependency>

<groupId>javax.mail</groupId>

<artifactId>mail</artifactId>

<version>1.4.7</version>

</dependency>

然后配置appender

图 邮件appender配置

bufferSize,默认单位是kb。是指日志超过该大小后才会发送邮件(当程序停止时也会发送邮件)。

图 log4j 发送的日志邮件

4.2 输出到文件

图 DailyRollingFileAppender C产生的日志文件

如图所示,所产生的日志文件并不符合我们的期望,我们想得到的文件是: app.yyyy-MM-dd-HH-mm.log 这种格式的。这时需要我们自定义Appender。

我们需要先分析DailyRollingFileAppender这个类:

产生日志文件是在rollOver()这个方法发生的(这个方法官方注释是:将当前文件滚动到新文件)。

图 DailyRollingFileAppender 类的rollOver方法

因为rollOver方法我们没法重写,我们的Appender类不能直接继承DailyRollingFileAppender类。我们重写CustomDailyRollingFileAppender类,并继承FileAppender。这个类相对于DailyRollingFileAppender,只需要修改两处:

图 修改activateOptions方法

图 修改rollOver方法

图 修改后生成的日志文件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

学习量化交易如何入门?

Python 量化入门很简单&#xff0c;只需 3 步就能快速上手! 题主在程序方向没有相关经验&#xff0c;今天就从量化行业的通用语言-Python 着手&#xff0c;教大家如何快速入门。 一、准备工作 在开始 Python 编程之前&#xff0c;首先需要确保你的计算机上安装了合适的 Pytho…

【Python爬虫】8大模块md文档从0到scrapy高手,第8篇:反爬与反反爬和验证码处理

本文主要学习一下关于爬虫的相关前置知识和一些理论性的知识&#xff0c;通过本文我们能够知道什么是爬虫&#xff0c;都有那些分类&#xff0c;爬虫能干什么等&#xff0c;同时还会站在爬虫的角度复习一下http协议。 Python爬虫和Scrapy全套笔记直接地址&#xff1a; 请移步这…

基于springboot实现电子招投标系统【项目源码】计算机毕业设计

基于springboot实现电子招投标系统演示 SpringBoot框架 SpringBoot是一个全新开源的轻量级框架。基于Spring4.0设计&#xff0c;其不仅继承了Spring框架原来有的优秀特性&#xff0c;而且还通过简化配置文件来进一步简化了Spring应用的整个搭建以及开发过程。另外在原本的Spri…

【学习篇】Linux中grep、sed、awk

Linux 文本处理三剑客 – awk, sed, grep grep过滤文本 https://zhuanlan.zhihu.com/p/561445240 grep 是 Linux/Unix 系统中的一个命令行工具&#xff0c;用于从文件中搜索文本或字符串。grep 代表全局正则表达式打印。当我们使用指定字符串运行 grep 命令时&#xff0c;如…

游戏开发团队配置与协作流程

游戏开发技术图谱 - 知乎 游戏制作的流程是什么啊&#xff1f; - 知乎 系统策划&#xff1a;一张图梳理游戏系统的生产流程 - 知乎 游戏开发入门&#xff08;十一&#xff09;游戏引擎架构-CSDN博客

数据结构与算法编程题15

设计一个算法&#xff0c;通过遍历一趟&#xff0c;将链表中所有结点的链接方向逆转&#xff0c;仍利用原表的存储空间。 #include <iostream> using namespace std;typedef int Elemtype; #define ERROR 0; #define OK 1;typedef struct LNode {Elemtype data; …

安装MySQL搭建论坛

课前默写&#xff1a; 1、nginx配置文件的区域有哪些 ①全局区域 ②events区域 ③http区域 2、区域模块的作用 全局区域模块主要是用户和工作进程 events区域模块配置最大连接数时需先配置:vim /etc/limits.conf 因为系统默认最大是1024 http区域模块&#xff1a;代理地…

HTML的学习

知己知彼百战不殆 打算学习一下javascript 所以先从基础的html语言开始 其实就是头部 和身体 头部控制整个 html的语言 title等 <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"width…

vue项目引入element-plus

文章目录 引入框架遇到的问题引入的时候&#xff0c;报错 ...(reading replace)...报错&#xff1a;The template root requires ...eslint报错&#xff1a; 运行 引入框架 使用add引入 遇到的问题 引入的时候&#xff0c;报错 …(reading ‘replace’)… Cannot read prop…

Springboot将多个图片导出成zip压缩包

Springboot将多个图片导出成zip压缩包 将多个图片导出成zip压缩包 /*** 判断时间差是否超过6小时* param startTime 开始时间* param endTime 结束时间* return*/public static boolean isWithin6Hours(String startTime, String endTime) {// 定义日期时间格式DateTimeFormatt…

【深度学习】学习率及多种选择策略

学习率是最影响性能的超参数之一&#xff0c;如果我们只能调整一个超参数&#xff0c;那么最好的选择就是它。相比于其它超参数学习率以一种更加复杂的方式控制着模型的有效容量&#xff0c;当学习率最优时&#xff0c;模型的有效容量最大。本文从手动选择学习率到使用预热机制…

单元测试-java.lang.NullPointerException

报错信息 java.lang.NullPointerException 空指针异常 空对象引用 来源 对Controller层进行单元测试&#xff0c;解决完Spring上下文报错后继续报错。 解决 在测试方法执行前要为字段完成对象的注入&#xff0c;否则就报空指针异常。 测试例子 public class SysUserContr…

NX二次开发UF_CAM_update_list_object_customization 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_update_list_object_customization Defined in: uf_cam.h int UF_CAM_update_list_object_customization(tag_t * object_tags ) overview 概述 This function provids the…

Ubuntu 1.84.2Visual Studio Code 下载配置与vscode查看内存Hex Editor插件,简单易懂

目录 前言 一 首先我为啥要重装Vs Code呢&#xff1f; 二 下载1.84.2Visual Studio Code 三 配置Vscode终端字体 四 安装插件 前言 这是一篇将老版本的VsCode下载至最新版的博文&#xff0c;从下载到调试全篇 一 首先我为啥要重装Vs Code呢&#xff1f; 因为我想安装这个…

【HMS Core】推送问题的小九九

【问题描述1】 不在华为应用市场上架&#xff0c;是否可以使用推送服务&#xff0c;申请自分类&#xff1f; 【解决方案】 目前使用推送服务不强制要求上架&#xff0c;不上架也可正常使用、申请自分类权限。 【问题描述2】 数据存储位置改变后&#xff0c;自分类权限申请按…

148W+奖池!目标检测、图像分类新赛事!2023无锡国际人工智能算法大赛赛题详解来了!

各位人工智能卓越的推动者们&#xff0c;我们诚邀您参与【2023年无锡国际人工智能算法大赛】&#xff0c;探索未来AI创新的巅峰之战&#xff01; 报名链接&#xff1a;极市开发者平台-计算机视觉算法开发落地平台-极市科技 【大赛进程】 12月11日12:00&#xff1a;报名及初…

JAVA小游戏“飞翔的小鸟”

第一步是创建项目 项目名自拟 第二步创建个包名 来规范class 再创建一个包 来存储照片 如下&#xff1a; 代码如下&#xff1a; package game; import java.awt.*; import javax.swing.*; import javax.imageio.ImageIO;public class Bird {Image image;int x,y;int width…

SageMath安装

Sagemath工具是免费开源的&#xff0c;针对数学计算的一个工具。 网页版免安装&#xff1a;https://sagecell.sagemath.org/ Sagemath是根据Linux系统编写的&#xff0c;所以Windows上使用的话&#xff0c;会创建一个Linux系统运行。 1. 安装 Windows本地安装参考&#xff1…

多线程的实现方式

点击链接返回标题-> Java线程的学习-CSDN博客 第一种方式&#xff0c;继承Thread类 Thread类是java.lang包下的类&#xff0c;是多线程经常需要使用的类。 ①通过自定义子类去继承Thread类&#xff0c;并重写其中的run()方法。 class myThread extends Thread {//自定义子类…

(5秒解决)ImportError: attempted relative import with no known parent package

寻找了很多方法&#xff0c;发现大家把事情讲的复杂了。我这里用最简单的办法来解决父包引用找不到的问题。 报错提示&#xff1a;ImportError: attempted relative import with no known parent package 先给大家看看我的目录结构&#xff0c;model.py和test目录在同一级。tra…