log4j

Log4j 由三个重要的组件构成: 日志类别( Loggers )、输出源( Appenders )和布局( Layouts
一、日志类别
Loggers 被指定为实体 Logger 的名字是大小写敏感的 ,它们遵循以下的命名规则:
1、命名继承
如果类别的名称(后面加一个点)是其子类别名称的前缀,则它就是另一个类别的祖辈。
如果一个类别 (Logger) 和它的子类别之间没有其它的继承关系,我们就称之为 parent child 的关系。
    例如,类别 "com.foo" 是类别 "com.foo.Bar" parent 。相似的, "java" "java.util" parent ,是 "java.util.Vector" 的祖辈。
(root) 类别位于 logger 继承结构的最上层。它有两种例外:
1. 它一直存在
2. 它不能根据名称而获得。 
调用类的静态方法 Logger.getRootLogger 可以得到它。其它所有的 Logger 可以通过静态方法 Logger.getLogger 而得到它们自己的实例。这个方法取希望的 Logger 名作为参数。
Loggers 可以被分配的级别。所有级别的集合包括: DEBUG 、INFO、WARN、 ERROR FATAL
2、级别继承
对于一个给定的 Logger C ,它的继承的级别等于从 C 开始上溯到的第一个拥有非空级别的 Logger 的级别。
    为了保证所有的 Logger 最终能够继承到一个级别,根 Logger 通常有一个已经定义了的级别。
    以下四个表中的数据演示了根据以上规则得到的结果。
 
类别名
分配的级别
继承的级别
root
Proot
Proot
X
none
Proot
X.Y
none
Proot
X.Y.Z
none
Proot
Example 1
在例子 1 中,只有根 Logger 定义了一个级别,它的级别的值 --"Proot" 被所有其它的 Loggers X, X.Y, X.Y.Z 所继承。
 
类别名
分配的级别
继承的级别
root
Proot
Proot
X
Px
Px
X.Y
Pxy
Pxy
X.Y.Z
Pxyz
Pxyz
Example 2
    在例子 2 中,所有的 Logger 都有一个被分配的级别值,所以它们不需要级别继承。
 
类别名
分配的级别
继承的级别
root
Proot
Proot
X
Px
Px
X.Y
none
Px
X.Y.Z
Pxyz
Pxyz
Example 3
    在例子 3 中,根 Logger ,以及 X X.Y.Z 被分别分配了级别 Proot Px Pxyz Logger X.Y 从它的 parent X 继承了级别值 Px
 
类别名
分配的级别
继承的级别
root
Proot
Proot
X
Px
Px
X.Y
none
Px
X.Y.Z
none
Px
Example 4
    在例子 4 中,根 Logger X 被分别分配了级别 "Proot" "Px" Logger X.Y X.Y.Z 从被分配了级别的最接近它们的 ancestor X 那里得到继承。
3、基本的选择规则
假如在一个级别为 q Logger 中发生一个级别为 p 的日志请求,如果 p>=q, 那么请求将被启用
这是 Log4j 的核心原则。它假设级别是有序的。对于标准级别,我们定义 DEBUG < INFO < WARN < ERROR < FATAL.
即,如果一个日志的请求的级别高于或等于日志的级别那么它就能被启用。反之,将被禁用。一个没有被安排级别的 Logger 将从它的父辈中得到继承。
    以类的所在位置来命名 Logger 好象是目前已知的最好方法。
二、输出源
Log4j 允许日志请求被输出到多个输出源。用 Log4j 的话说,一个输出源被称做一个 Appender Appender 包括 console (控制台) , files (文件) , GUI components (图形的组件) , remote socket servers socket 服务) , JMS java 信息服务) , NT Event Loggers NT 的事件日志) , and remote UNIX Syslog daemons (远程 UNIX 的后台日志服务)。它也可以做到异步记录。
    一个 logger 可以设置超过一个的 appender
    addAppender 方法添加一个 appender 到一个给定的 logger 。对于一个给定的 logger 它每个生效的日志请求都被转发到该 logger 所有的 appender 上和该 logger 的父辈 logger appender 上。换句话说, appender 自动从它的父辈获得继承。 举例来说,如果一个根 logger 拥有一个 console appender ,那么所有生效的日志请求至少会被输出到 console 上。如果一个名为 C logger 有一个 file 类型的 appender ,那么它就会对它自己以及所有它的子 logger 生效。我们也可以通过设置 appender additivity flag false ,来重载 appender 的默认行为,以便继承的属性不在生效。
    输出源的可 添加性( Appender Additivity ):
一个名为 C logger 的日志定义的输出将延续到它自身以及它的 ancestor logger appenders 。这就是术语 "appender additivity" 的含义。
然而, logger C 的一个 ancestor logger P ,它的附加标志被设为 false ,那么 C 的输出将被定位到所有 C appender ,以及从它开始上溯到 P 的所有 ancestor logger 的appender
Loggers 的附加标记( additivity flag )默认为 true
  下表是一个例子。
