Log4j日志框架讲解(全面,详细)

目录

Log4j概述

log4j的架构(组成)

Loggers

 Appenders

Layouts

快速入门

依赖

 java代码

日志的级别

log4j.properties

自定义Logger

总结:


Log4j概述

Log4j是Apache下的一款开源的日志框架,通过在项目中使用 Log4J,我们可以控制日志信息输出到控制台、文件、甚至是数据库中。我们可以控制每一条日志的输出格式,通过定义日志的输出级别,可以 更灵活的控制日志的输出过程。方便项目的调试。

log4j这个日志框架是现在那些流行的日志框架实现的始祖,现在流行的logback,log4j2这些都是基于或者参考log4j这个日志框架实现的,所以学习log4j可以让我们更好的理解和使用现在流行的主流日志框架

官网地址:http://logging.apache.org/log4j/1.2/

log4j的架构(组成)

Loggers

日志记录器,负责收集处理日志记录,实例的命名就是类“XX”的full quailied name(类的全限定名),Logger的名字大小写敏感,其命名有继承机制:例如:name为org.apache.commons的logger会继承 name为org.apache的logger。

Log4J中有一个特殊的logger叫做“root”,他是所有logger的根,也就意味着其他所有的logger都会直接 或者间接地继承自root。root logger可以用Logger.getRootLogger()方法获取。

但是,自log4j 1.2版以来, Logger 类已经取代了 Category 类。对于熟悉早期版本的log4j的人来说, Logger 类可以被视为 Category 类的别名。

  • 早期架构

 Appenders

Appender 用来指定日志输出到哪个地方,可以同时指定日志的输出目的地。Log4j 常用的输出目的地有以下几种:

Layouts

布局器 Layouts用于控制日志输出内容的格式,让我们可以使用各种需要的格式输出日志。Log4j常用 的Layouts:

  • Layout的格式 

看log4j的组成,其实架构和JUL很像,都是由三部分组成,loggers -->logger,appenders-->handler,layouts-->fomatter  。但具体的实现细节还是有差别的

快速入门

  • 依赖

    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

  •  java代码

 public class Log4jTest {
    @Test
    public void testQuick() throws Exception {
        // 初始化系统配置,不需要配置文件
        BasicConfigurator.configure();
        // 创建日志记录器对象
        Logger logger = Logger.getLogger(Log4jTest.class);
        // 日志记录输出
        logger.info("hello log4j");
        // 日志级别
        logger.fatal("fatal");  // 严重错误,一般会造成系统崩溃和终止运行
        logger.error("error");  // 错误信息,但不会影响系统运行
        logger.warn("warn");    // 警告信息,可能会发生问题
        logger.info("info");    // 程序运行信息,数据库的连接、网络、IO操作等
        logger.debug("debug");  // 调试信息,一般在开发阶段使用,记录程序的变量、参数等
        logger.trace("trace");  // 追踪信息,记录程序的所有流程信息
    }


 }

日志的级别

注:一般只使用4个级别,优先级从高到低为 ERROR > WARN > INFO > DEBUG 

log4j.properties

#指定日志的输出级别与输出端

log4j.rootLogger=INFO,Console

# 控制台输出配置

log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n

# 文件输出配置

log4j.appender.A = org.apache.log4j.DailyRollingFileAppender

#指定日志的输出路径

log4j.appender.A.File = D:/log.txt log4j.appender.A.Append = true

#使用自定义日志格式化器

log4j.appender.A.layout = org.apache.log4j.PatternLayout #指定日志的输出格式 log4j.appender.A.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] - [%p] %m%n

#指定日志的文件编码

log4j.appender.A.encoding=UTF-8

#mysql

log4j.appender.logDB=org.apache.log4j.jdbc.JDBCAppender log4j.appender.logDB.layout=org.apache.log4j.PatternLayout log4j.appender.logDB.Driver=com.mysql.jdbc.Driver log4j.appender.logDB.URL=jdbc:mysql://localhost:3306/test log4j.appender.logDB.User=root log4j.appender.logDB.Password=root log4j.appender.logDB.Sql=INSERT INTO log(project_name,create_date,level,category,file_name,thread_name,line,all_categ ory,message) values('itcast','%d{yyyy-MM-dd HH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')

