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中"); }
解决:使用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、日期轮回,一天可以输出一个,一个小时输出一个,或一周输出一个等,具体的可以查阅相关资料,不再赘述。
DailyRollingFileAppender2、大小轮回,设置每个日志文件最大SIZE,总共多少个日志文件,若所有日志都写满,则最后的部分被挤出丢失。
RollingFileAppender
当然还有可以输出到文件,输出到数据表,或者输出到流等。
日志格式的几点说明:
%d 日期
%t 执行线程
%p 日志级别 如DEBUG, INFO, ERROR, FETAL
%c 所在类得包名,例: %18c{3} 18为固定宽度,不够留空,超过则按实际长度输出;3为包的层次,从当前类往上推
%L 日志输出代码所在行号
%m 日志内容
%n 换行符
高级的内容还有根据不同的用户标识来进行输出,每个用户都有对应的日志,因比较复杂,在此不作阐述。