编写log4j的配置文件

Log4j有三个主要的组件:Loggers,Appenders和Layouts,这里可简单理解为日志记录器,日志要输出的地方和日志以何种形式输出。

Loggers
组件在此系统中被分为五个级别:DEBUG、INFO、WARN、ERROR和FATAL。这五个级别是有顺序的,DEBUG < INFO < WARN < ERROR < FATAL,明白这一点很重要,这里Log4j有一个规则:假设Loggers级别为P,如果在Loggers中发生了一个级别Q比P高的日志输出事件,则会输出,否则屏蔽掉。

Appenders
禁用与使用日志请求只是Log4j其中的一个小小的地方,Log4j日志系统允许把日志输出到不同的地方,如控制台(Console)、文件(Files)、根据天数或者文件大小产生新的文件、以流的形式发送到其它地方等等。
常见的Appender有:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件),
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
org.apache.log4j.net.SMTPAppender(发送到邮箱)
org.apache.log4j.jdbc.JDBCAppender(储存到数据库)

Layouts
有时用户希望根据自己的喜好格式化自己的日志输出。Log4j可以在Appenders的后面附加Layouts来完成这个功能。Layouts提供了四种日志输出样式,如根据HTML样式、自由指定样式、包含日志级别与信息的样式和包含日志时间、线程、类别等信息的样式等等。
常见的Layout有:
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)
Layouts有以下各常用的占位符:
%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r 输出自应用启动到输出该log信息耗费的毫秒数
%c 输出所属的类目,通常就是所在类的全名
%t 输出产生该日志事件的线程名
%n 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)

在程序中使用Log4j
在程序中使用Log4j,也就是要输出日志信息,一般分为两个步骤:首先获得一个Logger实例,然后调用此实例的debug()、info()、warn()、error()、fatal()等进行日志的输出。
在上面的配置文件中,讲到了两种命名策略,一种是直接根据类的全名命名,另一种是根据用途命名,那么在实例化和使用的时候,就会稍微有些不同。
根据类全命命名:
Logger logger = Logger.getLogger(this.getClass());
//实例化一个logger,这里this.getClass()将返回这个类的全名,如果这个名字在配置文件中定义了,则这个logger有其相关定义了的属性,如果没有,则看是否定义了其父类和时候设置了继承。如果都没有,则拥有rootLogger的属性。
//当然,logger的实例化可以任意取名,比如Logger logger = Logger.getLogger("myLogger"),但一句相关的策略,将会更加便于管理。

logger.debug("按类取名测试:DEBUG");
logger.info("按类取名测试:INFO");
logger.warn("按类取名测试:WARN");
logger.error("按类取名测试:ERROR");
logger.error("按类取名测试:ERROR", Exception e);
logger.fatal("按类取名测试:FATAL");
//这就是条用logger的各种方法输出日志信息。其中logger.error("按类取名测试:ERROR", Exception e)也会将异常堆栈e的相关信息也输出到相应的Appender

根据用途命名:
Logger logger_sa = Logger.getLogger("sa");
logger_sa.info("Log4j演示程序启动成功");

Logger logger_ua = Logger.getLogger("ua");
logger_ua.info("用户boyyf注册成功");

Logger logger_e = Logger.getLogger("e");
try {
Integer.parseInt("a");
} catch (Exception e) {
logger_e.error("出现数值转换异常",e);
//这样会在日志中记录异常堆栈
}


-----------------------------------------------------------
#下面是Logger的定义

#定义根logger,其余所有的logger都是它的子logger
log4j.rootLogger=DEBUG

#logger的定义策略1:根据类名定义logger

#这里就定义了两个logger,一个名为"com.ins1000.log4j.servlets",另一个名
#为"com.ins1000.log4j.servlets"。#logger的命名是具有层次性和隶属性的,跟
#类的全名一样,可以说"com.ins1000.log4j.servlets.Test"这个logger是"com.
#ins1000.log4j.servlets"这个的子logger。
log4j.logger.com.ins1000.log4j.servlets=DEBUG,CONSOLE
log4j.logger.com.ins1000.log4j.servlets.Test=DEBUG,CONSOLE,DailyRollingFile


#logger的定义策略2:根据用途定义logger

#定义了一个名为sa(system action)的logger,用于记录程序的系统行为,如程
#序启动,初始化完成等
log4j.logger.sa=DEBUG,CONSOLE_SA

#定义了一个名为us(users action)的logger,用于记录用户的一般行为,如注册
#、发布文章、发布作品等
log4j.logger.ua=DEBUG,DailyRollingFile_UA