CREATE TABLE `log` ( `log_id` int(11) NOT NULL AUTO_INCREMENT, `project_name` varchar(255) DEFAULT NULL COMMENT '目项名', `create_date` varchar(255) DEFAULT NULL COMMENT '创建时间', `level` varchar(255) DEFAULT NULL COMMENT '优先级', `category` varchar(255) DEFAULT NULL COMMENT '所在类的全名', `file_name` varchar(255) DEFAULT NULL COMMENT '输出日志消息产生时所在的文件名称 ', `thread_name` varchar(255) DEFAULT NULL COMMENT '日志事件的线程名', `line` varchar(255) DEFAULT NULL COMMENT '号行', `all_category` varchar(255) DEFAULT NULL COMMENT '日志事件的发生位置', `message` varchar(4000) DEFAULT NULL COMMENT '输出代码中指定的消息', PRIMARY KEY (`log_id`) ) 

具体实现案例 

# 指定RootLogger的顶级父类的配置信息
log4j.rootLogger = trace,console,DailyRollingFile
log4j.appender.console = org.apache.log4j.ConsoleAppender
#log4j.appender.console.layout = org.apache.log4j.SimpleLayout
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.conversionPattern = %r [%t] %p %c %x - %m%n# 文件输出配置
#log4j.appender.file = org.apache.log4j.FileAppender
##指定日志的输出路径
#log4j.appender.file.File = D:/log11.txt
#log4j.appender.file.Append = true
##使用自定义日志格式化器
#log4j.appender.file.layout = org.apache.log4j.PatternLayout
##指定日志的输出格式
#log4j.appender.file.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] -[%p] %m%n
##指定日志的文件编码
#log4j.appender.file.encoding=UTF-8# DailyRollingFileAppender输出配置
log4j.appender.DailyRollingFile = org.apache.log4j.DailyRollingFileAppender
#指定日志的输出路径
log4j.appender.DailyRollingFile.File = D:/log.txt
log4j.appender.DailyRollingFile.Append = true
#使用自定义日志格式化器
log4j.appender.DailyRollingFile.layout = org.apache.log4j.PatternLayout
#指定日志的输出格式
log4j.appender.DailyRollingFile.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%t:%r] -[%p] %m%n
#指定日志的文件编码
log4j.appender.DailyRollingFile.encoding=UTF-8#* log4j 采用类似 C 语言的 printf 函数的打印格式格式化日志信息,具体的占位符及其含义如下:
#%m 输出代码中指定的日志信息
#%p 输出优先级,及 DEBUG、INFO 等
#%n 换行符(Windows平台的换行符为 "\n",Unix 平台为 "\n")
#%r 输出自应用启动到输出该 log 信息耗费的毫秒数
#%c 输出打印语句所属的类的全名
#%t 输出产生该日志的线程全名
#%d 输出服务器当前时间,默认为 ISO8601,也可以指定格式,如:%d{yyyy年MM月dd日
#HH:mm:ss}
#%l 输出日志时间发生的位置,包括类名、线程、及在代码中的行数。如:
#Test.main(Test.java:10)
#%F 输出日志消息产生时所在的文件名称
#%L 输出代码中的行号
#%% 输出一个 "%" 字符
#* 可以在 % 与字符之间加上修饰符来控制最小宽度、最大宽度和文本的对其方式。如:
#%5c 输出category名称,最小宽度是5,category<5,默认的情况下右对齐
#%-5c 输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格
#%.5c 输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不
#会有空格
#%20.30c category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉

log4j在初始化logger的时候会默认去加载resource下的配置文件,配置文件支持如上图。所以只要你将配置文件放在resource目录下,springboot项目就会去自动加载

 运行成功案例

自定义Logger

# RootLogger 配置
log4j.rootLogger = trace,console
# 自定义 Logger
log4j.logger.com.itheima = info,file
log4j.logger.org.apache = error

