java日志框架之Log4j

news2024/11/15 13:46:46

文章目录

  • 一、Log4j简介
  • 二、Log4j组件介绍
    • 1、Loggers (日志记录器)
    • 2、Appenders(输出控制器)
    • 3、Layout(日志格式化器)
  • 三、Log4j快速入门
  • 四、Log4j自定义配置文件输出日志
    • 1、输出到控制台
    • 2、输出到文件
    • 3、输出到数据库
  • 五、Log4j自定义配置文件拆分日志
    • 1、按照文件大小进行拆分
    • 2、按照日期进行拆分
  • 六、自定义配置文件中的logger

一、Log4j简介

  • Log4j是Apache的一个开源项目
  • 可以控制日志信息输出到控制台文件、甚至是数据库
  • 可以控制每一条日志的输出格式
  • 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码

二、Log4j组件介绍

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

1、Loggers (日志记录器)

  • 日志记录器,负责收集处理日志记录
    • 实例的命名就是类的全限定名,如com.xc.log4j.XX
    • Logger的名字大小写敏感
  • 命名有继承机制
    • 例如:name为com.xc.log4j的logger会继承name为com.xc的logger的属性
    • 父类所做的日志属性设置,会直接的影响到子类
  • Log4J中有一个特殊的logger叫做“root”,他是所有logger的根
    • 也就意味着其他所有的logger都会直接或者间接地继承自root
    • root logger可以用Logger.getRootLogger()方法获取

2、Appenders(输出控制器)

  • ConsoleAppender:将日志输出到控制台
  • FileAppender:将日志输出到文件中
  • DailyRollingFileAppender:将日志输出到一个日志文件,并且每天输出到一个新的文件
  • RollingFileAppender:将日志信息输出到一个日志文件,并且指定文件的尺寸,当文件大小达到指定尺寸时,会自动把文件改名,同时产生一个新的文件
  • JDBCAppender:把日志信息保存到数据库

3、Layout(日志格式化器)

  • HTMLLayout:格式化日志输出为HTML表格形式
  • SimpleLayout:简单的日志输出格式化,打印的日志格式如默认INFO级别的消息
  • PatternLayout:最强大的格式化组件,有默认的转换格式,也可以自定义格式输出日志

日志输出格式说明

  • %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快速入门

pom依赖

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>
import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Logger;
import org.junit.Test;

public class Log4jTest {
    @Test
    public void test01() {
        // 加载初始化配置(没有配置文件则需要添加此配置)
        BasicConfigurator.configure();
        // 实例化Logger
        Logger logger = Logger.getLogger(Log4jTest.class);
        logger.info("logger实例名称:" + logger.getName());
        logger.fatal("fatal信息");
        logger.error("error信息");
        logger.warn("warn信息");
        logger.info("info信息");
        logger.debug("debug信息");
        logger.trace("trace信息");
    }
}

输出结果:

0 [main] INFO com.xc.log.Log4jTest  - logger实例名称:com.xc.log.Log4jTest
1 [main] FATAL com.xc.log.Log4jTest  - fatal信息
1 [main] ERROR com.xc.log.Log4jTest  - error信息
1 [main] WARN com.xc.log.Log4jTest  - warn信息
1 [main] INFO com.xc.log.Log4jTest  - info信息
1 [main] DEBUG com.xc.log.Log4jTest  - debug信息

Log4j提供了8个级别的日志输出

  • ALL:最低等级 用于打开所有级别的日志记录
  • TRACE:程序推进下的追踪信息,这个追踪信息的日志级别非常低,一般情况下是不会使用的
  • DEBUG:指出细粒度信息事件对调试应用程序是非常有帮助的,主要是配合开发,在开发过程中打印一些重要的运行信息(默认级别)
  • INFO:消息的粗粒度级别运行信息
  • WARN:表示警告,程序在运行过程中会出现的有可能会发生的隐形的错误
  • ERROR:系统的错误信息,发生的错误不影响系统的运行 一般情况下,如果不想输出太多的日志,则使用该级别即可
  • FATAL:表示严重错误,它是那种一旦发生系统就不可能继续运行的严重错误
  • OFF:最高等级的级别,用户关闭所有的日志记录

