# log4j日志框架分析及使用教程 **Repository Path**: javanoteany/log4j ## Basic Information - **Project Name**: log4j日志框架分析及使用教程 - **Description**: log4j是什么?为什么需要日志?日志给谁用?日志什么时候用?日志什么时候该记录?日志有几个等级?使用日志该注意什么?log4j日志该如何配置使用? - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-12-02 - **Last Updated**: 2023-12-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, log4j ## README # log4j日志框架分析及使用教程 ***日志很重要!!!*** ### log4j是什么? ​ log4j是Apache下的一款开源的日志框架,能够满足我们在项目中对于日志记录的需求。log4j提供了简单的API调用,强大的日志格式定义以及灵活的扩展性。使用者可以自己定义Appender来满足对于日志输出的需求。在系统中对于记录日志的需求并不单纯。 ​ 首先,希望日志能持久化到磁盘,最基本的就是能够保存到文件中; ​ 其次,希望在开发和生产环境中记录的日志并不相同,明显开发环境的日志记录会更多方便调试,但放到生产环境下大量的日志很容易会撑爆服务器,因此在生产环境希望只记录重要信息。 ​ 基于不同的目的,System.out.println不能直接满足使用者的需求,因此应该选择功能更强的日志框架。而log4j是apache下一款著名的开源日志框架。 ### 为什么需要日志? ​ ①异常的场景 ​ 产品开发、系统运维(升级、日常管理等) ​ ②时间成本 ​ 快速、高效 ​ ③人力成本 ​ 简化、降低难度 ### 日志给谁用? ![输入图片说明](https://images.gitee.com/uploads/images/2021/1202/233055_9db49442_9956838.png "屏幕截图.png") ### 日志什么时候用? ​ 日志作为一种调试利器,可以帮助我们观察软件运行时内部结构和状态,辅助开发。日志文件分析已成为大型软件项目中代码调试的主要手段 ​ ①软件测试时 ​ 软件测试过程中,通过Debug或Trace信息,可以确认功能的实现原理及正确性。 ​ ②软件运维时 ​ 已发布运行的软件,当某个功能出现异常时,我们无法像开发环境一样进行调试找原因,能留给我们的就只有日志系统。如网管的配置下载问题。 ​ ③学习软件时 熟悉一个陌生软件系统时,日志能够提供很多线索给我们去了解软件的架构和实现逻辑。 ### 日志什么时候该记录? ​ ①模块的启动与结束 ​ 需要对模块的启动和结束进行监控,从而知道模块是否正常加载或正常退出。比如网管ICE服务的OnClientInitMe等函数。 ​ ②用户登录及操作 ​ 需要记录用户何时登录、登出以及做了哪些操作,方便审计。比如网管的安全日志和操作日志。 ​ ③异常信息 ​ 所有捕获异常的位置均应当记录异常内容日志,所有与系统软件预期不符的地方都要记录日志。 ​ ④软件的关键方法 ​ 需要记录软件系统的一些关键性操作,它是衡量系统正常运行的重要指标。比如业务/配置增删改、激活、去激活等关键操作。 ### 日志有几个等级? ​ 日志等级:OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL。 ​ 通常以下几种:TRACE、DEBUG、INFO、WARN、ERROR ​ ①TRACE :细致入微,可以用于开发过程中追踪bug 。 ​ ②DEBUG:系统调试信息,通常用于开发过程中对系统运行情况的监控,在实际运行环境中不进行输出。 ​ ③INFO:系统运行的关键性信息,通常用于对系统运行情况的监控。 ​ ④WARN:告警信息,系统存在潜在的问题,有可能引起运行异常,但此时并未产生异常。 ​ ⑤ERROR:系统错误信息,需要进行及时处理和优化。 | 等级 | 目的 | 阶段 | 对象 | 程度 | |-------|----|-------|-------|-------| | ERROR | 告警 | 运行 | 用户 | 准确/严重 | | WARN | 提醒 | 运行/使用 | 用户 | 准确 | | INFO | 说明 | 使用 | 运维 | 简洁 | | DEBUG | 详解 | 开发调试 | 维护/开发 | 详细清楚 | | TRACE | 研究 | 调试/学习 | 开发/研发 | 细致入微 | ### 使用日志该注意什么? ​ ①粒度适中 ​ ②写有意义的log ​ ③不同场景选择正确的日志级别 ​ ④日志信息可理解性 ​ ⑤日志语言选择英文 ***\*日志细节决定系统成败!\**** ### log4j日志该如何配置使用? #### 配置 在项目资源配置文件夹新建 **log4j.properties** ``` ### 设置### log4j.rootLogger = debug,stdout,debugLog,infoLog,errorLog ### 输出信息到控制台 ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n ### 输出DEBUG 级别以上的日志 ### log4j.appender.debugLog = org.apache.log4j.DailyRollingFileAppender log4j.appender.debugLog.File =logs/debug/log.log log4j.appender.debugLog.DatePattern = '.'yyyy-MM-dd-HH-mm'.log' log4j.appender.debugLog.Append = true log4j.appender.debugLog.Threshold = DEBUG log4j.appender.debugLog.layout = org.apache.log4j.PatternLayout log4j.appender.debugLog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ### 输出INFO 级别以上的日志 ### log4j.appender.infoLog = org.apache.log4j.DailyRollingFileAppender log4j.appender.infoLog.File =logs/info/log.log log4j.appender.infoLog.DatePattern = '.'yyyy-MM-dd-HH-mm'.log' log4j.appender.infoLog.Append = true log4j.appender.infoLog.Threshold = INFO log4j.appender.infoLog.layout = org.apache.log4j.PatternLayout log4j.appender.infoLog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ### 输出ERROR 级别以上的日志 ### log4j.appender.errorLog = org.apache.log4j.DailyRollingFileAppender log4j.appender.errorLog.File =logs/error/log.log log4j.appender.errorLog.DatePattern = '.'yyyy-MM-dd-HH-mm'.log' log4j.appender.errorLog.Append = true log4j.appender.errorLog.Threshold = ERROR log4j.appender.errorLog.layout = org.apache.log4j.PatternLayout log4j.appender.errorLog.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ``` 注意:log4j.properties文件一定存放在**资源文件夹**中,否则项目无法识别调用 #### 设置输出内容 编写日志输出内容 ``` import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestLog4j { private static Logger logger = LoggerFactory.getLogger(TestLog4j.class); public static void main(String[] args) { System.out.println("This is println message."); // 记录debug级别的信息 logger.debug("This is debug message."); // 记录info级别的信息 logger.info("This is info message."); // 记录error级别的信息 logger.error("This is error message."); } } ``` #### 测试结果 **项目结构** ![输入图片说明](https://images.gitee.com/uploads/images/2021/1202/234201_c6fceab1_9956838.png "屏幕截图.png") **运行结果** 日志信息输出到控制台 ![输入图片说明](https://images.gitee.com/uploads/images/2021/1202/233915_32fa132e_9956838.png "屏幕截图.png") 日志信息保存到本地 ​ logs文件夹系统会自动生成,无需新建 ![输入图片说明](https://images.gitee.com/uploads/images/2021/1202/233926_41b19079_9956838.png "屏幕截图.png") debug ![输入图片说明](https://images.gitee.com/uploads/images/2021/1202/233933_22133ba2_9956838.png "屏幕截图.png") error ![输入图片说明](https://images.gitee.com/uploads/images/2021/1202/233940_1cce8060_9956838.png "屏幕截图.png") info ![输入图片说明](https://images.gitee.com/uploads/images/2021/1202/233948_de838991_9956838.png "屏幕截图.png")