@Test
public void testCustomLogger () throws Exception {
// 自定义 com.itheima
Logger logger1 = Logger . getLogger ( Log4jTest . class );
logger1 . fatal ( "fatal" ); // 严重错误,一般会造成系统崩溃和终止运行
logger1 . error ( "error" ); // 错误信息,但不会影响系统运行
logger1 . warn ( "warn" ); // 警告信息,可能会发生问题
logger1 . info ( "info" ); // 程序运行信息,数据库的连接、网络、 IO 操作等
logger1 . debug ( "debug" ); // 调试信息,一般在开发阶段使用,记录程序的变量、参数等
logger1 . trace ( "trace" ); // 追踪信息,记录程序的所有流程信息
// 自定义 org.apache
Logger logger2 = Logger . getLogger ( Logger . class );
logger2 . fatal ( "fatal logger2" ); // 严重错误,一般会造成系统崩溃和终止运行
logger2 . error ( "error logger2" ); // 错误信息,但不会影响系统运行
logger2 . warn ( "warn logger2" ); // 警告信息,可能会发生问题
logger2 . info ( "info logger2" ); // 程序运行信息,数据库的连接、网络、 IO 操作等
logger2 . debug ( "debug logger2" ); // 调试信息,一般在开发阶段使用,记录程序的变量、参
数等
logger2 . trace ( "trace logger2" ); // 追踪信息,记录程序的所有流程信息
}

未配置定义Logger前输出

配置后输出

总结:

Log4J 主要由 Loggers (日志记录器)、Appenders(输出端)和 Layout(日志格式化器)组成。其中 Loggers 控制日志的输出级别与日志是否输出;Appenders 指定日志的输出方式(输出到控制台、文件 等);Layout 控制日志信息的输出格式。 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024 年人工智能和数据科学的五个主要趋势

引言 2023年&#xff0c;人工智能和数据科学登上了新闻头条。生成性人工智能的兴起无疑是这一显著提升曝光度的驱动力。那么&#xff0c;在2024年&#xff0c;该领域将如何继续占据头条&#xff0c;并且这些趋势又将如何影响企业的发展呢&#xff1f; 在过去几个月&#xff0c;…

Sql审核平台Archery的搭建和简单配置

Sql审核平台Archery的搭建和简单配置 Archery是一个开源的Web应用&#xff0c;基于Python开发&#xff0c;利用Flask作为后端框架&#xff0c;前端采用Vue.js&#xff0c;构建了一个现代化的数据操作界面。提供了SQL审核、数据查询、报表生成等功能&#xff0c;同时支持多种数据…

qtreewidget 美化,htmlcss和qss 不是一个概念!已解决

这种样式的美化&#xff0c; 能气死个人&#xff0c;css 一个单词搞定&#xff0c;非要 在qss中。多少个单词不知道了。 m_tree_widget->setStyleSheet("QTreeView{background:transparent; selection-background-color:transparent;}""QTreeView::branch{b…

软考满分范文“论模型驱动架构设计方法及其应用”,软考高级,系统架构设计师

论文真题 模型驱动架构设计是一种用于应用系统开发的软件设计方法,以模型构造、模型转换和精化为核心,提供了一套软件设计的指导规范。在模型驱动架构环境下,通过创建出机器可读和高度抽象的模型实现对不同问题域的描述,这些模型独立于实现技术,以标准化的方式储存,利用…

Django QuerySet对象,all()方法

all()方法 在Django中&#xff0c;all()方法是QuerySet对象的一个方法&#xff0c;用于获取模型的所有实例。 当你调用ModelName.objects.all()时&#xff0c;Django会生成一个SQL查询&#xff0c;从数据库中获取该模型的所有记录&#xff0c;并返回一个QuerySet对象&#xf…

AzureDataFactory Dataverse connector自动处理了分页问题(单次查询上限5000条的限制)

众所周知&#xff0c;在用fetch执行D365的查询时&#xff0c;单次的查询是5000条&#xff0c;如果超过5000条则需要自己处理分页&#xff0c;添加额外的处理逻辑&#xff0c;但在ADF中&#xff0c;Dataverse connector已经自动处理了分页&#xff0c;我们可以很简单的做个POC. …

【HarmonyOS4学习笔记】《HarmonyOS4+NEXT星河版入门到企业级实战教程》课程学习笔记(二十)

课程地址&#xff1a; 黑马程序员HarmonyOS4NEXT星河版入门到企业级实战教程&#xff0c;一套精通鸿蒙应用开发 &#xff08;本篇笔记对应课程第 30 节&#xff09; P30《29.数据持久化-用户首选项》 实现数据持久化在harmonyOS中有很多种方式&#xff0c;比较常见的是以下两…

在Redis中使用Lua脚本实现多条命令的原子性操作

Redis作为一个高性能的键值对数据库&#xff0c;被广泛应用于各种场景。然而&#xff0c;在某些情况下&#xff0c;我们需要执行一系列Redis命令&#xff0c;并确保这些命令的原子性。这时&#xff0c;Lua脚本就成为了一个非常实用的解决方案。 问题的提出 假设我们有一个计数…

