注1:本文 log4j 版本为 log4j1,以下简称 log4j
注2:本文没有对 “为什么要用log4j” 作解释,请自行查阅
从学编程第一天起,我们就学会了这一条语句:输出 hello, world 到控制台
System.out.println("hello, world");
下面使用log4j来完成同样的工作
1、创建一个Web工程 log4j-demo,下载并引入3个jar包
(可在maven仓库中搜索并下载)
log4j-1.2.15.jar
slf4j-api-1.5.10.jar
slf4j-log4j12-1.5.10.jar
2、新建一个 Servlet 类接收 get 请求
package org.test.servlet;
...... //导入的其他包
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@WebServlet(urlPatterns={"/test/master"})
public class MasterServlet extends HttpServlet {
private static final long serialVersionUID = 1111L;
private static final Logger log = LoggerFactory.getLogger(MasterServlet.class);
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
log.debug("hello, world");
}
}
3、在 src 下创建一个 log4j.properties 配置文件(文件必须是这个名称),填入下面的内容,将项目部署到 tomcat,启动tomcat,在浏览器访问 http://localhost:8080/log4j-demo/test/master
log4j.rootLogger=debug, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%p] %d %c - %m%n
查看控制台,打印成功,输出如下,比用 System.out.println 时输出了更多的信息。
[DEBUG] 2018-04-12 09:51:42,148 org.test.servlet.MasterServlet - hello, world
4、在 log.debug("hello, world") 后再添加3条代码
log.info("hello, world");
log.warn("hello, world");
log.error("hello, world");
5、重启tomcat,访问,控制台输出如下
[DEBUG] 2018-04-12 11:33:40,841 org.test.servlet.MasterServlet - hello, world
[INFO] 2018-04-12 11:33:40,842 org.test.servlet.MasterServlet - hello, world
[WARN] 2018-04-12 11:33:40,842 org.test.servlet.MasterServlet - hello, world
[ERROR] 2018-04-12 11:33:40,842 org.test.servlet.MasterServlet - hello, world
6、log4j.rootLogger=debug 改成 log4j.rootLogger=error
得到输出结果
[ERROR] 2018-04-12 11:36:07,638 org.test.servlet.MasterServlet - hello, world
如果不是这个输出结果,请尝试关闭tomcat,clean the project【菜单Project-->Clean...】,再次启动 tomcat
日志级别
刚才第一次,我们把log4j.properties配置文件的第一行 rootLogger=debug 指定了日志级别为debug,那么就会打印在程序中所有log.debug()的信息,同时,还打印了其他的日志:log.info(),log.warn() 和 log.error()
第二次,将 rootLogger=debug 改为 rootLogger=error,就只打印了 log.error()。
可见,设置了某个级别的日志,会打印等于或高于该级别的日志。所以设置的日志等级越高,打印出来的日志就越少。
rootLogger 格式为:
log4j.rootLogger = 【 Level 】, appenderName1, appenderName2, …
【Level】可填的级别
debug
info
warn
error
fatal
从上到下,级别递增。log4j建议只使用四个级别,debug, info, warn, error
即
rootLogger 设为debug,可打印debug、info、warn、error
rootLogger 设为info,可打印info,warn,error
rootLogger 设为warn,可打印warn,error
rootLogger 设为error,可打印error
输出源
appenderName1,appenderName2 是自定义的输出源名称,并且可以有多个。上例我使用了console,当然也可以写成A1、C3等等,但为了让它具有语义、自解释性,推荐使用有意义的输出源名称,比如看到输出源叫console,就知道是向控制台输出的。
定义了输出源后,才能对数据源进行配置
log4j.rootLogger=debug, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%p] %d %c - %m%n
输出源使用log4j框架提供的类ConsoleAppender,接着再进行下一级——layout的配置,再进行layout的下一级配置,如ConversionPattern…… 顺序不能颠倒。
下面介绍输出到控制台的同时,输出到指定文件里
7、添加另一个输出源 file1
log4j.rootLogger=debug, console, file1
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%p] %d %c - %m%nlog4j.appender.file1=org.apache.log4j.FileAppender
log4j.appender.file1.File=${catalina.base}/logs/log4j-demo/file1.log
log4j.appender.file1.layout=org.apache.log4j.PatternLayout
log4j.appender.file1.layout.ConversionPattern=[%p] %d %c - %m%n
这行配置了要输出的文件所在位置,${catalina.base}是该项目所部署的tomcat的路径,见下图。
log4j.appender.file1.File=${catalina.base}/logs/log4j-demo/file1.log
查看文件
8、只想在文件中输出 error 级别的日志,添加下面一行
log4j.appender.file1.threshold=error
下面介绍一些log4j框架内提供的输出源(appender)以及日志输出格式(layout),也可以查看官方API获取更多更详细的信息 --> Log4j
log4j 提供的 appender 有以下几种,前文已介绍前2种
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
log4j 提供的 layout 有以下几种,前文已介绍第1种
org.apache.log4j.PatternLayout(可以灵活地指定布局模式)
org.apache.log4j.HTMLLayout(以HTML表格形式布局)
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
输出参数
%t 用来输出生成该日志事件的线程的名称
%p 用于输出日志事件的优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 用于输出从layout(布局)的构建到日志事件创建所经过的毫秒数
%c 用于输出日志事件的category(类别),通常就是所在类的全名
%F 用于输出被发出日志记录请求,其中的文件名
%d 用于输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:20017年02月18日 22:10:28,921
%L 用于输出日志事件的发生位置,即在代码中的行数。举例:10
%l 用于输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
%% 用于输出%标志
%M 用于输出打印该条日志的方法名
%m 用于输出代码中指定的消息
%n 用于输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
参考文章
配置Log4j(很详细)
log4j(二)——如何控制日志信息的输出
org.apache.log4j.DailyRollingFileAppender输出不出日志原因分析
Apache Log4j 1.2.17 API