log4j日志框架的使用

依赖

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

配置项样列

log4j.rootLogger=DEBUG, stdout, logfilelog4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%nlog4j.appender.logfile=org.apache.log4j.RollingFileAppender
log4j.appender.logfile.File=./log4j/test.log
log4j.appender.logfile.MaxFileSize=512KB
log4j.appender.logfile.MaxBackupIndex=5
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

配置文件详解

log4j的配置文件可以理解成有2部分 1根日志记录器  2 各appender(输出源)配置

①配置根Logger,其语法为: 
log4j.rootLogger = [level],appenderName,appenderName2,... 
level是日志记录的优先级,分为OFF,TRACE,DEBUG,INFO,WARN,ERROR,FATAL,ALL 
Log4j建议只使用四个级别,优先级从低到高分别是DEBUG,INFO,WARN,ERROR 
通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关 
比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来 
appenderName就是指定日志信息输出到哪个地方。可同时指定多个输出目的 ②配置日志信息输出目的地Appender,其语法为: log4j.appender.appenderName = fully.qualified.name.of.appender.class 
log4j.appender.appenderName.optionN = valueN Log4j提供的appender有以下几种: 
1)org.apache.log4j.ConsoleAppender(输出到控制台) 
2)org.apache.log4j.FileAppender(输出到文件) 
3)org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件) 
4)org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) 
5)org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) 1)ConsoleAppender选项属性 -Threshold = DEBUG:指定日志消息的输出最低层次 -ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出 -Target = System.err:默认值System.out,输出到控制台(err为红色,out为黑色) 2)FileAppender选项属性 -Threshold = INFO:指定日志消息的输出最低层次 -ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出 -File = C:\log4j.log:指定消息输出到C:\log4j.log文件 -Append = FALSE:默认值true,将消息追加到指定文件中,false指将消息覆盖指定的文件内容 -Encoding = UTF-8:可以指定文件编码格式 3)DailyRollingFileAppender选项属性 -Threshold = WARN:指定日志消息的输出最低层次 -ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出 -File = C:\log4j.log:指定消息输出到C:\log4j.log文件 -Append = FALSE:默认值true,将消息追加到指定文件中,false指将消息覆盖指定的文件内容 -DatePattern='.'yyyy-ww:每周滚动一次文件,即每周产生一个新的文件。还可以按用以下参数: '.'yyyy-MM:每月 '.'yyyy-ww:每周 '.'yyyy-MM-dd:每天 '.'yyyy-MM-dd-a:每天两次 '.'yyyy-MM-dd-HH:每小时 '.'yyyy-MM-dd-HH-mm:每分钟 -Encoding = UTF-8:可以指定文件编码格式 4)RollingFileAppender选项属性 -Threshold = ERROR:指定日志消息的输出最低层次 -ImmediateFlush = TRUE:默认值是true,所有的消息都会被立即输出 -File = C:/log4j.log (指定消息输出到C:/log4j.log文件,一般在实际项目中使用相对路径较多./log4j/test.log) -Append = FALSE:默认值true,将消息追加到指定文件中,false指将消息覆盖指定的文件内容 -MaxFileSize = 100KB:后缀可以是KB,MB,GB.在日志文件到达该大小时,将会自动滚动.如:log4j.log.1 -MaxBackupIndex = 2:指定可以产生的滚动文件的最大数 -Encoding = UTF-8:可以指定文件编码格式 ③配置日志信息的格式(布局),其语法为: log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 
log4j.appender.appenderName.layout.optionN = valueN Log4j提供的layout有以下几种: 
5)org.apache.log4j.HTMLLayout(以HTML表格形式布局) 
6)org.apache.log4j.PatternLayout(可以灵活地指定布局模式) 
7)org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串) 
8)org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) 
9)org.apache.log4j.xml.XMLLayout(以XML形式布局) 5)HTMLLayout选项属性 -LocationInfo = TRUE:默认值false,输出java文件名称和行号 -Title=Struts Log Message:默认值 Log4J Log Messages 6)PatternLayout选项属性 -ConversionPattern = %m%n:格式化指定的消息(参数意思下面有) 9)XMLLayout选项属性 -LocationInfo = TRUE:默认值false,输出java文件名称和行号 Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: %m 输出代码中指定的消息 %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL %r 输出自应用启动到输出该log信息耗费的毫秒数 %c 输出所属的类目,通常就是所在类的全名 %t 输出产生该日志事件的线程名 %n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n” %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式 如:%d{yyyy年MM月dd日 HH:mm:ss,SSS},输出类似:2012年01月05日 22:10:28,921 %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数 如:Testlog.main(TestLog.java:10) %F 输出日志消息产生时所在的文件名称 %L 输出代码中的行号 %x 输出和当前线程相关联的NDC(嵌套诊断环境),像java servlets多客户多线程的应用中 %% 输出一个"%"字符 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如: %5c: 输出category名称,最小宽度是5,category<5,默认的情况下右对齐 %-5c:输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格 %.5c:输出category名称,最大宽度是5,category>5,就会将左边多出的字符截掉,<5不会有空格 %20.30c:category名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉 ④指定特定包的输出特定的级别 
log4j.logger.org.springframework=DEBUG OFF,systemOut,logFile,logDailyFile,logRollingFile,logMail,logDB,ALL 
log4j.rootLogger =ALL,systemOut,logFile,logDailyFile,logRollingFile,logMail,logDB 输出到控制台 
log4j.appender.systemOut = org.apache.log4j.ConsoleAppender 
log4j.appender.systemOut.layout = org.apache.log4j.PatternLayout 
log4j.appender.systemOut.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n 
log4j.appender.systemOut.Threshold = DEBUG 
log4j.appender.systemOut.ImmediateFlush = TRUE 
log4j.appender.systemOut.Target = System.out 输出到文件 
log4j.appender.logFile = org.apache.log4j.FileAppender 
log4j.appender.logFile.layout = org.apache.log4j.PatternLayout 
log4j.appender.logFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n 
log4j.appender.logFile.Threshold = DEBUG 
log4j.appender.logFile.ImmediateFlush = TRUE 
log4j.appender.logFile.Append = TRUE 
log4j.appender.logFile.File = ../Struts2/WebRoot/log/File/log4j_Struts.log 
log4j.appender.logFile.Encoding = UTF-8 按DatePattern输出到文件 
log4j.appender.logDailyFile = org.apache.log4j.DailyRollingFileAppender 
log4j.appender.logDailyFile.layout = org.apache.log4j.PatternLayout 
log4j.appender.logDailyFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n 
log4j.appender.logDailyFile.Threshold = DEBUG 
log4j.appender.logDailyFile.ImmediateFlush = TRUE 
log4j.appender.logDailyFile.Append = TRUE 
log4j.appender.logDailyFile.File = ../Struts2/WebRoot/log/DailyFile/log4j_Struts 
log4j.appender.logDailyFile.DatePattern = '.'yyyy-MM-dd-HH-mm'.log' 
log4j.appender.logDailyFile.Encoding = UTF-8 设定文件大小输出到文件 
log4j.appender.logRollingFile = org.apache.log4j.RollingFileAppender 
log4j.appender.logRollingFile.layout = org.apache.log4j.PatternLayout 
log4j.appender.logRollingFile.layout.ConversionPattern = [%-5p][%-22d{yyyy/MM/dd HH:mm:ssS}][%l]%n%m%n 
log4j.appender.logRollingFile.Threshold = DEBUG 
log4j.appender.logRollingFile.ImmediateFlush = TRUE 
log4j.appender.logRollingFile.Append = TRUE 
log4j.appender.logRollingFile.File = ../Struts2/WebRoot/log/RollingFile/log4j_Struts.log 
log4j.appender.logRollingFile.MaxFileSize = 1MB 
log4j.appender.logRollingFile.MaxBackupIndex = 10 
log4j.appender.logRollingFile.Encoding = UTF-8 用Email发送日志 
log4j.appender.logMail = org.apache.log4j.net.SMTPAppender 
log4j.appender.logMail.layout = org.apache.log4j.HTMLLayout 
log4j.appender.logMail.layout.LocationInfo = TRUE 
log4j.appender.logMail.layout.Title = Struts2 Mail LogFile 
log4j.appender.logMail.Threshold = DEBUG 
log4j.appender.logMail.SMTPDebug = FALSE 
log4j.appender.logMail.SMTPHost = SMTP.163.com 
log4j.appender.logMail.From = xly3000@163.com 
log4j.appender.logMail.To = xly3000@gmail.com 
log4j.appender.logMail.Cc = xly3000@gmail.com 
log4j.appender.logMail.Bcc = xly3000@gmail.com 
log4j.appender.logMail.SMTPUsername = xly3000 
log4j.appender.logMail.SMTPPassword = 1234567 
log4j.appender.logMail.Subject = Log4j Log Messages 
log4j.appender.logMail.BufferSize = 1024 
log4j.appender.logMail.SMTPAuth = TRUE 将日志登录到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://yourdbIp:3306/yourdataBaseName 
log4j.appender.logDB.User = xxxxx 
log4j.appender.logDB.Password = xxxx 
log4j.appender.logDB.Sql = INSERT INTOT_log4j(project_name,create_date,level,category,file_name,thread_name,line,all_category,message)values('Struts2','%d{yyyy-MM-ddHH:mm:ss}','%p','%c','%F','%t','%L','%l','%m')

