java日志框架之Log4j

文章目录

  • 一、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 {@Testpublic void test01() {// 加载初始化配置(没有配置文件则需要添加此配置)BasicConfigurator.configure();// 实例化LoggerLogger 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(){//输出到文件对于追加,默认是trueLogger 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.rhkb.cn/news/429844.html

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

相关文章

【HTTPS】中间人攻击和证书的验证

中间人攻击 服务器可以创建出一堆公钥和私钥&#xff0c;黑客也可以按照同样的方式&#xff0c;创建一对公钥和私钥&#xff0c;冒充自己是服务器&#xff08;搅屎棍&#xff09; 黑客自己也能生成一对公钥和私钥。生成公钥和私钥的算法是开放的&#xff0c;服务器能生产&…

基于阿里云免费部署Qwen1-8B-chat模型并进行lora参数微调从0到1上手操作

文章目录 一、申请资源二、创建实例三、克隆微调数据四、部署Qwen1-8B-chat模型1、环境配置2、模型下载3、本地模型部署 五、模型微调1、拉取Qwen仓库源码2、微调配置3、合并微调参数4、本地部署微调模型 一、申请资源 阿里云账号申请PAI资源详细教程我已于部署ChatGLM3时写过…

MAC如何获取文件数字签名和进程名称

1、安装需要查看数字签名和进程名称的软件包 2、打开终端命令行&#xff08;Terminal&#xff09; 3、查找数字签名 在终端命令行中输入&#xff1a; codesign -dvv 安装的软件路径 2>&1 | grep "Authority" | head -n 1 | cut -d -f2”回显即为进程的数…

Unity 百度AI实现无绿幕拍照抠像功能(详解版)

目录 一、前言 1.抠像效果 2.去哪找百度ai抠图 3.基础流程跳过 二、获取AccessToken 1.什么是Token 2.为什么要获取Token 3.如何获取token 4.解析json 5.完整代码 三、抠像 1.准备地址 2.建立链接&#xff0c;和基本配置 3.图片格式转换 4.开始上传 5.获取回复…

Highcharts甘特图基本用法(highcharts-gantt.js)

参考官方文档&#xff1a; https://www.highcharts.com/docs/gantt/getting-started-gantt https://www.highcharts.com/demo/gantt/project-management https://www.hcharts.cn/demo/gantt 链接在下面按需引入 https://code.highcharts.com/gantt/highcharts-gantt.js htt…

[笔记]23年度展会信息— 吊钩 起升机构

1.吊钩的规格参数 5吨吊钩重26公斤 10吨64公斤。 另外一套型号&#xff0c;更轻&#xff1a; 不确定是结构设计还是用钢材质达到了减重效果。 看看重载双滑轮吊钩&#xff1a; 50吨&#xff0c;400公斤&#xff0c;只是吊钩。 然后是行车吊钩与钢丝绳的直径。这在计算空载吊…

faiss安装 (CPU版本)

faiss版本 faiss-v1.7.4 cd faiss-v1.7.4cmake -B build . -DBUILD_TESTINGOFF -DFAISS_ENABLE_GPUOFF -DFAISS_ENABLE_PYTHONOFFmake -C build -j faiss&#xff1b; 默认安装路径如下 -- Installing: /usr/local/lib64/libfaiss.a -- Installing: /usr/local/include/faiss…

耦合微带线单元的网络参量和等效电路公式推导

文档下载链接&#xff1a;耦合微带线单元的网络参量和等效电路资源-CSDN文库https://download.csdn.net/download/lu2289504634/89583027笔者水平有限&#xff0c;错误之处欢迎留言&#xff01; 一、耦合微带线奇偶模详细推导过程 二、2,4端口开路 三、2端口短路、3端口开路 四…

LeetCode 热题 100 回顾16

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

win系统接入google_auth实现动态密码,加强保护

开源代码地址&#xff1a;windows动态密码: 针对win服务器进行的动态密码管控&#xff0c;需要配合谷歌的身份认证APP使用 (gitee.com) 为什么要搞个动态密码呢&#xff1f; 首先云服务器启用了远程访问&#xff0c;虽然更换了端口以及初始用户名&#xff0c;不过还是是不是被…

CleanClip For Mac 強大的剪貼簿助手Paste替代工具 v2.2.1

软件介绍&#xff1a; CleanClip是一款专为Mac设计的强大剪贴板管理工具&#xff0c;旨在提升用户的工作效率和生产力。这款应用完全采用原生Swift编写&#xff0c;为Mac用户提供了流畅、快速且直观的使用体验。CleanClip不仅支持文本内容的管理&#xff0c;还能处理图片、文件…

锂电池基础知识

1. 电池的发展史 电池是将化学能转变为电能的装置&#xff0c;通过电池内部的化学反应向外部提供直流电能 1800年Vote伏打电堆 1835年英国Daniel丹尼尔电池 1859年法国Plante铅酸蓄电池 1866年法国Leclanche锌锰电池 1899年瑞典Jungner镍镉电池 1950年Urry碱性电池 1990年索尼…

使用 GaLore 预训练LLaMA-7B

项目代码&#xff1a; https://github.com/jiaweizzhao/galorehttps://github.com/jiaweizzhao/galore 参考博客&#xff1a; https://zhuanlan.zhihu.com/p/686686751 创建环境 基础环境配置如下&#xff1a; 操作系统: CentOS 7CPUs: 单个节点具有 1TB 内存的 Intel CP…

【小沐学CAD】3ds Max常见操作汇总

文章目录 1、简介2、二次开发2.1 C 和 3ds Max C SDK2.2 NET 和 3ds Max .NET API2.3 3ds Max 中的 Python 脚本2.4 3ds Max 中的 MAXScript 脚本 3、快捷键3.1 3Dmax键快捷键命令——按字母排序3.2 3dmax快捷键命令——数字键3.3 3dmax功能键快捷键命令3.4 3Dmax常用快捷键——…

Gin框架入门(2)--异常捕获与日志实现

异常捕获 Go语言的异常捕获采用的是延迟处理的方法实现的&#xff0c;实际上就是利用defer&#xff0c;panic和recover三个关键字和函数来实现的。 关键字 defer关键字(函数) 这个关键字在控制语句中就有所涉及&#xff0c;本质上是采用一个栈的存储结构&#xff0c;在整个…

鸿蒙Harmony应用开发,数据驾驶舱登录页面的实现

鸿蒙Harmony应用开发&#xff0c;数据驾驶舱登录页面的实现 ​ 首先我们有个Splash 过渡页面来判断当前是用户是否登录&#xff0c;我们先从preferences中获取token是否存在。如果不存在直接跳转登录即可&#xff0c;如果存在的情况我们再去获取下用户的信息看看token是否过期…

MySQL---创建数据库(基于SQLyog)

目录 0.前言 1.基本认识 1.1编码集 1.2检验规则 2.库的创建和销毁 2.1指令介绍 2.2你可能会出现的问题 3.查看数据库属性 4.创建指定数据库 5.创建表操作 0.前言 之前写过一篇这个关于表的创建和销毁的操作&#xff0c;但是当时是第一次学习&#xff0c;肯定有些地方…

Docker的安装和使用

Docker概述 Docker简介 Docker 是基于 Go 语言实现的云开源项目。 Docker 的主要目标是&#xff1a; Build, Ship and Run Any App, Anywhere &#xff0c;也就是通过对应用组件的封装、 分发、部署、运行等生命周期的管理&#xff0c;使用户的 APP 及其运行环境能做到 一次…

【Python】 已解决:ModuleNotFoundError: No module named…

个人简介&#xff1a;某不知名博主&#xff0c;致力于全栈领域的优质博客分享 | 用最优质的内容带来最舒适的阅读体验&#xff01;文末获取免费IT学习资料&#xff01; &#x1f345; 文末获取更多信息 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅收藏 &#x…

Qt clicked()、clicked(bool)、toggled(bool)信号的区别和联系

clicked() 信号 所属控件&#xff1a;clicked()信号是QAbstractButton类&#xff08;及其子类&#xff0c;如QPushButton、QRadioButton、QCheckBox等&#xff09;的一个信号。clicked信号可以说是许多控件&#xff08;特别是按钮类控件&#xff0c;如QPushButton&#xff09;…