Logger
Name
Added
Appenders
Additivity
Flag
Output Targets
Comment
root
A1
not applicable
A1
The root logger is anonymous but can be accessed with the Logger.getRootLogger() method. There is no default appender attached to root.
x
A-x1, A-x2
true
A1, A-x1, A-x2
Appenders of "x" and root.
x.y
none
true
A1, A-x1, A-x2
Appenders of "x" and root.
x.y.z
A-xyz1
true
A1, A-x1, A-x2, A-xyz1
Appenders in "x.y.z", "x" and root.
security
A-sec
false
A-sec
No appender accumulation since the additivity flag is set to false .
security.access
none
true
A-sec
Only appenders of "security" because the additivity flag in "security" is set to false .
 三、布局
PatternLayout ,作为Log4j标准版中的一部分,让用户指以类似C语言的printf方法的格式来指定日志的输出格式。
打印参数如下:
%m 输出代码中指定的消息
%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)
四、配置
1Properties配置文件
log4j.rootLogger=INFO, A1, A2
#setting for appender A1
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n
#setting for appender A2
log4j.appender. A2=org.apache.log4j.RollingFileAppender
log4j.appender. A2.File=example.log
log4j.appender. A2.MaxFileSize=100KB
log4j.appender. A2.MaxBackupIndex=1
log4j.appender. A2.layout=org.apache.log4j.PatternLayout
log4j.appender. A2.layout.ConversionPattern=%p %t %c - %m%n
 
注意:其中的log4j.appender 必须都为小写
注释:
配置根 Logger ,其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中, level 是日志记录的优先级,分为 ALL DEBUG INFO WARN ERROR FATAL OFF 或者您定义的级别。
appenderName 就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。
配置日志信息输出目的地 Appender ,其语法为
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
log4j.appender.appenderName.option = valueN
其中, Log4j 提供的 appender 有以下几种:
(A)org.apache.log4j.ConsoleAppender (控制台),
(B)org.apache.log4j.FileAppender (文件),
(C)org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件),
(D)org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新的文件),
(E)org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
3.  配置日志信息的格式(布局),其语法为:
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
log4j.appender.appenderName.layout.option = valueN
其中, Log4j 提供的 layout 有以下几种:
org.apache.log4j.HTMLLayout (以 HTML 表格形式布局),
org.apache.log4j.PatternLayout (可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout (包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等等信息)
2XML配置文件
具体参数含义可看上面的部分,下面给出示例:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
 <!-- ================================================================= -->
 <!--                     a dailyRolling file appender                       -->
 <!-- ================================================================= -->
 <appender name="command.log" class="org.apache.log4j.DailyRollingFileAppender">
    <param name="File" value="D://tomcat5//webapps//html//log4j//test.log" />
    <param name="Append" value="true" />
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="[%-d{yyyy:MM:dd HH:mm:ss}] %p [%c] - %m%n" />
    </layout>
 </appender>
 
 <!-- ================================================================= -->
 <!--                       a console appender                          -->
 <!--     debug can be turned off by setting level of root to "off"     -->
 <!-- ================================================================= -->
 
 <appender name="console.log" class="org.apache.log4j.ConsoleAppender">
    <layout class="org.apache.log4j.PatternLayout">
      <param name="ConversionPattern" value="%-d{yyyy:MM:dd HH:mm:ss} %t %c - %m%n" />
    </layout>
 </appender>
 
 <!-- use this to turn on debug to a rolling file. -->
 <!-- use this to turn off debug. -->
 
 <root>
    <level value="debug" />
    <appender-ref ref="console.log" />
       <appender-ref ref="command.log" />
 </root>
 
</log4j:configuration>
3、范例
下面给出的Log4j配置文件实现了输出到控制台,文件,回滚文件,发送日志邮件,输出到数据库日志表,自定义标签等全套功能。
log4j.rootLogger=DEBUG,CONSOLE,A1,im
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE

log4j.addivity.org.apache=true

###################
# 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=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n


#####################
# File Appender
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis



########################
# Rolling File
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


####################
# Socket Appender
####################
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n


########################
# Log Factor 5 Appender
########################
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000


########################
# SMTP Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@hollycrm.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@hollycrm.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


########################
# JDBC Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout

###################
#
自定义Appender
###################
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender

log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net

log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
五、使用
       首先,读取配置文件初始化。
// properties 文件
PropertyConfigurator.configure (String settingfilename) ;
 
//XML 文件
DOMConfigurator.configure(String settingfilename);
 
       使用方法,以 debug 为例:
if(logger.isDebugEnabled() {
        logger.debug(“Here is the debug info”);
      }
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值