本文纲要
- 日志技术与输出语句的区别
- 日志体系结构与
Log4j Log4j入门案例Log4j三大核心Logger记录器Appender输出源Layout布局- 配置文件详解
Log4j在项目中的应用
日志技术与输出语句的区别
在开发中,经常需要了解系统的运行情况。
以往我们通常在关键位置使用System.out.println()输出信息,但这种方式存在明显弊端:
- 不易关闭:如果不再需要查看信息,必须修改代码删除输出语句。
- 输出位置单一:信息只能展示在控制台,无法持久化到文件或数据库。
- 性能影响:输出语句与业务代码运行在同一线程,可能影响性能。
日志技术(Log)则能很好地解决这些问题。
它不仅可以记录程序运行时的关键信息,还具备以下优势:
| 对比维度 | System.out 输出 | 日志技术 |
|---|---|---|
| 是否需改代码 | 需要修改代码 | 只需修改配置文件 |
| 输出目的地 | 仅控制台 | 控制台、文件、数据库等 |
| 线程模型 | 与业务代码同一线程 | 多线程记录,减小性能影响 |
| 灵活控制 | 无级别概念 | 支持日志级别、格式、过滤 |
因此,现代Java开发中普遍采用日志框架替代直接输出。
日志体系结构与Log4j
Java日志体系包含两套主流接口和多种实现:
JCL (Jakarta Commons Logging):Apache 早期提供的日志接口,现更名为Commons Logging。SLF4J (Simple Logging Facade for Java):另一个流行的日志门面,提供了更简洁的 API,支持在运行时绑定具体的日志实现。
Log4j是 Apache 的一个开源日志实现,也是目前最常用的日志框架之一。
通过 Log4j 我们可以:
- 控制日志输出目的地(控制台、文件等)
- 控制每条日志的输出格式
- 定义日志级别,精细管理日志生成
- 全部通过配置文件灵活设置,无需修改代码
接下来的内容将以Log4j+SLF4J组合为例,展示如何在实际项目中使用日志。
Log4j入门案例
1 ) 开发流程
- 导入
Log4j相关的jar包 - 编写
Log4j配置文件(log4j.properties) - 在代码中获取日志对象
- 按照日志级别记录日志信息
2 ) 项目结构
log4j-demo ├── lib │ ├── log4j-1.2.17.jar │ ├── slf4j-api-1.7.30.jar │ └── slf4j-log4j12-1.7.26.jar ├── src │ ├── log4j.properties │ └── com/wb/demo1 │ └── Log4JTest01.java3 ) 配置文件
一个最简单的log4j.properties内容如下:
log4j.rootLogger=debug,my,fileAppender # 输出到控制台 ### log4j.appender.my=org.apache.log4j.ConsoleAppender log4j.appender.my.ImmediateFlush = true log4j.appender.my.Target=System.out log4j.appender.my.layout=org.apache.log4j.PatternLayout log4j.appender.my.layout.ConversionPattern=%d %t %5p %c{1}:%L - %m%n # 输出到文件 log4j.appender.fileAppender=org.apache.log4j.FileAppender log4j.appender.fileAppender.ImmediateFlush = true log4j.appender.fileAppender.Append=true log4j.appender.fileAppender.File=D:/log4j-log.log log4j.appender.fileAppender.layout=org.apache.log4j.PatternLayout log4j.appender.fileAppender.layout.ConversionPattern=%d %5p %c{1}:%L - %m%n4 ) 获取日志对象
推荐使用SLF4J的 API 获取日志对象,这样更换底层日志实现时无需修改业务代码。
packagecom.wb.demo1;importorg.slf4j.Logger;importorg.slf4j.LoggerFactory;publicclassLog4JTest01{//使用slf4j里面的api来获取日志的对象//好处:如果以后我们更换日志的实现类,那么下面的代码不需要跟着修改//推荐使用privatestaticfinalLoggerLOGGER=LoggerFactory.getLogger(Log4JTest01.class);publicstaticvoidmain(String[]args){//1.导入jar包//2.编写配置文件//3.在代码中获取日志的对象//4.按照日志级别设置日志信息LOGGER.debug("debug级别的日志");LOGGER.info("info级别的日志");LOGGER.warn("warn级别的日志");LOGGER.error("error级别的日志");}}注意:直接使用 Log4j 的Logger.getLogger()方法也能获取对象,但这样会与具体实现耦合,不便于未来切换框架,因此不推荐。
运行main方法后,控制台和D:/log4j-log.log文件中都会输出相应级别的日志。
如果将根日志级别改为 info,则debug日志不会被输出。
Log4j三大核心
Log4j 主要围绕三个核心组件工作:Logger(记录器)、Appender(输出源)、Layout(布局)。
1 ) Logger 记录器
Logger 负责捕获日志信息并决定哪些信息需要输出。
Log4j 定义了以下常用日志级别(从低到高):
| 级别 | 含义 |
|---|---|
DEBUG | 用于开发过程中的调试信息 |
INFO | 用于输出重要的运行信息 |
WARN | 可能出现问题,但不影响程序继续运行 |
ERROR | 发生错误,但程序仍可继续运行 |
FATAL | 严重错误,会导致程序停止 |
规则:只输出不低于设定级别的日志。例如配置级别为INFO,则DEBUG不会被输出;若配置为ALL,则所有级别全部输出;配置为OFF,则关闭所有日志。
2 ) Appender 输出源
Appender 指定日志的输出目的地。常用的有:
| Appender 类 | 作用 |
|---|---|
ConsoleAppender | 输出到控制台 |
FileAppender | 输出到文件 |
配置时需要为每个 Appender 指定一个名字,例如my,fileAppender,名字可以随意命名。
示例:
# 控制台输出,命名为 my log4j.appender.my=org.apache.log4j.ConsoleAppender log4j.appender.my.ImmediateFlush = true log4j.appender.my.Target=System.out # System.out(黑)或 System.err(红) # 文件输出,命名为 fileAppender log4j.appender.fileAppender=org.apache.log4j.FileAppender log4j.appender.fileAppender.Append=true # true:追加, false:覆盖 log4j.appender.fileAppender.File=D:/log4j-log.log4.3 Layout 布局
Layout 负责格式化日志输出内容。常用布局管理器:
| 布局类 | 特点 |
|---|---|
PatternLayout | 灵活定制输出格式(最常用) |
SimpleLayout | 仅包含日志级别和信息字符串 |
TTCCLayout | 包含时间、线程、类别等信息 |
PatternLayout通过ConversionPattern来定义格式,常用的占位符如下:
| 占位符 | 含义 |
|---|---|
%p | 日志级别 |
%d | 日期时间 |
%t | 线程名 |
%c{1} | 类名(可指定精度) |
%L | 行号 |
%m | 输出的日志信息 |
%n | 换行符 |
示例配置:
log4j.appender.my.layout=org.apache.log4j.PatternLayout log4j.appender.my.layout.ConversionPattern=%d %t %5p %c{1}:%L - %m%n配置文件详解
真实的log4j.properties通常包含三大部分:
第一部分:根 Logger 配置
log4j.rootLogger=debug,my,fileAppenderdebug:全局日志级别,可写为OFF,FATAL,ERROR,WARN,INFO,DEBUG,ALL。my,fileAppender:指定使用的 Appender 名称,多个用逗号分隔。
第二部分:Appender 配置
以my和fileAppender为例,定义其类型、刷新模式、目标位置等属性。
第三部分:Layout 配置
为每个Appender绑定具体的Layout及输出格式。
完整示例就是前面提供的log4j.properties,通过修改它就能灵活调整日志行为,无需改动代码。
Log4j在项目中的应用
在实际 Web 项目(如一个 NIO 服务器)中使用 Log4j,遵循以下四步即可:
1 ) 导入 jar 包
将log4j-1.2.17.jar,slf4j-api-1.7.30.jar,slf4j-log4j12-1.7.26.jar加入项目lib目录并添加为库。
2 ) 放置配置文件
将log4j.properties拷贝到src目录下(必须是该名称)
3 ) 获取Logger对象
在需要日志的类中,通过SLF4J获取:
privatestaticfinalLoggerlogger=LoggerFactory.getLogger(当前类.class);4 ) 记录日志
在关键业务逻辑处记录:
logger.info("已经处理了登录请求,准备给浏览器响应");运行时,控制台和指定文件会同时输出日志信息,形如:
2025-03-07 10:15:30,123 main INFO HttpServer:25 - 已经处理了登录请求,准备给浏览器响应这样我们就能够清晰追踪系统运行状况,并且可以根据环境灵活控制日志级别与输出位置。
总结
通过以上内容,我们了解了日志技术与传统输出的区别、Java日志体系结构、Log4j的核心组件以及实际项目中的应用方法。
掌握这些基础知识后,你就可以在项目中高效地运用日志技术,提升问题排查和系统监控的效率。