Log4j核心对象由三部分组成:
- logger :负责采集日志信息
- appenders:负责将日志信息发布到不同地方,终端,数据库,文件
- layouts:负责将日志格式化为各种形式
支持对象
- Level对象,定义日志信息的粒度和优先级;OFF、DEBUG、INFO、ERROR、WAR
N、FATAL、ALL。
- Filter过滤对象,分析日志信息,进而决定该条日志是否被记录;一个 Appender 对象可对应多个 Filter 对象,当日志信息传给 Appender 对象时,与其关联的所有 Filter 对象需要判断是否将日志信息发布到目的地。
- LogManager 对象,对象日志管理框架。
- ObjectRenderer 对象,ObjectRenderer对象负责为传入日志框架的不同对象提供字符串形式的表示,Layout 对象使用该对象来准备 最终的日志信息。
配置日志信息输出目的地 Appender
Log4j 提供的 appender 有以下几种:
- 1.org.apache.log4j.ConsoleAppender (控制台),
- 2.org.apache.log4j.FileAppender (文件),
- 3.org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件),
- 4.org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个 新的文件)
- 5.org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
配置日志信息的格式(布局),输出格式
Log4j 提供的 layout 有以 e 几种:
- 1.org.apache.log4j.HTMLLayout (以 HTML 表格形式布局),
- 2.org.apache.log4j.PatternLayout (可以灵活地指定布局模式),
- 3.org.apache.log4j.SimpleLayout (包含日志信息的级别和信息字符串),
- 4.org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等等信息)
下面是日志信息格式化所用的占位符,输出格式化例子:
#输出格式
#%m 输出代码中指定的消息
#%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
#%r 输出自应用启动到输出该log信息耗费的毫秒数
#%c 输出所属的类目,通常就是所在类的全名
#%t 输出产生该日志事件的线程名
#%n 输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
#%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
#%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
格式化例子:
log4j.appender.stdout.layout.ConversionPattern = [%-d{yyyy-MM-dd HH:mm:ss}]-[ %t:%r ]-[ %p ]-%m%n
输出:
[2017-07-20 23:13:10]-[ main:0 ]-[ DEBUG ]-debug msg
注意:
1.信息格式化的小知识
这些参数中间可能会参杂一些数字比如:%5p它的意思就是在输出此参数之前加入多少个空格,还有就是里面的“\”的作用是转义字符
log4j 1.2.17配置详解
# Log4j 1.2.17 版本的属性配置文件
### set log levels 设置根logger , 设置输出的日志级别为debug以上,定义了三个 appender:stdout, D, E ###
log4j.rootLogger = DEBUG , stdout, D, E
### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-d{yyyy-MM-dd HH:mm:ss}]-[ %t:%r ]-[ %p ]-%m%n
### 错误输出到日志文件 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
## 错误日志文件
log4j.appender.E.File = logs/error.log
## 日志附加到文件末尾
log4j.appender.E.Append = true
log4j.appender.E.DatePattern='.'yyyy-MM-dd
## 只输出ERROR级别(优先级)以上的日志 ##
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
log4j.appender.E.Encoding=utf-8
### 正常输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
## 正常日志文件 ,文件夹log在项目根目录下。
log4j.appender.D.File = logs/log.log
log4j.appender.D.DatePattern='.'yyyy-MM-dd-a
log4j.appender.D.Append = true
## 输出debug以上的日志。
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 ] - [ %5p ] %m%n
log4j.appender.D.Encoding=utf-8
## Mybatis 配置
log4j.logger.java.sql.Statement = debug
log4j.logger.java.sql.PreparedStatement = debug
log4j.logger.java.sql.ResultSet =debug
## 设置项目自己Logger
优先级从小到高;只显示比大于等于当前级别的信息。
1. ALL
1. TRACE
1. DEBUG
1. INFO
1. WARN
1. ERROR
1. FATAL
1. OFF
公司日志配置文件:
#开发日志将在本地输出,并输出SQL
log4j.rootLogger=DEBUG,A1,DRF
## 输出到Console
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
# log4j.appender.A1.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n
log4j.appender.A1.layout.ConversionPattern=%d %5p [%F:%L] : %m%n
## 输出到文件
log4j.appender.DRF=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DRF.Threshold=INFO #指定日志消息的输出最低层次
log4j.appender.DRF.DatePattern='.'yyyy-MM-dd
log4j.appender.DRF.File=logs/imodule-service-batch.log
log4j.appender.DRF.Append=true
log4j.appender.DRF.layout=org.apache.log4j.PatternLayout
log4j.appender.DRF.layout.ConversionPattern=[%-5p][%d{yyyyMMdd HH:mm:ss,SSS}][%C{1}:%L] %m%n
###输出SQL
##所有com.ibatis 包下日志级别为debug
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
DatePattern 指定生成日志的周期
在DailyRollingFileAppender中可以指定monthly(每月)、 weekly(每周)、daily(每天)、half-daily(每半天)、hourly(每小时)和minutely(每分钟)六个频度,这是通过为 DatePattern选项赋予不同的值来完成的。DatePattern选项的有效值为:
- ‘.’yyyy-MM,对应monthly(每月)
- ‘.’yyyy-ww,对应weekly(每周)
- ‘.’yyyy-MM-dd,对应daily(每天)
- ‘.’yyyy-MM-dd-a,对应half-daily(每半天)
- ‘.’yyyy-MM-dd-HH,对应hourly(每小时)
- ‘.’yyyy-MM-dd-HH-mm,对应minutely(每分钟)
网上给出的教程
### set log levels ###
log4j.rootLogger = debug , stdout , D , E
### 输出到控制台 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG ## 输出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
### 保存异常信息到单独文件 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = logs/error.log ## 异常日志文件名
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR ## 只输出ERROR级别以上的日志!!!
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %l:%c:%t:%r ] - [ %p ] %m%n
Log4j 在程序中使用
- 通过静态化方法获取到Logger类实例。
- getRootLogger();返回没有名字的日志记录器
- getLogger(Log4jSimpleTest.class); 返回指定名字的记录器
- 读取配置文件( PropertyConfigurator.configure ( String configFilename) 可有可无)
- -
static {
String relativePath = "log4j.properties";
try {
PropertyConfigurator.configure(ClassLoaderUtil
.getStream(relativePath));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
采集日志数据:
Log4jSimpleTest.logger.trace("trace msg");
Log4jSimpleTest.logger.debug("debug msg");
Log4jSimpleTest.logger.info("info msg");
Log4jSimpleTest.logger.warn("warn msg");
Log4jSimpleTest.logger.error("error msg");
Log4jSimpleTest.logger.fatal("fatal msg");
http://blog.youkuaiyun.com/qq_30175203/article/details/52084127
http://blog.youkuaiyun.com/tony168hongweigan/article/details/8537164
http://www.cnblogs.com/ITEagle/archive/2010/04/23/1718365.html
http://blog.youkuaiyun.com/anialy/article/details/8529188
http://www.cnblogs.com/alipayhutu/archive/2012/06/21/2558249.html