log4j 几个技巧

1、想输出多个文件,不想所有的日志都输出在一个文件里。比如已有一个根logger,能记录所有的日志,但希望对某个类中(某部分或全部)的日志单独输出到一个文件中,怎么办?

解决办法:增加一个logger, 如希望一个叫Swift的类,里面有些日志希望单独输出,则可以增加一个logger记录器,名为SWIFT,日志输出级别为DEBUG。

log4j.logger.SWIFT=DEBUG,SWIFT
log4j.appender.SWIFT=org.apache.log4j.DailyRollingFileAppender
log4j.appender.SWIFT.File=C:/Logs/SWIFT.log
log4j.appender.SWIFT.DatePattern='.'yyyy-MM-dd
log4j.appender.SWIFT.layout=org.apache.log4j.PatternLayout
log4j.appender.SWIFT.layout.ConversionPattern=[%d] %t %1p %18c{3}(%L):%m %n

 
 

与根logger的比较

log4j.rootLogger=DEBUG,D

log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File=C:/Logs/DEBUG.log
log4j.appender.D.DatePattern='.'yyyy-MM-dd
log4j.appender.D.ImmediateFlush=true
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=[%d] %1p %18c{3}(%L):%m %n

2、如果1中的日志输出太多,不想重复输出到DEBUG.log文件中怎么办?

解决:使用additivity属性,将其属性设置为false,则Swift类中的日志不会再输出到DEBUG.log文件中

log4j.logger.SWIFT=DEBUG,SWIFT
log4j.appender.SWIFT=org.apache.log4j.DailyRollingFileAppender
log4j.additivity.SWIFT=false
log4j.appender.SWIFT.File=C:/Logs/SWIFT.log
log4j.appender.SWIFT.DatePattern='.'yyyy-MM-dd
log4j.appender.SWIFT.layout=org.apache.log4j.PatternLayout
log4j.appender.SWIFT.layout.ConversionPattern=[%d] %t %1p %18c{3}(%L):%m %n

 
 

3、看日志的时候,若用ECLIPSE类的开发工具,则发现日志只能到日志文件中看,在开发环境中看不到

解决:只要设置日志输出到控制台即可

log4j.rootLogger=DEBUG,stdout

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%t] %-5p %-20c{2}(%L): - %m %n 

4、一个类中,想要一些日志输出到总日志文件(如DEBUG.log)中,一些日志输出到另外的日志文件中,怎么办?

解决:log4j配置参考1的配置。类中设置两个或多个logger,想要输出到哪里就输出到哪里。

public class Swift extends HttpServlet {
	static Logger logger = Logger.getLogger(SwiftSys.class);
	static Logger log = Logger.getLogger("SWIFT");
    public void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
          logger.debug("输出到总的DEBUG.log文件");
          log.debug("开小灶,这个日志输出到SWIFT.log中");
    }

5、如果想对日志分级怎么办,如错误日志输出到DEBUG.log文件中,错误日志输出到ERROR.log文件中

解决:使用Threshold属性,若输出到DEBUG.log文件中,则属性为DEBUG;若输出到ERROR.log文件中,则属性为ERROR。

下面的例子中logger D为输出DEBUG级别的日志,logger E为输出ERROR级别的日志。

log4j.rootLogger=DEBUG,D,E

log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File=C:/Logs/DEBUG.log
log4j.appender.D.DatePattern='.'yyyy-MM-dd
log4j.appender.D.ImmediateFlush=true
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=[%d] %1p %18c{3}(%L):%m %n

log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File=C:/Logs/ERROR.log
log4j.appender.E.DatePattern='.'yyyy-MM-dd
log4j.appender.E.ImmediateFlush=true
log4j.appender.E.Threshold=ERROR
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern=[%d] %t %5p %18c{3}(%L):%m %n

总结:

一个完整的log4j的配置

log4j.rootLogger=DEBUG,D,E

log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[%t] %-5p %-20c{2}(%L): - %m %n 

log4j.appender.D=org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File=C:/Logs/DEBUG.log
log4j.appender.D.DatePattern='.'yyyy-MM-dd
log4j.appender.D.ImmediateFlush=true
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=[%d] %1p %18c{3}(%L):%m %n

log4j.appender.E=org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File=C:/Logs/ERROR.log
log4j.appender.E.DatePattern='.'yyyy-MM-dd
log4j.appender.E.ImmediateFlush=true
log4j.appender.E.Threshold=ERROR
log4j.appender.E.layout=org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern=[%d] %t %5p %18c{3}(%L):%m %n

log4j.appender.SWIFT=org.apache.log4j.DailyRollingFileAppender
log4j.additivity.SWIFT=false
log4j.appender.SWIFT.File=C:/Logs/SWIFT.log
log4j.appender.SWIFT.DatePattern='.'yyyy-MM-dd
log4j.appender.SWIFT.ImmediateFlush=true
log4j.appender.SWIFT.Threshold=DEBUG
log4j.appender.SWIFT.layout=org.apache.log4j.PatternLayout
log4j.appender.SWIFT.layout.ConversionPattern=[%d] %t %1p %18c{3}(%L):%m %n

日志常用的两种的形式:

1、日期轮回,一天可以输出一个,一个小时输出一个,或一周输出一个等,具体的可以查阅相关资料,不再赘述。

DailyRollingFileAppender
2、大小轮回,设置每个日志文件最大SIZE,总共多少个日志文件,若所有日志都写满,则最后的部分被挤出丢失。

RollingFileAppender

当然还有可以输出到文件,输出到数据表,或者输出到流等。

日志格式的几点说明:

%d 日期

%t 执行线程

%p 日志级别 如DEBUG, INFO, ERROR, FETAL

%c  所在类得包名,例: %18c{3}  18为固定宽度,不够留空,超过则按实际长度输出;3为包的层次,从当前类往上推

%L 日志输出代码所在行号

%m 日志内容

%n 换行符

高级的内容还有根据不同的用户标识来进行输出,每个用户都有对应的日志,因比较复杂,在此不作阐述。



你可能感兴趣的:(log4j 几个技巧)