Log4j 有三个主要组件:loggers、appenders 和 layouts。这三个组件协同工作,使开发
人员能够根据消息类型和级别来记录消息,并且在程序运行期控制消息的输出格式位置。
Logger:日志记录器
Logger 负责处理日志记录的大部分操作。
Appender:日志信息的输出目的地
Appender 负责控制日志记录操作的输出。
Layout:日志格式化器
Layout 负责格式化Appender 的输出。
1.Logger-日志记录器
Logger是log4j里的核心组件,主要实现如下:
package org.apache.Log4j;
public class Logger {
// Creation & retrieval methods:
public static Logger getRootLogger();
public static Logger getLogger(String name);
// printing methods:
public void debug(Object message);
public void info(Object message);
public void warn(Object message);
public void error(Object message);
// generic printing method:
public void log(Level l, Object message);
}
默认时,log4j组件设置了一个根(rootLogger)实例,但是没有对其进行输出级别,输出目的地,输出格式进行定义.故在用Log4j时,如果没有对其进行配置,在运行时则会报错。rootLogger实例不能通过实例名来获得,只能通过其静态方法 getRootLogger()来获得。
对于每个具体的类来说,如果需用到Logger实例,必须创建Logger实例或获得已知Logger实例,可以通过用 Logger.getLogger(this.getClasss())来实现(如果是与Commons-logging组件合用,则调用LogFactory.getLog(this.getClass()))。
创建一个新的Logger实例,需要对其进行初始化,包括输出级别,输出目的地(输出格式与appender相关联)。如果不进行任何初始化,则输出级别遵循一直向上继承,直到最近的父辈的原则,appender遵循输出源的可添加性原则,见下面appdender介绍。
例如:名为com.hailin.test的Logger实例没有初始化,它会去继承名为com.hailin的实例初始化,如果 com.hailin的Logger实例配置存在,则就停止查找,如果未找到,就一直查找下去,直至rootLogger。
Loggers 可以被分配的级别包括:DEBUG、INFO、WARN、ERROR、FATAL。对于标准级别,我们定义DEBUG<INFO<WARN<ERROR<FATAL。
2.appender-输出目的地
输出源的可添加性(Appender Additivity ):一个名为C 的logger 的日志定义的输出将延续到 它自身以及它的ancestor logger 的appenders。 然而,logger C 的一个祖先logger P,它的附加标志被设为false,那么C 的输出将被定位到 所有C 的appender,以及从它开始上溯到P 的所有ancestor logger 的appender。
Log4j 提供的appender有以下几种:
org.apache.log4j.ConsoleAppender (控制台),
org.apache.log4j.FileAppender (文件),
org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新的文件),
org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
3.Layout-输出格式
Log4j 提供的layout 有以下几种:
org.apache.log4j.HTMLLayout (以HTML 表格形式布局),
org.apache.log4j.PatternLayout (可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout (包含日志信息的级别和信息字符串),
org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等等信息)
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)
4.log4j.properties的通用模板
#rootLogger
log4j.rootLogger = INFO,FILE
#应用于控制台
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}-[TEST] %p [%t] % C.%M(%L)-%m%n
#应用于文件
log4j.appender.FILE = org.apache.log4j.FileAppender
log4j.appender.FILE.File = D://app//personalProject//classes//hailin.log
#log4j.appender.FILE.Append 属性是否覆盖源文件,true为不覆盖,false为覆盖
log4j.appender.FILE.Append = true
log4j.appender.FILE.layout = org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss}-[TEST] %p [%t] %C.%M(%L)-%m%n
#应用于文件回滚
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
log4j.appender.SOCKET = org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost = localhost
log4j.appender.SOCKET.Port = 5001
log4j.appender.SOCKET.LocationInfo = true
log4j.appender.SOCKET.layout = org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern = [start] % d {DATE} [DATE] % n % p[PRIORITY] % n % x[NDC] % n % t[THREAD] % n % c[CATEGORY] % n % m[MESSAGE] % n % n
log4j.appender.LF5_APPENDER = org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords = 2000
#发送日志给邮件
log4j.appender.MAIL = org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold = FATA
log4j.appender.MAIL.BufferSize = 10
log4j.appender.MAIL.From = xx@sina.com.cn
log4j.appender.MAIL.SMTPHost = www.sian.com.cn
log4j.appender.MAIL.Subject = Log4J Message
log4j.appender.MAIL.To = xx@sina.com.cn
log4j.appender.MAIL.layout = org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n
#用于数据库
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 = xx@sina.com.cn
log4j.appender.im.layout = org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern = [framework] % d - % c -%- 4r [ % t] %- 5p % c % x - % m % n
#定义具体的类日志属性
log4j.logger.com.tongda.whl=DEBUG,CONSOLE
log4j.logger.com.tongda.whl.log=DEBUG