#定义了一个名为e(Errors或Exceptions)的logger,用于记录程序运行中出现的
#错误和异常
log4j.logger.e=DEBUG,CONSOLE_E,ROLLING_FILE_E

#以上各个定义的等号右方DEBUG的表示该logger的日志输出起始级别,接着后面是
#这个logger要输#出的Appender,可以有多个,用逗号隔开。
#其次,这里提到了两种logger的命名策略,虽然互联网上几乎所有的教程皆称以类
#的全名是最简单也最好的命名策略,因为其层次结构跟我们的项目完全一致,但是
#本人处于应用需要,还是提出了另一种根据用途命名的策略,即把所有需要记录的
#日志信息分为3中(系统行为、用户行为、异常),分别输出到不同的地方。


#下面定义各个层次是否继承父辈的属性(初始级别和Appenders)
log4j.additivity.com.ins1000.log4j=true
log4j.additivity.com.ins1000.log4j.Test=true
log4j.additivity.e=false
log4j.additivity.sa=false
log4j.additivity.ua=false
log4j.addivity.org.apache=true


#下面定义各个Appenders

###################################
# Console Appender
###################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[ins1000]%p: %m [%c]%n


###################################
# Console Appender For SystemAction
###################################
log4j.appender.CONSOLE_SA=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE_SA.Target=System.out
log4j.appender.CONSOLE_SA.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE_SA.layout.ConversionPattern=[ins1000]\u7cfb\u7edf\u4fe1\u606f: %m%n

###################################
# Console Appender For Errors and Exceptions
###################################
log4j.appender.CONSOLE_E=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE_E.Target=System.out
log4j.appender.CONSOLE_E.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE_E.layout.ConversionPattern=[ins1000]\u7cfb\u7edf\u5f02\u5e38: %m [%l]%n

#上面的Appender都是输出到控制台,多个项目的信息都可能被输出到控制台,所以
#一般都会加上项目名称,如[ins1000]

########################
# Rolling File For Errors and Exceptions
########################
log4j.appender.ROLLING_FILE_E=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE_E.Threshold=ERROR

log4j.appender.ROLLING_FILE_E.File=${webappHome}/WEB-INF/log/errors/ins1000.log
#日志文件的位置,其中${webappHome}代表环境变量中webappHome的值,Log4j会在
#初始化的死后自动期待,所以我们可以在Log4j初始化的时候将webapp的绝对路径存
#入系统环境标量中,从而解决要手动修改日志文件的问题

log4j.appender.ROLLING_FILE_E.Append=true

log4j.appender.ROLLING_FILE_E.MaxFileSize=5120KB
#一个文件的大小(当超过这个大小时,自动更换一个文件)

log4j.appender.ROLLING_FILE_E.MaxBackupIndex=1
log4j.appender.ROLLING_FILE_E.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE_E.layout.ConversionPattern=%n%n[%d{yyyy-MM-dd HH:mm:ss}]%m [%l]%n

########################
# DailyRollingFile Appender
#######################
log4j.appender.DailyRollingFile=org.apache.log4j.DailyRollingFileAppender

log4j.appender.DailyRollingFile.DatePattern=yyyy-MM-dd'.log'
#日期戳后缀的格式

log4j.appender.DailyRollingFile.File=${webappHome}/WEB-INF/log/ins1000_
log4j.appender.DailyRollingFile.Append=true
log4j.appender.DailyRollingFile.layout=org.apache.log4j.PatternLayout
log4j.appender.DailyRollingFile.layout.ConversionPattern=[%-5p]%m [%c][%d{yyyy-MM-dd HH:mm:ss}]%n

#这个Appender的工作机理是先将日志写在/WEB-INF/log/ins1000_,待到了第二天,自动将其更名为
#ins1000_yyyy-MM-dd.log(其中yyyy-MM-dd是第一天的日期)。然后仍将第二天的日志先记录在在
#ins1000_中,第三天再改名,以此类推。

########################
# DailyRollingFile Appender For Users Action
#######################
log4j.appender.DailyRollingFile_UA=org.apache.log4j.DailyRollingFileAppender
log4j.appender.DailyRollingFile_UA.DatePattern=yyyy-MM-dd'.log'
log4j.appender.DailyRollingFile_UA.File=${webappHome}/WEB-INF/log/users_action/ins1000_
#${webappHome} is an enviorment variable which is setted in Log4jInit
#it refers to the absolute path of the webapp
log4j.appender.DailyRollingFile_UA.Append=true
log4j.appender.DailyRollingFile_UA.layout=org.apache.log4j.PatternLayout
log4j.appender.DailyRollingFile_UA.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss}] %m%n

-----------------------------------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值