抠图怎么保存抠出来的部分?这些方法非常简单

图像处理已成为我们日常生活和工作中不可或缺的一部分。无论是设计海报、编辑照片&#xff0c;还是制作视频特效&#xff0c;抠图技术都发挥着至关重要的作用。然而&#xff0c;很多人在完成抠图后&#xff0c;却不知道如何保存抠出来的部分&#xff0c;这无疑给他们的创作带来…

Day63 代码随想录打卡|回溯算法篇---电话号码的字母组合

题目&#xff08;leecode T17&#xff09;&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 方法&#xff1a;…

串级PID控制算原理及法详解

文章目录 1. PID 2. 串级PID 3. 串级PID的物理量 4. C语言实现单极PID 5. C语言实现串极PID 6. 模拟仿真 1. PID PID是应用最广泛的闭环控制方法之一&#xff0c;是一种常用的反馈控制方法&#xff0c;对于每个PID控制器由三个部分组成&#xff1a;比例控制&#xff08;…

2024中国西安科博会暨硬科技产业博览会11月召开

2024第18届中国西安国际科学技术产业博览会暨硬科技产业博览会 时间&#xff1a;2024年11月3日-5日 地点&#xff1a;西安国际会展中心 主办单位&#xff1a;中国国际科学技术合作协会 陕西省科技资源统筹中心 协办单位&#xff1a;西安市科学技术协会 西安市中小企业协会、…

Hadoop3:Yarn容量调度器配置多队列案例

一、情景描述 需求1&#xff1a; default队列占总内存的40%&#xff0c;最大资源容量占总资源60%&#xff0c;hive队列占总内存的60%&#xff0c;最大资源容量占总资源80%。 二、多队列优点 &#xff08;1&#xff09;因为担心员工不小心&#xff0c;写递归死循环代码&#…

科研与英文学术论文写作指南——于静老师课程

看到了一个特别棒的科研与英文学术论文写作指南&#xff0c;理论框架实例。主讲人是中科院信息工程研究所的于静老师。推荐理由&#xff1a;写论文和读论文或者讲论文是完全不一样的&#xff0c;即使现在还没有发过论文&#xff0c;但是通过于老师的课程&#xff0c;会给后续再…

Unity之创建与导出PDF

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之创建与导出PDF TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01; 助力快速…

订单服务-提交订单业务立即购买业务

文章目录 1、提交订单 业务2、在 OrderController 创建 submitOrder 方法3、 在 OrderServiceImpl 中实现 submitOrder 方法4、根据id查询sku详情&#xff08;service-product"&#xff09;5、查询用户地址保存到订单项中&#xff08;service-user&#xff09;6、删除购物…

udp发送数据如果超过1个mtu时,抓包所遇到的问题记录说明

最近在测试Syslog udp发送相关功能&#xff0c;测试环境是centos udp头部的数据长度是2个字节&#xff0c;最大传输长度理论上是65535&#xff0c;除去头部这些字节&#xff0c;可以大概的说是64k。 写了一个超过64k的数据(随便用了一个7w字节的buffer)发送demo&#xff0c;打…

USB-SC-09编程电缆使用手册

USB-SC-09编程电缆是通过电脑的USB口仿真成传统串口&#xff08;俗称COM口&#xff09;&#xff0c;从而使用现有的各种编程软件、通信软件和监控软件等&#xff0c;转换盒上的发光二极管指示数据的收发状态&#xff0c;本电缆适用于三菱FX全系列PLC USB-SC-09电缆外观&#xf…

【AIGC评测体系】大模型评测指标集

大模型评测指标集 &#xff08;☆&#xff09;SuperCLUE&#xff08;1&#xff09;SuperCLUE-V&#xff08;中文原生多模态理解测评基准&#xff09;&#xff08;2&#xff09;SuperCLUE-Auto&#xff08;汽车大模型测评基准&#xff09;&#xff08;3&#xff09;AIGVBench-T2…

【python - 数据】

一、序列 序列&#xff08;sequence&#xff09;是一组有顺序的值的集合&#xff0c;是计算机科学中的一个强大且基本的抽象概念。序列并不是特定内置类型或抽象数据表示的实例&#xff0c;而是一个包含不同类型数据间共享行为的集合。也就是说&#xff0c;序列有很多种类&…