Log4j介绍与使用

时间:2023-02-05 17:32:04

Log4j三大组件

1) 日志记录器Logger
负责输出日志信息,并能够对日志信息进行分类筛选,决定哪些日志信息应该被输出,哪些该被忽略。Loggers组件输出日志信息时分为5个级别:DEBUG、INFO、WARN、ERROR、FATAL。这五个级别的顺序是:DEBUG<INFO<WARN<ERROR<FATAL。如果设置某个Logger组件的级别是P,则只有级别等于或高于P的日志信息才能输出。Logger有继承关系,最上层是rootLogger,定义的其他Logger都会继承rootLogger

2) 输出配置Appender
定义日志输出目的地,输出的目的地可以是控制台、文件或网络设备

3) 格式化器Layout
通过在Appender的后面附加Layout来实现日志格式化输出

一个Logger可以包含多个Appender,每个Appender对应一个Layout

通过在项目中创建 log4j.properties 文件来配置log4j,项目启动时会自动检索项目内全部文件找到该配置文件

Logger

Logger的定义格式:
log4j.rootLogger=level,appenderName,appenderName,...
log4j.logger.packageName=level,appenderName,appenderName,...

level是日志的输出最低级别
appenderName是日志信息的输出目的地,可以同时定义多个输出目的地
packageName是对单个包路径下的全部类配置单独的日志输出目的地

Appender

Appender的定义格式:
log4j.appender.appenderName=fully.qualified.name.of.appender.class
其中 fully.qualified.name.of.appender.class 可以指定如下五种之一:

org.apache.log4j.ConsoleAppender

将日志输出到控制台,选项:
1)Threshold=WARN:指定日志消息的输出最低级别
2)ImmediateFlush=true:默认为true,意味着所有的消息都会立即输出
3)Target=System.err:默认为System.out,指定输出控制台

org.apache.log4j.FileAppender

将日志输出到文件,选项:
1)Threshold=WARN:指定日志消息的输出最低级别
2)ImmediateFlush=true:默认为true,意味着所有的消息都会立即输出
3)File=logFile.log:指定消息输出到logFile.log文件
4)Append=false:默认为true,即将消息追加到指定文件,false将消息覆盖指定的文件

org.apache.log4j.DailyRollingFileAppender

每天产生一个日志文件,选项:
1)Threshold=WARN:指定日志消息的输出最低级别
2)ImmediateFlush=true:默认值是true,意味着所有的消息都会立即输出
3)File=logFile.log:指定消息输出到logFile.log文件
4)Append=false:默认值是true<即将消息追加到指定文件,false将消息覆盖指定的文件
5)DatePattern='.'yyyy-MM-dd:每天产生一个新文件,还可以指定其他方式:
'.'yyyy-MM: 每月
'.'yyyy-ww: 每周
'.'yyyy-MM-dd: 每天
'.'yyyy-MM-dd-a: 每天两次
'.'yyyy-MM-dd-HH: 每小时
'.'yyyy-MM-dd-HH-mm: 每分钟

org.apache.log4j.RollingFileAppender

文件大小到达指定尺寸时产生一个新的文件,选项:
1)Threshold=WARN:指定日志消息的输出最低级别
2)ImmediateFlush=true:默认值是true,意味着所有的消息都会被立即输出
3)File=logFile.log:指定消息输出到logFile.log文件
4)Append=false:默认值是true,即将消息追加到指定文件中,false指将消息覆盖指定的文件
5)MaxFileSize=100KB: 后缀可为KB、MB、GB,在日志文件到达该大小时,将会自动滚动,即将原来的内容移到logFile.log.1文件
6)MaxBackupIndex=2:指定可产生的滚动文件的最大数量

org.apache.log4j.WriterAppender

将日志信息以流格式发送到任意指定的地方

Layout

Layout的定义格式:

第一部分:

log4j.appender.appenderName.layout=fully.qualified.name.of.layout.class
其中 fully.qualified.name.of.layout.class 可以指定如下4种之一:

org.apache.log4j.HTMLLayout

