1. 日志级别
(1) 根类别(在类别层次结构的顶部,即全局性的日志级别)
log4j.rootLogger=[level],[appenderName],[appenderName],...
类别level 为 OFF、FATAL、ERROR、WARN、INFO、DEBUG、log、ALL或自定义的优先级。
log4j常用的优先级FATAL>ERROR>WARN>INFO>DEBUG
举例:
log4j.rootLogger=WARN,则意味着只有WARN,ERROR,FATAL被输出,DEBUG,INFO将被屏蔽掉。
log4j.rootCategory=INFO,stdout,Runlog,Errorlog 根日志类别为INFO,DEBUG将被屏蔽,其他的将被输出。 stdout,Runlog,Errorlog分别为3个输出目的地。
(2) 指定类及包下的日志级别
log4j.logger.[类全路径]=[level],[appenderName],[appenderName],...
2. 配置日志信息输出目的地 log4j.appender.[appenderName]
value值有如下:
org.apache.log4j.ConsoleAppender 控制台
org.apache.log4j.FileAppender 文件
org.apache.log4j.DailyRollingFileAppender 每天产生一个日志文件
org.apache.log4j.RollingFileAppender 文件大小到达指定尺寸的时候产生一个新的文件
org.apache.log4j.WriterAppender 将日志信息以流格式发送到任意指定的地方
org.apache.log4j.net.SMTPAppender 邮件
org.apache.log4j.jdbc.JDBCAppender 数据库
3. 输出日志布局 log4j.appender.[appenderName].layout
value值有如下:
org.apache.log4j.HTMLLayout 以HTML表格形式布局
org.apache.log4j.PatternLayout 可以灵活地指定布局模式
org.apache.log4j.SimpleLayout 包含日志信息的级别和信息字符串
org.apache.log4j.TTCCLayout 包含日志产生的时间、线程、类别等等信息
4. 日志输出格式 log4j.appender.[appenderName].layout.ConversionPattern
value值为: %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
-X号:X信息输出时左对齐;
%p:日志信息级别;
%d{}:日志信息产生时间;
%c:日志信息所在地(类名);
%m:产生的日志具体信息;
%n:输出日志信息换行
5. 输出配置
#在这配全局日志级别和各输出方式的appenderNamelog4j.rootLogger=INFO,CONSOLE,ROLLING_FILE,FILE,MAIL,DATABASE
(1) 控制台输出
#设置控制台输出 log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender #输出模式 System.err/System.out:默认值是System.out。 log4j.appender.CONSOLE.Target=System.out #指定级别 log4j.appender.CONSOLE.Threshold=INFO #指定布局 log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout #指定格式 log4j.appender.CONSOLE.layout.ConversionPattern= %5p %d{yyyy-MM-dd HH:mm:ss} %c %m %n
(2) 输出到文件
#设置日志文件输出 log4j.appender.FILE=org.apache.log4j.FileAppender #指定输出的路径及文件名 log4j.appender.FILE.File=D:/file.log #追加设置 为true重启项目不删除以前日志 log4j.appender.FILE.Append=false #指定级别 log4j.appender.FILE.Threshold=ERROR #布局及输出格式 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.ConversionPattern=[%p] %d - %c -%-4r [%t] %-5p %c %x - %m%n
(3) 输出到文件(设置大小)
#设置输出类型 log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender #指定级别 log4j.appender.ROLLING_FILE.Threshold=INFO #指定输出的路径及文件名 log4j.appender.ROLLING_FILE.File=D:/file1.log #追加设置 为true重启项目不删除以前日志 log4j.appender.ROLLING_FILE.Append=true #指定文件大小 log4j.appender.ROLLING_FILE.MaxFileSize=2KB #指定新建日志文件数量 log4j.appender.ROLLING_FILE.MaxBackupIndex=3 #布局及输出格式 log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout log4j.appender.ROLLING_FILE.layout.ConversionPattern=[%p] %d - %c -%-4r [%t] %-5p %c %x - %m%n
(4) 输出到邮件
#配置输出类型 log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender #配置级别 log4j.appender.MAIL.Threshold=FATAL #配置流大小 log4j.appender.MAIL.BufferSize=10 #设置发件人 log4j.appender.MAIL.From=****@**.com #设置SMTP服务器 log4j.appender.MAIL.SMTPHost=mail.**.com #设置主题 log4j.appender.MAIL.Subject=Log4J Message #设置收件人 log4j.appender.MAIL.To=****@**.com #布局及输出格式 log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
(5) 输出到数据库
#配置输出类型 log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender #设置数据库URL 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=root #设置sql 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
(6) 每天一个日志文件(注:每天一个文件,无法设置文件数,不会清除)
#设置输出类型 log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender #文件输出类型 log4j.appender.logfile.File=test.log #文件名日期格式 log4j.appender.logfile.DataPattern='.'yyyy-MM-dd-HH-mm #设置级别 log4j.appender.logfile.Threshold=debug #设置编码 log4j.appender.logfile.encoding=UTF-8 #是否追加 log4j.appender.logfile.Append=false #布局与格式 log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern= [%d{yyyy-MM-dd HH\:mm\:ss}]%-5p %c(line\:%L) %x-%m%n
(7) 重写FileAppender方法,实现保存天数
package com.example.demo.utils; import java.io.*; import java.text.SimpleDateFormat; import java.util.*; import org.apache.log4j.FileAppender; import org.apache.log4j.Layout; import org.apache.log4j.helpers.LogLog; import org.apache.log4j.spi.LoggingEvent; /** * 扩展的一个按天滚动的appender类, 暂时不支持datePattern设置, 但是可以配置maxBackupIndex * @author Dan Shan */ public class CustomLogAppender extends FileAppender { /** 不允许改写的datepattern */ private static final String datePattern = "'.'yyyy-MM-dd"; /** 最多文件增长个数 */ private int maxBackupIndex = 2; /** 文件名+上次最后更新时间 */ private String scheduledFilename; /** * The next time we estimate a rollover should occur. */ private long nextCheck = System.currentTimeMillis() - 1; Date now = new Date(); SimpleDateFormat sdf; /** * The default constructor does nothing. */ public CustomLogAppender() { } /** * 改造过的构造器 */ public CustomLogAppender(Layout layout, String filename, int maxBackupIndex) throws IOException { super(layout, filename, true); this.maxBackupIndex = maxBackupIndex; activateOptions(); } /** * 初始化本Appender对象的时候调用一次 */ @Override public void activateOptions() { super.activateOptions(); if (fileName != null) { // perf.log now.setTime(System.currentTimeMillis()); sdf = new SimpleDateFormat(datePattern); File file = new File(fileName); // 获取最后更新时间拼成的文件名 scheduledFilename = fileName + sdf.format(new Date(file.lastModified())); } else { LogLog.error("File is not set for appender [" + name + "]."); } if (maxBackupIndex <= 0) { LogLog.error("maxBackupIndex reset to default value[2],orignal value is:" + maxBackupIndex); maxBackupIndex = 2; } } /** * 滚动文件的函数:<br> * 1. 对文件名带的时间戳进行比较, 确定是否更新<br> * 2. if需要更新, 当前文件rename到文件名+日期, 重新开始写文件<br> * 3. 针对配置的maxBackupIndex,删除过期的文件 */ void rollOver() throws IOException { String datedFilename = fileName + sdf.format(now); // 如果上次写的日期跟当前日期相同,不需要换文件 if (scheduledFilename.equals(datedFilename)) { return; } // close current file, and rename it to datedFilename this.closeFile(); File target = new File(scheduledFilename); if (target.exists()) { try { target.delete(); } catch (SecurityException e) { e.printStackTrace(); } } File file = new File(fileName); boolean result = file.renameTo(target); if (result) { LogLog.debug(fileName + " -> " + scheduledFilename); } else { LogLog.error("Failed to rename [" + fileName + "] to [" + scheduledFilename + "]."); } // 删除过期文件 if (maxBackupIndex > 0) { File folder = new File(file.getParent()); List<String> maxBackupIndexDates = getMaxBackupIndexDates(); for (File ff : folder.listFiles()) { // 遍历目录,将日期不在备份范围内的日志删掉 if (ff.getName().startsWith(file.getName()) && !ff.getName().equals(file.getName())) { // 获取文件名带的日期时间戳 String markedDate = ff.getName().substring( file.getName().length()); if (!maxBackupIndexDates.contains(markedDate)) { result = ff.delete(); } if (result) { LogLog.debug(ff.getName() + " -> deleted "); } else { LogLog.error("Failed to deleted old DayRollingFileAppender file :" + ff.getName()); } } } } try { // This will also close the file. This is OK since multiple // close operations are safe. this.setFile(fileName, false, this.bufferedIO, this.bufferSize); } catch (IOException e) { errorHandler.error("setFile(" + fileName + ", false) call failed."); } scheduledFilename = datedFilename; // 更新最后更新日期戳 } /** * Actual writing occurs here. * 这个方法是写操作真正的执行过程. */ @Override protected void subAppend(LoggingEvent event) { long n = System.currentTimeMillis(); if (n >= nextCheck) { // 在每次写操作前判断一下是否需要滚动文件 now.setTime(n); nextCheck = getNextDayCheckPoint(now); try { rollOver(); } catch (IOException ioe) { LogLog.error("rollOver() failed.", ioe); } } super.subAppend(event); } /** * 获取下一天的时间变更点 * @param now * @return */ long getNextDayCheckPoint(Date now) { Calendar calendar = Calendar.getInstance(); calendar.setTime(now); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0);// 注意MILLISECOND,毫秒也要置0.。。否则错了也找不出来的 calendar.add(Calendar.DATE, 1); return calendar.getTimeInMillis(); } /** * 根据maxBackupIndex配置的备份文件个数,获取要保留log文件的日期范围集合 * @return list<'fileName+yyyy-MM-dd'> */ List<String> getMaxBackupIndexDates() { List<String> result = new ArrayList<String>(); if (maxBackupIndex > 0) { for (int i = 1; i <= maxBackupIndex; i++) { Calendar calendar = Calendar.getInstance(); calendar.setTime(now); calendar.set(Calendar.HOUR_OF_DAY, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); // 注意MILLISECOND,毫秒也要置0...否则错了也找不出来的 calendar.add(Calendar.DATE, -i); result.add(sdf.format(calendar.getTime())); } } return result; } public int getMaxBackupIndex() { return maxBackupIndex; } public void setMaxBackupIndex(int maxBackupIndex) { this.maxBackupIndex = maxBackupIndex; } public String getDatePattern() { return datePattern; } }
配置文件修改为
log4j.rootLogger=INFO, A1 log4j.appender.A1=pplive.auth.conf.CustomLogAppender log4j.appender.A1.File=/auth.log # 输出的文件目录 log4j.appender.A1.maxBackupIndex=7 # 保存的天数 log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=%d{HH:mm:ss,SSS} %c{1} %M %m%n
6. 示例
# 根级别 log4j.rootCategory=INFO # 控制其他开源软件包的日志记录 log4j.logger.org.apache.ibatis=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.org.apache.commons=DEBUG # 控制指定包下的日志记录,可使用${...} 引用配置数据 log4j.logger.com.demo= ERROR, ISSUE log4j.appender.ISSUE=org.apache.log4j.RollingFileAppender log4j.appender.ISSUE.File=${user.home}/log/thread_error.log log4j.appender.ISSUE.MaxFileSize=1000KB log4j.appender.ISSUE.MaxBackupIndex=0 log4j.appender.ISSUE.layout=org.apache.log4j.PatternLayout log4j.appender.ISSUE.layout.ConversionPattern=[Demo] %d [%t] %-5p (%c:%L) - %m%n # 控制指定包类的日志记录 log4j.logger.com.demo.DemoService= INFO, DemoService log4j.appender.DemoService=org.apache.log4j.DailyRollingFileAppender log4j.appender.DemoService.File=${user.home}/log/PageManager.log log4j.appender.DemoService.DatePattern = '.'yyyy-MM-dd log4j.appender.DemoService.layout=org.apache.log4j.PatternLayout log4j.appender.DemoService.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %l : %m%n
log4j配置文件详解
最新推荐文章于 2024-05-26 21:08:39 发布