源码浅析

入口

Logger logger = Logger.getLogger(Log4jParseDemo1.class);

loggerManager的静态代码块

static {// By default we use a DefaultRepositorySelector which always returns 'h'.Hierarchy h = new Hierarchy(new RootLogger((Level) Level.DEBUG));repositorySelector = new DefaultRepositorySelector(h);/** Search for the properties file log4j.properties in the CLASSPATH.  */String override =OptionConverter.getSystemProperty(DEFAULT_INIT_OVERRIDE_KEY,null);// if there is no default init override, then get the resource// specified by the user or the default config file.if(override == null || "false".equalsIgnoreCase(override)) {String configurationOptionStr = OptionConverter.getSystemProperty(DEFAULT_CONFIGURATION_KEY, null);String configuratorClassName = OptionConverter.getSystemProperty(CONFIGURATOR_CLASS_KEY, null);URL url = null;// if the user has not specified the log4j.configuration// property, we search first for the file "log4j.xml" and then// "log4j.properties"if(configurationOptionStr == null) {	url = Loader.getResource(DEFAULT_XML_CONFIGURATION_FILE);if(url == null) {url = Loader.getResource(DEFAULT_CONFIGURATION_FILE);}} else {try {url = new URL(configurationOptionStr);} catch (MalformedURLException ex) {// so, resource is not a URL:// attempt to get the resource from the class pathurl = Loader.getResource(configurationOptionStr); }	}// If we have a non-null url, then delegate the rest of the// configuration to the OptionConverter.selectAndConfigure// method.if(url != null) {LogLog.debug("Using URL ["+url+"] for automatic log4j configuration.");try {OptionConverter.selectAndConfigure(url, configuratorClassName,LogManager.getLoggerRepository());} catch (NoClassDefFoundError e) {LogLog.warn("Error during default initialization", e);}} else {LogLog.debug("Could not find resource: ["+configurationOptionStr+"].");}} else {LogLog.debug("Default initialization of overridden by " + DEFAULT_INIT_OVERRIDE_KEY + "property."); }  } 

在loggerManager的静态代码块中,完成对配置文件的读取和解析

OptionConverter.selectAndConfigure(url, configuratorClassName,LogManager.getLoggerRepository());

然后组装成框架的Logger对象、appender对象完成初始化操作

当调用logger.info打印日志时,和logback的流程基本一样,也是先组装成一个LoggingEvent对象,然后一次遍历logger对象的Appender列表(无appender列表的继承子父对象)完成日志输出

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

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

相关文章

查看Linux的Ubuntu的版本

我的Ubuntu版本是 Jammy x86_64&#xff0c;即 Ubuntu 22.04.3 LTS&#xff0c;代号为"Jammy Jellyfish"&#xff0c;架构是 x86_64&#xff08;64位&#xff09;。

Java的List中的各种浅拷贝和深拷贝问题

先来看一组代码 public class Temp{public static void main(String[] args) {List<Integer> list new ArrayList<>();list.add(1);list.add(2);list.add(3);List<Integer> temp list;list.add(4);System.out.println(list.toString());System.out.print…

NLP自然语言处理学习笔记

参考&#xff1a;NLP&#xff08;自然语言处理&#xff09;介绍 - 知乎 (zhihu.com) 一、NLP是什么 自然语言处理( Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自…

最新版本——Hadoop3.3.6单机版完全部署指南

大家好&#xff0c;我是独孤风&#xff0c;大数据流动的作者。 本文基于最新的 Hadoop 3.3.6 的版本编写&#xff0c;带大家通过单机版充分了解 Apache Hadoop 的使用。本文更强调实践&#xff0c;实践是大数据学习的重要环节&#xff0c;也能在实践中对该技术有更深的理解&…

105.长度最小的子数组(力扣)|滑动窗口

代码演示 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {int result INT_MAX; // 用于存储最小子数组的长度int sum 0; // 滑动窗口的长度int i 0; // 滑动窗口的起始位置int sumlength 0; // 当前子数…

SQL 中连接类型大全

前言&#xff08;Preface&#xff09; 结构化查询语言(SQL)是一种用于管理和分析存储在关系数据库中的数据的强大工具。SQL 中的一个基本概念是连接操作&#xff0c;它允许您基于匹配列组合两个或多个表的数据。掌握连接对于高效和准确的数据检索至关重要。 在本文中&#xff0…

行锁、间隙锁、临键锁的区别是什么?

在数据库领域&#xff0c;行锁、间隙锁&#xff08;Gap Lock&#xff09;、临键锁&#xff08;Next-Key Lock&#xff09;是与事务隔离级别和并发控制相关的概念。这些锁的区别主要涉及到在事务并发的情况下如何保证数据的一致性和避免不同事务之间的冲突。 1. 行锁&#xff0…

深度学习与逻辑回归模型的融合--TensorFlow多元分类的高级应用

手写数字识别 文章目录 手写数字识别1、线性回归VS逻辑回归Sigmoid函数 2、逻辑回归的基本模型-神经网络模型3、多元分类基本模型4、TensorFlow实战解决手写数字识别问题准备数据集数据集划分 特征数据归一化归一化方法归一化场景 标签数据独热编码One-Hot编码构建模型损失函数…

探索人工智能领域——每日20个名词详解【day11】

目录 前言 正文 总结 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于CSDN&#x1f4da;。 &#x1f4e3;如需转载&#xff0c;请事先与我联系以…

uni-app 微信小程序之好看的ui登录页面(四)

文章目录 1. 页面效果2. 页面样式代码 更多登录ui页面 uni-app 微信小程序之好看的ui登录页面&#xff08;一&#xff09; uni-app 微信小程序之好看的ui登录页面&#xff08;二&#xff09; uni-app 微信小程序之好看的ui登录页面&#xff08;三&#xff09; uni-app 微信小程…

Android通信安全之HTTPS

Android通信安全之HTTPS 目录 Android通信安全之HTTPS Https 起因 问题描述 自定义X509TrustManager 自定义HostnameVerifier 修复方案 解决方案一 解决方案2 本文章向大家介绍Android通信安全之HTTPS&#xff0c;主要内容包括Https、起因、问题描述、自定义Hostname…

Android--Jetpack--LiveData源码分析

时人不识凌云木&#xff0c;直待凌云始道高 一&#xff0c;基本使用 基本使用请看文章Android--Jetpack--LiveData-CSDN博客 二&#xff0c;MutableLiveData 首先说一下我们为什么要用MutableLiveData呢&#xff0c;来看看LiveData的源码&#xff1a; public abstract class…

[足式机器人]Part2 Dr. CAN学习笔记-数学基础Ch0-7欧拉公式的证明

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-数学基础Ch0-7欧拉公式的证明 e i θ cos ⁡ θ sin ⁡ θ i , i − 1 e^{i\theta}\cos \theta \sin \theta i,i\sqrt{-1} eiθcosθsinθi,i−1 ​ 证明&#xff1a; f ( θ ) e i θ cos …

论文阅读:LSeg: LANGUAGE-DRIVEN SEMANTIC SEGMENTATION

可以直接bryanyzhu的讲解&#xff1a;CLIP 改进工作串讲&#xff08;上&#xff09;【论文精读42】_哔哩哔哩_bilibili 这里是详细的翻译工作 原文链接 https://arxiv.org/pdf/2201.03546.pdf ICLR 2022 0、ABSTRACT 我们提出了一种新的语言驱动的语义图像分割模型LSeg。…

【webpack】应用篇

基础应用 代码分离常用的代码分离方法方法一&#xff1a;配置入口节点方法二&#xff1a;防止重复方法三&#xff1a;动态导入 缓存原因解决思路 缓存第三方库原因解决思路 将所有js文件单独存放文件夹拆分开发环境和生产环境配置公共路径环境变量和区分环境代码压缩 拆分配置文…

【Python】np.save()和np.load()函数详解和示例

本文通过函数原理和运行示例&#xff0c;对np.save()和np.load()函数进行详解&#xff0c;以帮助大家理解和使用。 更多Numpy函数详解和示例&#xff0c;可参考 【Python】Numpy库近50个常用函数详解和示例&#xff0c;可作为工具手册使用 目录 np.save &#xff08;&#xff…

云架构的思考3--云上开发

目录 1 DevOps--简单灵活性高2 服务化&#xff08;微服务&#xff09;--弹性&#xff08;可扩展&#xff09;、按需自主服务3 无状态&#xff08;Serverless&#xff09;--弹性&#xff08;可扩展&#xff09;4 日志--安全5 配置中心--安全6 设计模式6.1 使用“适配器模式”调用…

Go--协程

协程 协程是Go语言最大的特色之一。 1、协程的概念 协程并不是Go发明的概念&#xff0c;支持协程的变成语言有很多。Go在语言层面直接提供对协程的支持称为goroutine。 1.1 基本概念 进程 进程是应用程序启动的实例&#xff0c;每个进程都有独立的内存空间&#xff0c;不同…

nodejs微信小程序+python+PHP的智能停车系统-计算机毕业设计推荐django

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

Glide系列-活动缓存和内存缓存

1.活动缓存数据结构用的HashMap final class ActiveResources {VisibleForTesting final Map<Key, ResourceWeakReference> activeEngineResources new HashMap<>(); } 2.内存缓存LinkedHashMap public class LruCache<T, Y> {private final…