以HTML表格形式布局,选项:
1)LocationInfo=true:输出java文件名称和行号,默认为false
2)Title=my app file: 默认值是 Log4J Log Messages

org.apache.log4j.PatternLayout

可以灵活地指定布局模式,选项:
1)ConversionPattern=%m%n :指定消息格式化方式

org.apache.log4j.SimpleLayout

包含日志信息的级别和信息字符串,选项:
1)LocationInfo=true:输出java文件和行号,默认为false

org.apache.log4j.TTCCLayout

包含日志产生的时间、线程、类别等等信息

第二部分:
log4j.appender.appenderName.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ss.SSS} %c %m%n

每个符号含义:
1) -X: 输出时左对齐
2) %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL
3) %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,
              例如:%d{yyyy-MM-dd HH:mm:ss.SSS},输出:2010-10-10 22:10:28.921
4) %r: 输出自应用启动到输出该log信息耗费的毫秒数
5) %c: 输出日志信息所属的类目,通常就是所在类的全名
6) %t: 输出产生该日志事件的线程名
7) %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数,
             例如:Testlog4.main(TestLog4.java:10)
8) %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中
9) %%: 输出一个"%"字符
10)%F: 输出日志消息产生时所在的文件名称
11)%L: 输出代码中的行号
12)%m: 输出代码中指定的消息,产生的日志具体信息
13)%n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行

可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式如:
1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边交远销出的字符截掉

相对路径和系统变量

相对路径例子:
log4j.appender.A1.File=./Sample.log
其中.号表示项目根目录

使用 ${APP_HOME_PATH} 的方式来使用系统变量设置日志输出路径,例如:
#设定系统变量:
System.setProperty("LOG_PATH", "D:/");

#可以在log4j中使用该变量来确定输出路径
log4j.appender.A1.File=${LOG_PATH}/Sample.log

其中当使用tomcat服务器时,tomcat启动时自带系统变量:${catalina.home},可以直接在log4j配置文件中使用

实例

 #定义3个输出目的地
log4j.rootLogger=INFO,A1,A2,A3 #定义A1输出到控制台
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%4p [%t] (%F:%L) - %m%n #定义A2输出到文件
log4j.appender.A2=org.apache.log4j.RollingFileAppender
log4j.appender.A2.File=./Sample.log
log4j.appender.A2.MaxFileSize = 1KB
log4j.appender.A2.MaxBackupIndex = 3
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n #定义A3输出到数据库
log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL=jdbc:mysql://localhost:3306/dbName
log4j.appender.A3.driver=com.mysql.jdbc.Driver
log4j.appender.A3.user=root
log4j.appender.A3.password=root
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
#定义A3的写数据库执行的SQL语句
log4j.appender.A3.layout.ConversionPattern=INSERT INTO log4j(createDate,thread,level,class,message) values(\'%d\',\'%t\',\'%-5p\',\'%c\',\'%m\')

写到数据库时需要先创建好表:

 create table log4j
(
logId int not null auto_increment,--流水号
createDate varchar(45) default null,--日志生成时间
thread varchar(45) default null,--当前线程
level varchar(45) default null,--当前日志的级别
class varchar(45) default null,--生成日志的类
message varchar(245) default null,--日志具体信息 primary key(logId)
)

对不同的包设置不同的日志输出方式:

 #定义默认为输出到控制台
log4j.rootLogger=INFO,default
log4j.appender.default=org.apache.log4j.ConsoleAppender
log4j.appender.default.layout=org.apache.log4j.PatternLayout
log4j.appender.default.layout.ConversionPattern=%4p [%t] (%F:%L) - %m%n
#定义com.code包下的类的日志都输出到文件
log4j.logger.com.code=WARN
log4j.appender.com.code=org.apache.log4j.RollingFileAppender
log4j.appender.com.code.File=./Sample.log
log4j.appender.com.code.MaxFileSize = 1KB
log4j.appender.com.code.MaxBackupIndex = 3
log4j.appender.com.code.layout=org.apache.log4j.PatternLayout
log4j.appender.com.code.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n