Log4j Log4j2
前言
今天抽时间来把这个日志框架学学,毕竟经常用,虽然不用自己写,但是书到用时方恨少,技多不压身。而且最近我的 GUI 软件中有一个关于日志问题的希望学完能够感觉解决掉。
Log4j & Log4j2
Log4j2 是 Log4j 的升级版,2015年5月,Apache 宣布停止 log4j 的更新,最终的版本定格在了 1.2.17。
1、Log4j
Log4j 有三大组件:Loggers(记录器)、Appenders(输出源)和 Layouts(布局)。可以简单理解为
- Loggers:日志的类型,比如 DEBUG(调试信息)、INFO、WARN、ERROR、FATAL
- Appenders:日志输出到哪里,比如控制台,甚至可以是 GUI 组件,比如 JavaFX、Swing 的 TextArea ,这也是我重点希望了解的
- 和 Layouts:日志以怎样的形式输出,比如 ${yyyy-MM-dd HH:mm:ss}
1.1、Loggers
在设置日志输出的时候,会设置一个日志的输出级别,只有大于等于这个级别的日志才会输出。
DEBUG < INFO < WARN < ERROR < FATAL
1.2、Appenders
日志的输出源,可以是控制台(Console),可以是文件(File),或者是我们 Java Swing 和 JavaFX 的 TextArea 这种 GUI 控件中。
可以根据文件的大小产生新的文件,可以以流的形式发送到其它地方等。
常用的类:
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天产生一个新的文件,比如 hive.log)
- org.apache.log4j.RollingFileAppender(文件大小达到指定大小就产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
基本上可以满足我们日常的需求,如果我们的需求比较特殊,比如把日志输出到 JavaFX 的 TextArea 中,输出到 org.fxmisc.richtext 的 CodeArea 中,那么我们就可以自定义一个 Appender 类实现 AppenderSkeleton 接口。AppenderSkeleton 接口定义了一系列记录日志的方法,我们按照自己的需求实现这些方法即可。
1.3、Layouts
用户可以根据自己的喜好格式化自己的日志输出,Layouts 提供了四种日志的输出样式,比如根据 HTML 样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式。
常用的类如下:
- org.apache.log4j.HTMLLayout (以 HTML 表格形式布局 )
- org.apache.log4j.PartternLayout(可以灵活地指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
1.4、Log4j 的使用
log4j 的使用依赖配置文件。log4j 支持两种配置文件的形式,一种是 XML 格式、一种是 .properties 文件。
1.4.1、导包
<dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version>
</dependency>
1.4.2、创建配置文件
日志配置文件:log4j.properties 或者 logback.xml。
普通 Java 项目放到 src 同级目录下,maven 项目下放到 src/main/resources/ 目录下
# 指定日志输出级别,输出源
log4j.rootLogger=INFO,textArea,FILE# 输出到 GUI 组件
log4j.appender.textArea=org.apache.log4j.ConsoleAppender
log4j.appender.textArea.layout=org.apache.log4j.PatternLayout
log4j.appender.textArea.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [ %p ] %m%n# 输出到文件
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
log4j.appender.FILE.File=./logs/app.log
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} %-5p %c{1}:%L - %m%n
1.4.3、使用
class Test{// 一般都是定义为静态全局变量private final static Logger logger = Logger.getLogger(Test.class);public static void main(String[] args){// 需要输出日志的时候直接调用logger.info("这是一段 info 级别的日志");logger.error("这里一段 error 级别的日志");}
}
1.4.4、配置文件详解
示例
log4j.rootLogger=INFO,A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionParttern=%-4r %-5p [%t] %37c %3x - %m%n
1)配置根目录的语法
log4j.rootLogger=[ level ] , appenderName , appenderName ...
其中,level 是优先级,分为 OFF、FATTAL、ERROR、WARN、INFO 、DEBUG、ALL 或者自定义方级别。Log4j 建议只使用四个级别,优先级从高到低地刺是 ERROR、WARN、INFO 、DEBUG。如果在配置文件指定了 INFO 级别,那么所有 DEBUG 的信息将不被打印出来。
appenderName 就是指定日志信息输出到哪个地方,这个名字是我们自己起的。
2)配置日志信息输出源 Appender
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.optionl = value1
...
log4j.appender.appenderName.option = valueN
其中,Log4j 提供方 appender 有以下几种:
- org.apache.log4j.ConsoleAppender(控制台)
- org.apache.log4j.FileAppender(文件)
- org.apache.log4j.DailyRollingFileAppender(每天产生一个新的文件,比如 hive.log)
- org.apache.log4j.RollingFileAppender(文件大小达到指定大小就产生一个新的文件)
- org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
当然也可以是我们自定义的 appender ,比如我的下一篇文章中使用的 com.lyh.util.MyAppender。
不同的 appender 有不同的配置选项:
(1)ConsoleAppender 选项
- Threshold=WARN (指定日志消息的输出最低层次)
- ImmediateFlush=true (默认为true,意味着所有的消息被立即输出)
- Target=System.err (默认下为 System.out,指定输出控制台)
(2)FileAppender 选项
- Threshold=WARN (指定日志消息的输出最低层次)
- ImmediateFlush=true (默认为true,意味着所有的消息被立即输出)
- File=mylog.txt (指定消息输出到 mylog.txt)
- Append=false (默认是true,即将消息追加到指定文件,false指将消息覆盖指定的文件内容)
- DataPattern='.'yyyy-ww (每周滚动一次文件,即每周产生一个新的文件)
也可以设置为每月、周、天、时和分:
- '.'yyyy-MM (每月)
- '.'yyyy-ww (每周)
- '.'yyyy-MM-dd (每天)
- '.'yyyy-MM-dd-a (每天两次)
- '.'yyyy-MM-dd-HH (每小时)
- '.'yyyy-MM-dd-HH-mm (每分钟)
(4)RollingFileAppender 选项
- Threshold=WARN (指定日志消息的输出最低层次)
- ImmediateFlush=true (默认为true,意味着所有的消息被立即输出)
- File=mylog.txt (指定消息输出到 mylog.txt)
- Append=false (默认是true,即将消息追加到指定文件,false指将消息覆盖指定的文件内容)
- MaxFileSize=100KB(后缀可以是 KB,MB 或者 GB,当日志大小达到该大小时,会自动滚动,将原来的内容移动到 mylog.1 文件)
- MaxBackupIndex=2 (指定可以产生的滚动文件的最大数)
3)配置日志信息的布局
- org.apache.log4j.HTMLLayout (以 HTML 表格形式布局 )
- org.apache.log4j.PartternLayout(可以灵活地指定布局模式)
- org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
- org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等信息)
了解即可
4)输出格式设置
在配置文件中通过 log4j.appender.A1.layout.ConversionPattern 设置日志输出格式。
参数:
- %p:输出日志信心优先级,也就是 DEBUG,IOFO,WARN,ERROR,FATAL
- %d:输出日志的时间或日期,默认格式为 ISO8601 ,也可以指定格式,比如 %d{yyyy MM dd HH:mm:ss,SSS} ,输出 2024年01月29日19:20:15,200
- %r:输出自应用启动到输出该 log 信息消耗的毫秒数
- %c:输出日志信息所属类目,通常就是所在类的全名
- %t:输出产生该日志事件的线程名
- %l:输出日志事件的发生位置,相当于 %C.%M(%F:%L) 的组合,包括类目名、发生的线程,已经在代码中的行数。比如 Test.main(Test.java:10)
- %x:输出和当前线程相关联的 NDC(嵌套诊断环境),尤其用到像 Java servlets 这样的多客户线程的应用中。
- %%:输出 %
- %F:输出日志消息产生时所在的文件名称
- %L:输出代码中的行符
- %m:输出代码中指定的消息,产生的日志具体信息
- %n:输出一个回车换行符,windows平台为 "\r\n",unix平台为 "\n"
2、Log4j2
总结
相关文章:
Log4j Log4j2
前言 今天抽时间来把这个日志框架学学,毕竟经常用,虽然不用自己写,但是书到用时方恨少,技多不压身。而且最近我的 GUI 软件中有一个关于日志问题的希望学完能够感觉解决掉。 Log4j & Log4j2 Log4j2 是 Log4j 的升级版&#x…...
C语言——如何进行文件操作
大家好,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流 本文由:残念ing原创CSDN首发,如需要转载请通知 个人主页:残念ing-CSDN博客,欢迎各位→…...
python中for循环的几个现象
1. 运行如下代码 l [{}, {}, {}] for k in l:k[1] 1 print(l) 输出为 [{1: 1}, {1: 1}, {1: 1}]2. 运行如下代码 l [{}, {}, {}] for k in l:k {1:1} print(l) 输出为 [{}, {}, {}] 3. 运行如下代码 l [1,2,3] for k in l:k k * 2 print(l)输出为 [1, 2, 3…...
openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板
文章目录 openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板概述笔记工程中需要的openssl的库实现补充 - 最终的模板工程END openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板 概述 openssl3.2 - 测试程序的学习 整了几个test.c, 每开一个新的测试工…...
Delphi.cz采访Embarcadero捷克共和国办事处经理:理查德·库巴特 - 第一部分
Embarcadero捷克办事处主任理查德库巴特(Richard Kubt,55 岁)接受了我的采访。 Radek Červinka (RČ):库巴特先生您好,感谢您抽出时间访问 delphi.cz。 一开始:我在某处听说您是一名程序员,从…...
AI投资或成科技裁员罪魁祸首
最近的科技裁员让许多人对这个行业的稳定性产生了疑问。然而,仔细观察发现,这些裁员并不是经济困境的迹象,而是科技公司为了重新调整优先事项并投资未来而进行的战略举措。科技行业正投入数十亿美元用于人工智能(AI)&a…...
解读BEVFormer,新一代自动驾驶视觉工作的基石
文章出处 BEVFormer这篇文章很有划时代的意义,改变了许多视觉领域工作的pipeline[2203.17270] BEVFormer: Learning Birds-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers (arxiv.org)https://arxiv.org/abs/2203.17270 BEV …...
【React教程】(1) React简介、React核心概念、React初始化
目录 ReactReact 介绍React 特点React 的发展历史React 与 Vue 的对比技术层面开发团队社区Native APP 开发 相关资源链接 EcmaScript 6 补充React 核心概念组件化虚拟 DOM 起步初始化及安装依赖Hello World React React 介绍 React 是一个用于构建用户界面的渐进式 JavaScrip…...
云计算中的弹性是什么?
云弹性是指当客户需求增加或减少时,自动从数据中心配置和取消配置资源。这使得云资源(包括计算、存储和内存资源)能够根据需求变化快速重新分配。CPU/处理、内存、输入/输出带宽和存储容量等计算资源可以根据需要增加或减少,而不会影响系统性能。 它旨在…...
Vue3基础:pnpm是什么?npm和pnpm的区别?如何使用pnpm?
pnpm 是一个流行的 JavaScript 包管理器,类似于 npm 和 yarn。它是 performant npm 的缩写,意在表明它是一个更高效的 npm 替代品。pnpm 的主要特点和优势包括: 高效的存储空间使用 pnpm 使用称为“内容寻址存储”的机制来存储 npm 包。这意…...
vue中父组件直接调用子组件方法(通过ref)
目录 1、vue2 中,父组件调用子组件的方法 2、vue3 中,父组件调用子组件的方法 1、vue2 中,父组件调用子组件的方法 在Vue 2中,父组件可以通过使用ref属性来引用子组件的实例,然后通过该实例调用子组件的方法。 首先…...
Gunicorn性能优化:提升Python Web应用的服务效率
在Python Web开发中,Gunicorn作为WSGI HTTP服务器,常常作为Web应用(如Django或Flask)与反向代理或负载均衡器之间的桥梁。为了充分发挥其性能,本文将提供一些实用的Gunicorn配置建议。 Gunicorn架构 Gunicorn采用了预…...
如何使用ssh key免密码登录服务器?
以下是使用密钥对免密码登录服务器的具体指令操作步骤: 步骤一:生成密钥对 在本地电脑上打开终端或命令提示符,运行以下命令生成密钥对: ssh-keygen -t rsa -C "your_emailexample.com" 该命令会提示您选择保存密钥…...
macos Android平台签名证书(.keystore)
一、申请appid的使用说明(有appid的请忽略申请appid) 创建应用 申请的appid在源码视图填写后会自动生成一个对应的包名 ⚠️注意:申请appid的时候应用名称和项目名称保持一致。 二、 Android如何使用自用证书进行打包 1.找到安装jdk的路径…...
Kotlin快速入门系列2
Kotlin的基本数据类型 Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。不同于 Java 的是,字符不属于数值类型,是一个独立的数据类型。 Java和kotlin数据类型对照如下: Java基本数据类型 Kotlin对象数据类型 数据类…...
单片机之keil软件环境搭建
简介 Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。 目前软件对中文的支持不友好,不建议安装网上的一些汉化包…...
数学公式OCR识别php 对接mathpix api 使用公式编译器
数学公式OCR识别php 对接mathpix api 一、注册账号官网网址:https://mathpix.com 二、该产品支持多端使用注意说明(每月10次) 三、api 对接第一步创建create keyphp对接api这里先封装两个请求函数,get 和post ,通过官方…...
MySQL原理(二)存储引擎(1)概述
一、存储引擎介绍 1、概念: (1)MySQL中的数据用各种不下同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎…...
微信小程序canvas画布如何解决在for循环绘制图像显示不全的问题
如下所示,在for循环中绘制图像,由于onload函数加载图像是异步执行,会导致显示不全所有图片的问题。 for(var a0;a<2;a){ var img canvas.createImage()img.src product_image[items[a]]img.onload ()>{ctx.drawImage(el,0,h,i…...
Python计算机二级/Python期末考试 刷题(一)
收集了一些经典Python计算机二级和Python期末考试题库 整理不易,大家点赞收藏支持一下 祝大家计算机二级和期末考试都高分过 目录 一、填空 二、选择 三、程序设计 一、填空 1.序列元素的编号称为索引,索引值从【1】开始,访问序列元素时将…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
