Apache Log4j入门指南:从零开始学习日志记录与配置技巧
日志记录。在 apache 网站 jakarta.apache.org/log4j 上,可以免费获取到 Log4j 最新版本的软件包。

一、入门实例
新建一个 maven 工程,接着导入 Log4j 包,在 pom 文件中,对应的配置代码如下:
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
<version>1.2.17version>
dependency>
<dependency>
<groupId>org.apache.logging.log4jgroupId>
<artifactId>log4j-coreartifactId>
<version>2.20.0version>
dependency>
在 resources 目录下创建一个名为 log4j.properties 的文件。
### 设置###
log4j.rootLogger = debug,stdout,D,E
### 输出信息到控制抬 ###
log4j.appender.stdout =Apache 的 log4j 中的 ConsoleAppender
log4j.appender.stdout.Target = System.out #设置输出目标,也可输出到标准错误 System.err中
log4j.appender.stdout.layout =Apache 的 log4j 中的 PatternLayout 。 它是 log4j 中的一个布局类。 用于定义日志消息的输出格式。 可以通过设置不同的模式字符串来定制输出的样式。 例如日期格式、日志级别等。 它在日志记录系统中起着重要的作用。 帮助开发者更好地理解和分析日志信息。
log4j 的 appender 名为 stdout 的 layout 中的 ConversionPattern= [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n
将 DEBUG 级别及以上的日志输出到=/home/duqi/logs/debug.log
log4j.appender.D =Apache 的 log4j 中的 DailyRollingFileAppender 。
log4j.appender.D.File = /home/duqi/logs/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j 的 appender 中的 D 的 layout 的 ConversionPattern= %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
将 ERROR 级别及更高级别的日志输出到 /home/admin/logs/error.log 。
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =/home/admin/logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j 的 appender.E 的 layout 的 ConversionPattern= %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
3、输出日志的例子如下
java:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Log4JTest {
private static final Logger logger = LoggerFactory.getLogger(Log4JTest.class);
public static void main(String[] args) {
// 记录debug级别的信息
logger.debug("This is debug message.");
// 记录info级别的信息
logger.info("This is info message.");
// 记录error级别的信息
logger.error("This is error message.");
}
}
4、输出结果
首先,控制台输入如下图所示:
接着,去查看位于/Users/duqi/logs 目录下的 debug.log 文件和 error.log 文件,它们的内容分别是这样的,可以知晓,:
debug.log
error.log
二、Log4J基本使用方法
Log4j 由三个重要组件构成。其一为日志信息的优先级,其从高到低有 ERROR、WARN、INFO、DEBUG,用于指定日志信息的重要程度;其二为日志信息的输出目的地,它指定了日志将打印到控制台还是文件中;其三为日志信息的输出格式,该格式控制着日志信息的显示内容。
2.1 定义配置文件
您实际上可以完全不借助配置文件,而是在代码里去配置 Log4j 环境。然而,使用配置文件会让您的应用程序更具灵活性。Log4j 能够支持两种配置文件格式,其中一种是 XML 格式的文件,另一种是 Java 特性文件(键=值)。接下来我们来介绍使用 Java 特性文件作为配置文件的方式:
配置根Logger,其语法为:
log4j.rootLogger = [ level ]有 appenderName,还有 appenderName,等等。
其中,level 用于日志记录的优先级划分,包含 OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL 以及您所定义的级别。Log4j 建议仅使用四个级别,其优先级从高到低依次为 ERROR、WARN、INFO、DEBUG。通过在此处定义的级别,您能够对应用程序中相应级别的日志信息进行开关控制。如果在这里定义了 INFO 级别,那么应用程序中所有 DEBUG 级别的日志信息都不会被打印出来。appenderName 指的是将日志信息输出到的地方。您能够同时指定多个输出目的地,就像上述例子中我们指定了 stdout、D 和 E 这三个地方。
配置文件的输出目的地为 Appender 。通常情况下,配置代码的格式是这样的。
og4j.appender.appenderName =完全的、合格的、追加器类的名称
log4j 的 appender 名为 appenderName 的其中一个 option1= value1
…
log4j 中的 appender 名为 appenderName 的选项= valueN
其中,Log4j提供的appender有以下几种:
配置日志信息的格式(布局),其语法为:
log4j 的 appender 名为 appenderName 的布局=布局类的完全合格名称
log4j 的 appender 名为 appenderName 的布局的 option1= value1
…
log4j 的 appender 名为 appenderName 的布局的选项= valueN
其中,Log4j提供的layout有以下几种:
Log4J 以类似 C 语言中 printf 函数的打印格式来对日志信息进行格式化,其打印参数情况如下:
2.2 在代码中使用Log4j
获取记录器
获取日志记录器是使用 Log4j 的第一步,这个记录器会负责对日志信息进行控制。其语法是:public static Logger getLogger( String name)。通过指定的名字来获得记录器,要是有必要的话,还会为这个名字创建一个新的记录器。Name 通常会选取本类的名字,例如:static Logger logger 等于 Logger.getLogger ( ServerWithLog4j 类的名字 )。
读取配置文件
获得日志记录器之后,第二步是配置 Log4j 环境,其语法是:
BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。
PropertyConfigurator 进行了配置。( String configFilename) :读取使用Java的特性文件编写的配置文件。
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。
插入记录信息(格式化日志信息)
当上两个必要步骤执行完毕后,您能够轻松地将具有不同优先级别的日志记录语句插入到您希望记录日志的任何位置,其语法情况如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
2.3 日志级别
每个 Logger 都被赋予了一个日志级别(log level),此日志级别用于控制日志信息的输出。日志级别按照从高到低的顺序分为:
A:off 最高等级,用于关闭所有日志记录。
B:fatal 意味着每一个严重的错误事件都将会致使应用程序停止运行并退出。
错误事件发生了,但系统仍可继续运行,这是 error 所指出的情况。
D:warm 表明会出现潜在的错误情形。
Info 通常处于粗粒度级别,着重于应用程序的整个运行过程。
Debug 通常是在细粒度的级别上被使用的,它对于调试应用程序有着很大的帮助。
G:all 最低等级,用于打开所有日志记录。
这些级别被定义在 org.apache.log4j.Level 类中。Log4j 仅建议使用 4 个级别,其优先级从高到低依次为 error、warn、info 和 debug。通过运用日志级别,能够控制应用程序中相应级别日志信息的输出。如果采用了 info 级别,那么在应用程序中,所有低于 info 级别的日志信息,像 debug 这类的,都不会被打印出来。
三、Spring中使用Log4J
通常是在 web.xml 配置文件里进行 Log4j 监听器以及 log4j.properties 文件的配置,具体代码如下:
<context-param>
<param-name>log4jConfigLocationparam-name>
<param-value>classpath 路径为 /config/log4j.propertiesparam-value>
context-param>
<context-param>
<param-name>log4jRefreshIntervalparam-name>
<param-value>60000param-value>
context-param>
<listener>
<listener-class>org.springframework.web.util 这个部分包含了 Log4jConfigListener ,Log4jConfigListener 是用于配置 Log4j 的监听器 。listener-class>
listener>
在之前的 Spring In Action 系列文章里,我一直是以 Java Config 文件作为例子来进行总结的,那么与之对应的 Log4J 的配置情况如下:
//todo
四、实战经验总结
在商业项目里,日志能够被用于数据化运营,并且需要将关键的业务数据记录下来;在开发过程中,一定要准确地记录业务日志,要是丢失了业务数据,那就是很严重的故障。
日志信息的打印会对服务的性能(包括吞吐量和响应时间)产生影响,这种影响在业务逻辑简单的服务中更为明显。例如,我近期负责的一个会话管理模块,在进行性能压测时发现 TPS 仅能达到 250 左右,为此我困扰了很久。首先需要找出性能的瓶颈所在,即缓存操作和数据库操作。
提交spark任务
--conf \spark 的驱动程序额外的 Java 选项=-Dlog4j.configuration=file:${ProjectPath}/log4j.properties\" \ #driver运行后加载的,日志级别
--conf spark 的 executor 所额外的 Java 选项=\"-Dlog4j.configuration=log4j_executor.properties\" " 运行 executor 后加载的日志级别,设置该级别后能够在 spark UI 页面中进行查看。