一、前言
日志记录是应用程序运行中必不可少的一部分。具有良好格式和完备信息的日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源。记录日志只是有效地利用日志的第一步,更重要的是如何对程序运行时产生的日志进行处理和分析。
一般来说日志分为两种:业务日志和异常日志。使用日志我们希望能达到以下目标:
- 对程序运行情况的记录和监控;
- 在必要时可详细了解程序内部的运行状态;
- 对系统性能的影响尽量小。
二、日志基础
1、日志组件
Java日志API由以下三个核心组件组成:
- Loggers:负责捕捉事件并将其发送给合适的Appender。
- Appenders:也称为Handlers,它负责接收日志事件,使用Layout格式化,然后输出到指定位置。
- Layouts:也被称为Formatters,它负责对日志事件中的数据进行转换和格式化。
2、日志框架
在Java中,输出日志需要使用一个或者多个日志框架,这些框架提供了必要的对象、方法和配置来传输消息。Java在java.util.logging包中提供了一个默认的框架。除此之外,还有很多其它第三方框架,包括Log4j、Logback以及tinylog。还有其它一些开发包,例如SLF4J和Apache Commons Logging,它们提供了一些抽象层,对你的代码和日志框架进行解耦,从而允许你在不同的日志框架中进行切换。
- [x] Java Logging API (Oracle) Java默认的日志框架
- [x] Log4j (Apache) 开源日志框架
- [x] Logback (Logback Project) 开源项目,被设计成Log4j版本1的后续版本
- [x] tinylog (tinylog) 轻量级开源logger
3、日志抽象层
诸如SLF4J这样的抽象层,会将你的应用程序从日志框架中解耦。应用程序可以在运行时选择绑定到一个特定的日志框架(例如java.util.logging、Log4j或者Logback),这通过在应用程序的类路径中添加对应的日志框架来实现。
如果在类路径中配置的日志框架不可用,抽象层就会立刻取消调用日志的相应逻辑。抽象层可以让我们更加容易地改变项目现有的日志框架,或者集成那些使用了不同日志框架的项目。
4、日志配置
尽管所有的Java日志框架都可以通过代码进行配置,但是大部分配置还是通过外部配置文件完成的。这些文件决定了日志消息在何时通过什么方式进行处理,日志框架可以在运行时加载这些文件。
4.1、配置实例
Log4j支持两种配置文件格式,一种是XML格式的文件,一种是properties格式的文件。比较常用的是properties文件。
- properties格式
# ====================================================================== #
# 配置根 logger (日志级别, 输出位置)
log4j.rootLogger=debug, fileR, Console
# ====================================================================== #
# 特殊类的控制
#log4j.logger.org.apache=INFO
#log4j.logger.java.sql.ResultSet=INFO
#log4j.logger.java.sql.Connection=DEBUG
#log4j.logger.java.sql.Statement=DEBUG
#log4j.logger.java.sql.PreparedStatement=DEBUG
# ====================================================================== #
# 控制台输出 Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=${log4j.log.layout}
log4j.appender.Console.layout.ConversionPattern=${log4j.log.layout.pattern}
# ====================================================================== #
# 文件输出 file (${catalina.home}/logs/info.log)
log4j.appender.fileR=org.apache