除此之外, 这篇博客: log4j1.2.17的使用与log4j.properties配置详解中的 3、配置日志信息输出目的地(appender) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
###配置日志信息输出目的地Appender及Appender选项
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.target=System.err
Appender主要解决日志输出源的问题,比如日志输出到操作系统的console,日志输出到数据库中,日志输出到socket接口,不过当前用的最多的是将日志输出到磁盘文件中。Appender的实现类很多,如下图所示:
Appender的实现类有十几个,他们有一个共同的抽象父类AppenderSkeleton。Log4j提供输出源实现类常见的有以下几种:
appender类型 | 说明 |
org.apache.log4j.ConsoleAppender
|
将日志输出到控制台
|
org.apache.log4j.FileAppender
|
将日志输出到文件
|
org.apache.log4j.DailyRollingFileAppender
|
每天产生一个日志文件
|
org.apache.log4j.RollingFileAppender
|
文件大小到达指定尺寸时产生一个新的文件
|
org.apache.log4j. WriterAppender
|
将日志信息以流格式发送到任意指定的地方
|
工作中最常用的还是ConsoleAppender、FileAppender、DailyRollingFileAppender和RollingFileAppender这4个。
3.1、AppenderSkeleton.java
AppenderSkeleton是一个抽象类,同时是所有appender类的父类.AppenderSkeleton提供对于过滤器filter的支持,比如能根据日志级别进行过滤.。其里面3个重要的属性是:layout、threshold、errorHandler
//AppenderSkeleton.java 源码中的属性
//日志字符串输出格式化类,比如格式话为字符串就直接调用Object.toString(),或者格式化为json
protected Layout layout;
//appender名称
protected String name;
//日志级别,默认为空
protected Priority threshold;
//默认的异常处理类OnlyOnceErrorHandler
protected ErrorHandler errorHandler = new OnlyOnceErrorHandler();
3.2、WriterAppender.java
WriterAppender.java通过java的IO流操作类(java.io.Writer或者java.io.OutputStream)来分别对字符流和字节流分别进行处理,拥有父类AppenderSkeleton的属性,其里面还有2个重要的属性是:immediateFlush、encoding
//WriterAppender.java 源码中的属性
/**
* IO流是否立即清理写入到磁盘文件,默认为true
* 这个属性控制着java.io.Writer或者java.io.OutputStream是否每次appender执行时候立即写磁盘
*/
protected boolean immediateFlush = true;
/**
* 这个属性控制着java.io.Writer或者java.io.OutputStream的编码类型,默认为null时会读取系统的编码类型
*/
protected String encoding;
3.3、ConsoleAppender.java
ConsoleAppender是往console里丢入日志,ConsoleAppender具体调用的是java的System.out和System.err,默认使用System.out。拥有父类WriterAppender的属性,其里面还有1个重要的属性是:target
//ConsoleAppender.java 源码中的属性
//ConsoleAppender具体调用的是java的System.out和System.err,默认使用System.out
public static final String SYSTEM_OUT = "System.out";
public static final String SYSTEM_ERR = "System.err";
protected String target = SYSTEM_OUT;
3.4、FileAppender.java
FileAppender使用java.io.Writer来讲日志写入到磁盘文件。拥有父类WriterAppender的属性。其里面还有4个重要的属性是:Append、BufferedIO、BufferSize、File
//FileAppender.java 源码中的属性,这个类中的set方法有两个名字比较特殊,与定义名不一样
protected boolean fileAppend = true;//是否在文件末尾追加内容 set方法使用:setAppend
protected String fileName = null;//磁盘文件全路径名称 set方法使用:File
protected boolean bufferedIO = false;//是否启用缓冲区
protected int bufferSize = 8 * 1024;//缓冲区大小
3.5、DailyRollingFileAppender.java
DailyRollingFileAppender仍然使用java.io.Writer来讲日志写入到磁盘文件,不同的是它可以控制按照天存储文件、按照小时存储文件、按照分钟存储文件、按照月份存储文件和按照周存储文件。拥有父类FileAppender的属性。其里面还有1个重要的属性是:datePattern
//DailyRollingFileAppender.java 源码中的属性
private String datePattern = "'.'yyyy-MM-dd"; //按照时间来写日志文件,默认按天
DatePattern | 文件分割规则 | 举例 |
---|
'.'yyyy-MM | 按照月份存储文件 | 在2002年5月31日午夜/foo/bar.log 将被复制到/foo/bar.log2002-05。6月份的日志将输出到/foo/bar.log直到下个月它也被滚动过。 |
'.'yyyy-ww | 按照周存储文件,每周的第一由当前系统的时区决定,比如美国以SUNDAY为一周第一天 | 假设一周的第一天是周日2002年6月9日,周六午夜,文件/foo/bar.log 将被复制到/foo/bar.log2002-23。2002年第24周的日志将输出到/foo/bar.log直到下个星期它被翻转过来。 |
'.'yyyy-MM-dd | 按照天存储文件,每天晚上的12点会变更文件名字 | 午夜,2002年3月8日,/foo/bar.log 将被复制到/foo/bar.log.2002-03-08。3月9日的日志将输出到/foo/bar.log直到第二天它被翻过来。 |
'.'yyyy-MM-dd-a | 按照半天存储文件,中午的12点和晚上的12点时候会变更文件名字 | 2002年3月9日中午/foo/bar.log 将被复制到/foo/bar.log.2002-03-09-am。9号下午的日志将输出到/foo/bar.log直到午夜被翻过来。 |
'.'yyyy-MM-dd-HH | 按照小时存储文件 | 大约在2002年3月9日11点/foo/bar.log 将被复制到/foo/bar.log.2002-03-09-10。3月9日11时的日志将输出到/foo/bar.log直到下一个小时开始的时候,它才被翻过来。 |
'.'yyyy-MM-dd-HH-mm | 按照分钟存储文件 | 大约在2001年3月9日11:23:000/foo/bar.log 将被复制到/foo/bar.log. 2001-03-09-10-22.11:23。(3月9日)的记录将输出到/foo/bar.log直到下一分钟它被翻过来。 |
3.6、RollingFileAppender.java
RollingFileAppender扩展了FileAppender,支持按照文件大小来分割文件。拥有父类FileAppender的属性,其里面还有3个重要的属性是:MaxFileSize、MaximumFileSize、MaxBackupIndex。
需要注意的是MaximumFileSize和MaxFileSize都可以设置最大文件的大小,MaxFileSize可以携带单位KB MB GB,RollingFileAppender会自己解析转换,MaximumFileSize(字节)则直接设置最大文件的大小。
//RollingFileAppender.java 源码中的属性
/**
* 每个文件的最大Bytes大小值,默认10MB
*/
protected long maxFileSize = 10 * 1024 * 1024;
/**
* 默认除了在写的日志文件外,保留最多maxBackupIndex个日志文件,默认最多保留1个文件,外加一个在写的日志文件,总计2个日志文件
*/
protected int maxBackupIndex = 1;