四、Log4j自定义配置文件输出日志

  • Loader.getResource("log4j.properties");源码默认从类路径

1、输出到控制台

resources目录下的log4j.properties文件

在这里插入图片描述

@Test
public void test02(){
	//自定义配置文件设置Appender(输出方式)和Layout(输出格式)
    Logger logger = Logger.getLogger(Log4jTest.class);
    logger.fatal("fatal信息");
    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}

输出结果:

[FATAL     ] [main] [2024-09-19 22:38:55:822] [com.xc.log.Log4jTest.test01(Log4jTest.java:18)] fatal信息
[ERROR     ] [main] [2024-09-19 22:38:55:825] [com.xc.log.Log4jTest.test01(Log4jTest.java:19)] error信息
[WARN      ] [main] [2024-09-19 22:38:55:825] [com.xc.log.Log4jTest.test01(Log4jTest.java:20)] warn信息
[INFO      ] [main] [2024-09-19 22:38:55:825] [com.xc.log.Log4jTest.test01(Log4jTest.java:21)] info信息

2、输出到文件

resources目录下的log4j.properties文件
在这里插入图片描述

@Test
public void test03(){
	//输出到文件对于追加,默认是true
    Logger logger = Logger.getLogger(Log4jTest.class);
    logger.fatal("fatal信息");
    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}

输出结果:

在这里插入图片描述

3、输出到数据库

