记录日志是软件开发中的重要一环。编写良好的日志代码能为运行应用提供快速的诊断信息和良好的存储结构,方便维护。记录日志也有其缺点,它会让应用变慢。为了减轻这些影响,Log4j 被设计为可靠的,更快的和可扩展的。
Log4j
主要由三部分组成:
- loggers:负责获取日志信息,并存储于一个分层的命名空间之中。
- appenders:负责将日志信息发布到不同地方。比如数据库、文件、控制台等。
- layouts:负责以各种风格格式化日志信息。
log4j.properties
文件是 Log4j
的配置文件,默认情况下, LogManager
会在 CLASSPATH
中寻找 Log4j.properties
文件。下面看个示例
1. 引入依赖文件
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
Java 中进行调用
package com.zuojl.controller;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
/**
* @author ZUOJL-PC
* @version 2018/11/17 0017 15:01
*/
@Controller
public class IndexController {
private static final Logger log = Logger.getLogger(IndexController.class);
@RequestMapping("/")
@ResponseBody
public String index() {
for (String key : System.getProperties().stringPropertyNames()) {
log.debug(String.format("%s -> %s", key, System.getProperty(key)));
}
return "Hello, Log4j";
}
}
在 resources 目录下添加 log4j 配置文件
log4j.rootLogger=DEBUG,console,debug
log4j.logger.org.springframework=ERROR
# console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %x %5p [%t] %C.%M(%F:%L) | %m%n
# debug file
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.File=${catalina.home}/logs/debug.log
log4j.appender.debug.Append=true
log4j.appender.debug.Threshold=debug
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%t] %C.%M(%F:%L) | %m%n
log4j.appender.debug.encoding=UTF-8
# info file
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.File=${catalina.home}/logs/info.log
log4j.appender.info.Append=true
log4j.appender.info.Threshold=debug
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%t] %C.%M(%F:%L) | %m%n
log4j.appender.info.encoding=UTF-8
# error file
log4j.appender.error=org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.File=${catalina.home}/logs/error.log
log4j.appender.error.Append=true
log4j.appender.error.Threshold=debug
log4j.appender.error.Target=System.err
log4j.appender.error.layout=org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %5p [%t] %C.%M(%F:%L) | %m%n
log4j.appender.error.encoding=UTF-8
log4j.properties 的配置信息的意义:
Loggers
五个级别的顺序 DEBUG < INFO < WARN < ERROR < FATAL 。
配置中的 Log4j.(logger|rootLogger).[logger-name]=level, appender1,appender..n
就是将 Appender 对象添加至 Logger 对象中。只有被添加到 Logger 中的 Appender 才会生效。
注意:这里需要注意的是不要将同一个 Appender 添加到不同的 Logger 中,否则会出现同样的日志多次打印的情况,无故消耗服务器性能。
Appender
常用的 Appender 有如下几种:
-
org.apache.log4j.ConsoleAppender
(控制台)。 -
org.apache.log4j.FileAppender
(文件)。 -
org.apache.log4j.DailyRollingFileAppender
(每天产生一个日志文件)。 -
org.apache.log4j.RollingFileAppender
(文件大小到达指定尺寸的时候产生一个新的文件)。 -
org.apache.log4j.WriterAppender
(将日志信息以流格式发送到任意指定的地方)。
Appender 的一些属性
-
Threshold=DEBUG
(指定日志消息的输出最低层次)。 -
ImmediateFlush=true
(默认值是true,意谓着所有的消息都会被立即输出)。 -
Target=System.err
(默认情况下是:System.out,指定输出控制台)。 -
File=${catalina.home}/logs/debug.log
(指定消息输出到 Tomcat 的 logs 文件夹下的 debug.log 文件中)。 -
Append=false
(默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容)。 -
MaxFileSize=100KB
(后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到 debug.log.1 文件)。 -
MaxBackupIndex=10
(指定可以产生的滚动文件的最大数)。
注意:可以使用 ${}
的形式调用变量,如果你没有定义这个变量的话会取 System.getProperties()
的值。
Layout
最常用的就是 PatternLayout
下面是其参数的意义:
- %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL。
- %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS}。
- %r: 输出自应用启动到输出该log信息耗费的毫秒数。
- %c: 输出日志信息所属的类目,通常就是所在类的全名。
- %t: 输出产生该日志事件的线程名。
- %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。
- %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。
- %%: 输出一个"%"字符。
- %F: 输出日志消息产生时所在的文件名称。
- %L: 输出代码中的行号。
- %m: 输出代码中指定的消息,产生的日志具体信息。
- %n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行。
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
- %20c: 指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
- %-20c: 指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
- %.30c: 指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
- %20.30c: 如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。