一.项目导入log4j.jar包
二.在项目src下添加log4j.properties配置文件
log4j.properties基本格式如下:
log4j.rootLogger=[level①],appenderName,appenderName2
log4j.appender.appenderName=?②
log4j.appender.appenderName.layout=?③
log4j.appender.appenderName.layout.ConversionPattern=?④
①:日志记录的优先级,共有五种从高到低为
log.fatal("致命");//FATAL
log.error("错误");//ERROR
log.warn("警告");//WARN
log.info("信息");//INFO
log.debug("调试");//DEBUG
log.trace("跟踪");//TRACE
②:日志输出地点,Log4j提供了以下几种
org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
注如果输出地点为:
org.apache.log4j.ConsoleAppender需在②下面添加一行代码
log4j.appender.one.Target = System.out
org.apache.log4j.FileAppender需在②下面添加二行代码
log4j.appender.one.File=文件地址
log4j.appender.D.Append = true (true添加日志, false重写日志)
org.apache.log4j.DailyRollingFileAppender需在②下面添加一行代码
log4j.appender.zhangsanLog.DatePattern = 日志文件生成的间隔
日志文件生成的间隔
’.’yyyy-MM: 每月
’.’yyyy-ww: 每周
’.’yyyy-MM-dd: 每天
’.’yyyy-MM-dd-a: 每天两次
’.’yyyy-MM-dd-HH: 每小时
’.’yyyy-MM-dd-HH-mm: 每分钟
org.apache.log4j.RollingFileAppender需在②下面添加二行代码
log4j.appender.zhangsanLog.MaxFileSize = 2KB (当日志文件大于2KB时新建日志文件)
log4j.appender.zhangsanLog.MaxBackupIndex = 5 (最大日志文件数)
③:日志输出格式,Log4j提供了以下几种
org.apache.log4j.HTMLLayout (以HTML表格形式布局)
org.apache.log4j.PatternLayout (可以灵活地指定布局模式)
org.apache.log4j.SimpleLayout (包含日志信息的级别和信息字符串)
org.apache.log4j.TTCCLayout (包含日志产生的时间、线程、类别等等信息)
④:日志打印参数,如下
%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},输出类似:2002年10月18日 22:10:28
%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java: 10 )
三.使用log4j 例:
Logger logger = Logger.getLogger(Package.class);
logger.debug("This is debug.");
logger.info("This is info.");
logger.warn("This is warn.");
logger.error("This is error.");
logger.fatal("This is fatal.");
四.log4j.properties配置文件实例
log4j.rootLogger=debug,one,two
log4j.appender.one=org.apache.log4j.ConsoleAppender
log4j.appender.one.Target =System.out
log4j.appender.one.layout=org.apache.log4j.PatternLayout
log4j.appender.one.layout.ConversionPattern=%d{yyyy MM dd HH:mm:ss}%m
log4j.appender.two=org.apache.log4j.FileAppender
log4j.appender.two.File=d:log4jTest.txt
log4j.appender.two.Append=true
log4j.appender.two.Threshold=INFO /*输出INFO级别及以上的日志*/
log4j.appender.two.layout=org.apache.log4j.PatternLayout
log4j.appender.two.layout.ConversionPattern=%d{yyyy MM dd HH:mm:ss}%m
五.log4j多线程管理多日志文件
首先根据需求,可以很明确的得出多日志文件说明日志的输出地点不同,而前文总结出日志输出地点只有5个:
org.apache.log4j.ConsoleAppender (控制台)
org.apache.log4j.FileAppender (文件)
org.apache.log4j.DailyRollingFileAppender (每天产生一个日志文件)
org.apache.log4j.RollingFileAppender (文件大小到达指定尺寸的时候产生一个新的文件)
org.apache.log4j.WriterAppender (将日志信息以流格式发送到任意指定的地方)
而这5类都隐式实现了org.apache.log4j.Appender接口
当要使用log4j打印日志时要实例化Logger类,而查看源码可以发现这个类中含有一个addAppender(Appender newAppender)方法。至此可以很容易理解log4j后台工作了,当我们配置好log4j.properties文件后,实例化Logger类时后台会解析log4j.properties文件,把该文件中的数据解析成日志输出类(ConsoleAppender、FileAppender、DailyRollingFileAppender、RollingFileAppender、WriterAppender)。使用addAppender(Appender newAppender)添加到Logger类实例中,最后根据日志输出优先级、输出地点、输出格式、打印参数等配置来实现日志记录
理解了log4j后台工作后,写个实例实践一下(这里只用DailyRollingFileAppender类测试,其它类雷同)
public static void main(String[] args) throws InterruptedException {
for(int x = 0; x < 5; x++){
Thread my = new Thread(new MyThread());
my.start();
}
}
class MyThread implements Runnable{
public void run() {
Logger log = Logger.getLogger(test2.class);
try {
DailyRollingFileAppender tfa = new DailyRollingFileAppender(new PatternLayout("%d{yyyy MM dd HH:mm:ss}%m"),
Thread.currentThread() + "测试.txt", "'.'yyyy-MM-dd");
tfa.setThreshold(Level.INFO);
log.addAppender(tfa);
} catch (IOException e) {
e.printStackTrace();
}
log.debug(Thread.currentThread().getName()+" -----debug\n");
log.info(Thread.currentThread().getName()+" -----info\n");
}
}
上面代码功能想来不难理解,但要注意因为我们使用getLogger方法实例化了Logger类,所有如果你配置了log4j.properties文件,Logger实体类中会包含log4j.properties文件配置的输出类。使用Logger类构造方法实例化没有用过,自动跳过!!!