创建表结构:(字段的制定可以根据需求进行调整)

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`)
);

resources目录下的log4j.properties文件

在这里插入图片描述

@Test
public void test04(){
	//将日志持久化到数据库表中
    Logger logger = Logger.getLogger(Log4jTest.class);
    logger.fatal("fatal信息");
    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}

输出结果:

在这里插入图片描述

五、Log4j自定义配置文件拆分日志

1、按照文件大小进行拆分

resources目录下的log4j.properties文件

在这里插入图片描述

@Test
public void test05(){
    Logger logger = Logger.getLogger(Log4jTest.class);
    for (int i = 0; i < 10000; i++) {
         logger.fatal("fatal信息");
         logger.error("error信息");
         logger.warn("warn信息");
         logger.info("info信息");
         logger.debug("debug信息");
         logger.trace("trace信息");
     }
}

第一次执行

在这里插入图片描述

第二次执行

在这里插入图片描述

  • 最新日志在logFile.log文件中,logFile.log.x数字越小日志越新
  • 先打印的日志会被先覆盖
    • 如上第一次打印0123
    • 第二次打印中的45是第一次打印的0123被覆盖后东西
    • 01比23内容新,23被覆盖,那么45中剩余的就是01的内容
  • 总之最新的内容覆盖最旧的内容

2、按照日期进行拆分

resources目录下的log4j.properties文件

在这里插入图片描述

@Test
public void test05(){
	//根据日期拆分
    Logger logger = Logger.getLogger(Log4jTest.class);
    logger.fatal("fatal信息");
    logger.error("error信息");
    logger.warn("warn信息");
    logger.info("info信息");
    logger.debug("debug信息");
    logger.trace("trace信息");
}
  • 这里使用的默认根据拆分,也可以根据小时,分钟拆分
  • 今天是9.20日,昨天的日志被添加到新文件logFile.log.2024-09-19中
  • 当天日志都会记录在logFile.log中
    在这里插入图片描述

六、自定义配置文件中的logger

  • 常规创建出来的Logger对象,默认都是继承rootLogger的
  • 也可以自定义logger,让其他logger来继承这个logger

在这里插入图片描述

  • 如果根节点的logger和自定义logger配置的输出位置是不同的,则取二者的并集,配置的位置都会进行输出操作
  • 如果二者配置的日志级别不同,以按照我们自定的logger的级别输出为主

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

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

相关文章

ESP32无线WiFi蓝牙SOC,设备物联网通信方案,启明云端乐鑫代理商

在当今数字化时代&#xff0c;物联网(IoT)正迅速成为连接我们生活各个方面的无形纽带&#xff0c;越来越多的日常物品被赋予了智能功能&#xff0c;从灯泡到插座&#xff0c;从门锁到家电设备&#xff0c;这些设备正在改变我们与家庭环境的互动方式。 随着智能产品的普及&…

*C++:string

一.STL简介 1.STL STL(standard template libaray- 标准模板库 ) &#xff1a; 是 C 标准库的重要组成部分 &#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架 。 2.STL六大组件 二.标准库里的string类 标准string库网址&#xff1…

【AI算法岗面试八股面经【超全整理】——NLP】

AI算法岗面试八股面经【超全整理】 概率论【AI算法岗面试八股面经【超全整理】——概率论】信息论【AI算法岗面试八股面经【超全整理】——信息论】机器学习【AI算法岗面试八股面经【超全整理】——机器学习】深度学习【AI算法岗面试八股面经【超全整理】——深度学习】NLP【A…

Crack道路裂缝检测数据集——目标检测数据集

【Crack道路裂缝检测数据集】共3684张。 目标检测数据集&#xff0c;标注文件为YOLO适用的txt格式。已划分为训练、验证集。 图片分辨率&#xff1a;224*224 类别&#xff1a;crack Crack道路裂缝检测数据集 数据集描述 该数据集是一个专门用于训练和评估基于YOLO&#xff0…

[笔记]某变频器,功能列表及参数表

产品代号&#xff1a;INVT GOODDRIVE&#xff0c;这家公司我的产品我似乎在特检院看到过&#xff1f;或者在某个地铁建设工地看到过。是深圳的。 1.产品功能点&#xff1a; 变频锥形电机控制、抱闸转矩验证&#xff1f;抱闸反馈零位检测行程限位超载防护轻载升速&#xff08;…

机器学习课程学习周报十三

机器学习课程学习周报十三 文章目录 机器学习课程学习周报十三摘要Abstract一、机器学习部分1. 文生图模型概述2. Stable Diffusion概述3. ControlNet概述4. 概率论复习&#xff08;二&#xff09; 总结 摘要 本周的学习内容涵盖了文生图模型、Stable Diffusion、ControlNet以…

从零开始讲DDR(5)——读懂Datasheet

对于开发人员来说&#xff0c;需要根据实际场景和使用的需要&#xff0c;使用不同厂家&#xff0c;不同型号的DDR&#xff0c;虽然原理上大同小异&#xff0c;但是还是有一些细节上的需要注意的地方&#xff0c;接触一个新的DDR芯片&#xff0c;首先就是需要找到对应的datashee…

Mybatis 返回 Map 对象

一、场景介绍 假设有如下一张学生表&#xff1a; CREATE TABLE student (id int NOT NULL AUTO_INCREMENT COMMENT 主键,name varchar(100) NOT NULL COMMENT 姓名,gender varchar(10) NOT NULL COMMENT 性别,grade int NOT NULL COMMENT 年级,PRIMARY KEY (id) ) ENGINEInnoD…

LeetCode讲解篇之238. 除自身以外数组的乘积

文章目录 题目描述题解思路题解代码 题目描述 题解思路 对于该题&#xff0c;我们可以先使用一个循环记录所有非零元素的乘积结果和非零元素的个数 如果非零元素个数为0&#xff0c;则非零元素的乘积除以数组对应位置的数字就是除自身以外的数组的乘积如果非零元素个数为1&am…

新质农业——水肥一体化技术

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案&#xff0c;帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、埃域知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&…

【人工智能学习】8_人工智能其他通用技术

知识图谱 在看影视剧或小说时&#xff0c;若其中的人物很多、人物关系复杂&#xff0c;我们一般会用画人物关系图谱来辅助理解人物关系。那什么是知识图谱呢&#xff1f; 知识是人类对信息进行处理之后的认识和理解&#xff1b;对数据和信息的凝练、总结后的成果。 将信息转…

MySQL-排名函数ROW_NUMBER(),RANK(),DENSE_RANK()函数的异同

MySQL-排名函数ROW_NUMBER()&#xff0c;RANK()&#xff0c;DENSE_RANK()函数的异同 前言 假设有如下表结构与数据&#xff0c;class_id表示班级&#xff0c;需求&#xff1a;现在要按照班级分组&#xff0c;每个班级的学生进行年龄从小到大排序 一、ROW_NUMBER()函数 ROW_NUM…

YOLO航拍车辆和行人识别

YOLO航拍车辆和行人识别 图片数量9695&#xff0c;标注为xml和txt格式&#xff1b; class&#xff1a;car&#xff0c;pedestrian&#xff0c;truck&#xff0c;bus 用于yolo&#xff0c;Python&#xff0c;目标检测&#xff0c;机器学习&#xff0c;人工智能&#xff0c;深度学…

软件测试分类篇(下)

目录 一、按照测试阶段分类 1. 单元测试 2. 集成测试 3. 系统测试 3.1 冒烟测试 3.2 回归测试 4. 验收测试 二、按照是否手工测试分类 1. 手工测试 2. 自动化测试 3. 手工测试和自动化测试的优缺点 三、按照实施组织分类 1. α测试(Alpha Testing) 2. β测试(Beta…

图像放大效果示例【JavaScript】

实现效果&#xff1a; 当鼠标悬停在小图&#xff08;缩略图&#xff09;上时&#xff0c;大图&#xff08;预览图&#xff09;会随之更新为相应的小图&#xff0c;并高亮当前悬浮的小图的父元素。 代码&#xff1a; 1. HTML部分 <!DOCTYPE html> <html lang"z…

Nginx简介;Nginx安装

一&#xff0c;Nginx简介 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件&#xff08;IMAP/POP3&#xff09;代理服务器&#xff0c;在BSD-like 协议下发行。是一个高性能的HTTP和反向代理web服务器 &#xff0c;同时也提供了IMAP/POP3/SMTP服务。 其特点是占有内存少…

OpenCV特征检测(8)检测图像中圆形的函数HoughCircles()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在灰度图像中使用霍夫变换查找圆形。 该函数使用霍夫变换的一种修改版本在灰度图像中查找圆形。 例子&#xff1a; #include <opencv2/imgp…

【解密 Kotlin 扩展函数】扩展函数的创建(十六)

导读大纲 1.1 为第三方的类添加方法: 扩展函数 1.1 为第三方的类添加方法: 扩展函数 Kotlin 的主题之一是与现有代码的平滑集成 即使是纯 Kotlin 项目,也是构建在 Java 库之上的 如 JDK、Android 框架和其他第三方框架 而当你将 Kotlin 集成到 Java 项目中时 你还要处理尚未或不…

Ubuntu清理内存导致的一系列错误及解决方法

文章目录 火狐浏览器和pycharm消失打不开 安不上 卸不掉后记 火狐浏览器和pycharm消失 打不开 安不上 卸不掉 清理内存后&#xff0c;火狐和pycharm的图标都消失了&#xff0c;在终端输入Firefox显示无法打开 应当先snap install firefox&#xff0c;然而snap install firefo…

【排序算法】插入排序_直接插入排序、希尔排序

文章目录 直接插入排序直接插入排序的基本思想直接插入排序的过程插入排序算法的C代码举例分析插入排序的复杂度分析插入排序的优点 希尔排序希尔排序&#xff08;Shell Sort&#xff09;详解希尔排序的步骤&#xff1a;希尔排序的过程示例&#xff1a;希尔排序的C语言实现举例…