`
chinahnzhou
  • 浏览: 347370 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

log4j详解

    博客分类:
  • java
 
阅读更多

参考:

http://keepwork.iteye.com/blog/1511270

http://zhangkun716717-126-com.iteye.com/blog/1018176

http://spaceflysky-163-com.iteye.com/blog/249537

 

目录:

1.配置详解

2.自定义输出多个日志文件

3.高级使用


1.配置详解

 

日记记录的优先级由高到低分为 : 
OFF ,FATAL ,ERROR ,WARN ,INFO ,DEBUG ,ALL。 
Log4j建议只使用FATAL ,ERROR ,WARN ,INFO ,DEBUG这五个级别。 
FATAL 为致命错误
ERROR 为严重错误 主要是程序的错误 
WARN  为一般警告,比如session丢失 
INFO  为一般要显示的信息,比如登录登出 
DEBUG 为程序的调试信息
appender有以下几种:
org.apache.log4j.ConsoleAppender(控制台)
org.apache.log4j.FileAppender(文件)
org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件)
org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方)
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平台为“rn”,Unix平台为“n”
%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921
-x X信息输出时左对齐; 
%l 输出日志事件的发生位置,相当于%c.%m(%f:%l)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10) 
%x 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 
%% 输出一个"%"字符 
%f 输出日志消息产生时所在的文件名称 

可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如: 
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字符,就从左边较远输出的字符截掉。
【示例1】输出为文本文件或HTML文件
log4j.rootLogger=debug, appender1, appender2  
  
log4j.appender.appender1=org.apache.log4j.ConsoleAppender  
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout  
  
log4j.appender.appender2=org.apache.log4j.FileAppender  
#log4j.appender.appender2.File=appender2.log  
log4j.appender.appender2.File=appender2.html  
#log4j.appender.appender2.layout=org.apache.log4j.TTCCLayout  
log4j.appender.appender2.layout=org.apache.log4j.HTMLLayout
【示例2】自定义样式
log4j.rootLogger=debug,appender1  
  
log4j.appender.appender1=org.apache.log4j.ConsoleAppender  
log4j.appender.appender1.layout=org.apache.log4j.PatternLayout  
log4j.appender.appender1.layout.ConversionPattern=%r [%t] [%p] - %c -%l -%m%n  
【示例3】多目的地、自定义样式
log4j.rootLogger=debug,appender1,appender2  
  
log4j.appender.appender1=org.apache.log4j.ConsoleAppender  
log4j.appender.appender1.layout=org.apache.log4j.PatternLayout  
log4j.appender.appender1.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss:SSS}][%C-%M] %m%n

log4j.appender.appender2=org.apache.log4j.FileAppender  
log4j.appender.appender2.File=appender2.log  
log4j.appender.appender2.layout=org.apache.log4j.PatternLayout  
log4j.appender.appender2.layout.ConversionPattern=[%d{HH:mm:ss:SSS}][%C-%M] -%m%n  

 

 

2.自定义输出多个日志文件

如果想对不同的类输出到不同的文件(以cn.com.Test为例),先要在Test.java中定义: 

private static Log logger = LogFactory.getLog(Test.class);

   然后在log4j.properties中加入: 

log4j.logger.cn.com.Test=DEBUG, test 
log4j.appender.test=org.apache.log4j.FileAppender 
log4j.appender.test.File=test.log 
log4j.appender.test.layout=org.apache.log4j.PatternLayout 
log4j.appender.test.layout.ConversionPattern=%d %p [%c] - %m%n 

 但是,如果在同一类中需要输出多个日志文件呢?其实道理是一样的,先在Test.java中定义: 

private static Log logger1 = LogFactory.getLog("myTest1"); 
private static Log logger2 = LogFactory.getLog("myTest2"); 

 然后在log4j.properties中加入: 

log4j.logger.myTest1=DEBUG, test1 
log4j.appender.test1=org.apache.log4j.FileAppender 
log4j.appender.test1.File=test1.log 
log4j.appender.test1.layout=org.apache.log4j.PatternLayout 
log4j.appender.test1.layout.ConversionPattern=%d %p [%c] - %m%n 

log4j.logger.myTest2=DEBUG, test2 
log4j.appender.test2=org.apache.log4j.FileAppender 
log4j.appender.test2.File=test2.log 
log4j.appender.test2.layout=org.apache.log4j.PatternLayout 
log4j.appender.test2.layout.ConversionPattern=%d %p [%c] - %m%n 

 还有一个问题,就是这些自定义的日志默认是同时输出到log4j.rootLogger所配置的日志中的,如何能只让它们输出到自己指定的日志中呢?别急,这里有个开关:

log4j.additivity.myTest1=false 

它用来设置是否同时输出到log4j.rootLogger所配置的日志中,设为false就不会输出到其它地方啦!注意这里的"myTest1"是你在程序中给logger起的那个自定义的名字! 

如果你说,我只是不想同时输出这个日志到log4j.rootLogger所配置的logfile中,stdout里我还想同时输出呢!那也好办,把

log4j.logger.myTest1=DEBUG, test1
改为
log4j.logger.myTest1=DEBUG, test1, stdout 
 

 

3.高级使用

    3.1使用log4j1.2.14或以上版本

    3.1 把Log4j压缩包里的NTEventLogAppender.dll拷到WINNT\SYSTEM32目录下 

    3.2 在项目中引用mail.jar和activation.jar

#log4j.properties
#log4j.rootLogger=console, OS, mail
#这一句设置以为着所有的log都输出 
#如果为log4j.rootLogger=WARN, 则意味着只有WARN,ERROR,FATAL被输出,DEBUG,INFO将被屏蔽掉. 

#控制台输出
log4j.logger.consoleLog=DEBUG, console
log4j.additivity.consoleLog=false
#console appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

#在OS日志输出 
log4j.logger.OSlog=FATAL, OS
log4j.additivity.OSlog=false
#OS appender
log4j.appender.OS=org.apache.log4j.nt.NTEventLogAppender
log4j.appender.OS.Source=JavaTest 
log4j.appender.OS.layout=org.apache.log4j.PatternLayout 
log4j.appender.OS.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

# 将日志发送到email 
log4j.logger.mailLog=WARN, mail 
log4j.additivity.mailLog=false
#mail appender
log4j.appender.mail=org.apache.log4j.net.SMTPAppender 
log4j.appender.mail.BufferSize=5 
log4j.appender.mail.SMTPHost=smtp.163.com
log4j.appender.mail.SMTPUsername=username@163.com
log4j.appender.mail.SMTPPassword=password
log4j.appender.mail.From=username@163.com
log4j.appender.mail.To=to@163.com
log4j.appender.mail.Subject=ErrorLog 
log4j.appender.mail.layout=org.apache.log4j.PatternLayout 
log4j.appender.mail.layout.ConversionPattern=%-4r %-5p [%t] %37c %3x - %m%n

 Log4jTest.java

public class Log4jTest {
	public static void main(String args[]) {
		PropertyConfigurator.configure("F:/log4j.properties");
		// 在后台输出
		Logger logger1 = Logger.getLogger("consoleLog");
		logger1.debug("console_debug!!!");
		logger1.info("console_info!!!");
		logger1.warn("console_warn!!!");
		logger1.error("console_error!!!");
		logger1.fatal("console_fatal!!!");
		
		// 在log写入系统日志
		Logger logger2 = Logger.getLogger("OSlog");
		logger2.debug("nt_debug!!!");
		logger2.info("nt_info!!!");
		logger2.warn("nt_warn!!!");
		logger2.error("nt_error!!!");
		// 只有这个错误才会写入2000日志
		logger2.fatal("nt_fatal");
		
		// 把log发送到mail
		Logger logger3 = Logger.getLogger("mailLog");
		logger3.warn("mail_warn1!!!");
		logger3.error("mail_error!!!");
		logger3.error("mail_来两句中文!!!");
		logger3.fatal("mail_fatal!!!");
	}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics