private final Map appenders = new HashMap(); //private final ReadWriteLock R_W_LOCK = new ReentrantReadWriteLock(); private final Layout layout = new PatternLayout("%d: %m%n"); // 存放log日志的根文件夹,根据自己的需要,可以自己进行修改 String baseLogPath = System.getProperty("user.dir");
private String dir = baseLogPath + File.separator + "guojielogs"; //定义了日志文件夹存放的位置 static int dirflg = 0; //判断文件夹是否已经存在的标志 static int infoflag = 0; //判断文件夹是否已经存在的标志 static int errorflag = 0; //判断文件夹是否已经存在的标志 static int warnflag = 0; //判断文件夹是否已经存在的标志 static int debugflag = 0; //判断文件夹是否已经存在的标志 static int console = 0; private int maxBackupIndex = 0; // 设置日志文件的大小 private String maxFileSize = "5MB"; public void setDir(String dir) { this.dir = dir; } public void append(LoggingEvent event) { Level l = event.getLevel(); String key = l.toString(); RollingFileAppender appender; //设置日志的写入模式为RollingFileAppender if (dirflg == 0) { File f1 = new File(dir); if (!f1.exists()) { f1.mkdir(); } dirflg = 1; } //R_W_LOCK.readLock().lock(); try { appender = (RollingFileAppender) appenders.get(key); } finally { //R_W_LOCK.readLock().unlock(); } if (appender == null) { //R_W_LOCK.writeLock().lock(); try { appender = (RollingFileAppender) appenders.get(key); if (appender == null) { try { // 判断日志的级别是否为info if (key.toLowerCase().equals("info")) { String path = ""; //log日志存放的路径 path = dir + File.separator + "info"; if (infoflag == 0) { File f = new File(path); if (!f.exists()) { f.mkdir(); } infoflag = 1; } // System.out.println(path); appender = new RollingFileAppender(layout, new File(path, key.toLowerCase() + ".log") .getPath()); } // 判断日志的级别是否为error if (key.toLowerCase().equals("error")) { // 设置log日志在父目录下的error文件夹中 /*------- * 这里你也可以重定向error日志的输出路径 */ String path = ""; path = dir + File.separator + "error"; if (errorflag == 0) { //System.out.println("检查文件夹是否存在"); File f = new File(path); if (!f.exists()) { f.mkdir(); } errorflag = 1; } // System.out.println(path); appender = new RollingFileAppender(layout, new File(path, key.toLowerCase() + ".log") .getPath()); } // 判断日志的级别是否为warn if (key.toLowerCase().equals("warn")) { // 设置log日志在父目录下的warn文件夹中 /*------- * 这里你也可以重定向warn日志的输出路径 */ String path = ""; path = dir + File.separator + "warn"; if (warnflag == 0) { //System.out.println("检查文件夹是否存在"); File f = new File(path); if (!f.exists()) { f.mkdir(); } warnflag = 1; } // System.out.println(path); appender = new RollingFileAppender(layout, new File(path, key.toLowerCase() + ".log") .getPath()); } // 判断日志的级别是否为debug if (key.toLowerCase().equals("debug")) { // 设置log日志在父目录下的debug文件夹中 /*------- * 这里你也可以重定向debug日志的输出路径 */ String path = ""; path = dir + File.separator + "debug"; if (debugflag == 0) { //System.out.println("检查文件夹是否存在"); File f = new File(path); if (!f.exists()) { f.mkdir(); } debugflag = 1; } appender = new RollingFileAppender(layout, new File(path, key.toLowerCase() + ".log") .getPath()); } appender.setMaxFileSize(this.maxFileSize); //设置文件的大小 appender.setMaxBackupIndex(this.maxBackupIndex); appenders.put(key, appender); } catch (IOException e) { throw new RuntimeException(e); } } } finally { //R_W_LOCK.writeLock().unlock(); } } appender.append(event); } public void setMaxBackupIndex(int maxBackups) { this.maxBackupIndex = maxBackups; } /** * 功能:设置log日志文件的大小 * @param maxFileSize */ public void setMaxFileSize(String maxFileSize) { this.maxFileSize = maxFileSize; } /** * 功能:关闭文件锁 */ public void close() { //R_W_LOCK.readLock().lock(); try { Iterator it = appenders.values().iterator(); while (it.hasNext()) { RollingFileAppender rf = (RollingFileAppender) it.next(); rf.close(); } } finally { //R_W_LOCK.readLock().unlock(); } } public boolean requiresLayout() { return false; } }
package org.apache.log4j;import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map; import org.apache.log4j.spi.LoggingEvent;/**
* 功能:用来设置日志的输出,将不同级别的日志(debug,warn,info,error,cons)输出到不同文件里
* @author sky_ccy
*
*/
public class MultiFileAppender extends AppenderSkeleton {
private final Map appenders = new HashMap(); //private final ReadWriteLock R_W_LOCK = new ReentrantReadWriteLock(); private final Layout layout = new PatternLayout("%d: %m%n"); // 存放log日志的根文件夹,根据自己的需要,可以自己进行修改
String baseLogPath = System.getProperty("user.dir");
private String dir = baseLogPath + File.separator + "guojielogs"; //定义了日志文件夹存放的位置 static int dirflg = 0; //判断文件夹是否已经存在的标志
static int infoflag = 0; //判断文件夹是否已经存在的标志
static int errorflag = 0; //判断文件夹是否已经存在的标志
static int warnflag = 0; //判断文件夹是否已经存在的标志
static int debugflag = 0; //判断文件夹是否已经存在的标志
static int console = 0; private int maxBackupIndex = 0; // 设置日志文件的大小
private String maxFileSize = "5MB"; public void setDir(String dir) {
this.dir = dir; } public void append(LoggingEvent event) {
Level l = event.getLevel();
String key = l.toString();
RollingFileAppender appender; //设置日志的写入模式为RollingFileAppender
if (dirflg == 0) { File f1 = new File(dir);
if (!f1.exists()) {
f1.mkdir();
}
dirflg = 1;
} //R_W_LOCK.readLock().lock();
try {
appender = (RollingFileAppender) appenders.get(key);
} finally {
//R_W_LOCK.readLock().unlock();
}
if (appender == null) {
//R_W_LOCK.writeLock().lock();
try {
appender = (RollingFileAppender) appenders.get(key); if (appender == null) {
try {
// 判断日志的级别是否为info
if (key.toLowerCase().equals("info")) {
String path = ""; //log日志存放的路径 path = dir + File.separator + "info";
if (infoflag == 0) { File f = new File(path);
if (!f.exists()) {
f.mkdir(); }
infoflag = 1;
}
// System.out.println(path);
appender = new RollingFileAppender(layout,
new File(path, key.toLowerCase() + ".log")
.getPath());
} // 判断日志的级别是否为error
if (key.toLowerCase().equals("error")) {
// 设置log日志在父目录下的error文件夹中
/*-------
* 这里你也可以重定向error日志的输出路径
*/
String path = "";
path = dir + File.separator + "error";
if (errorflag == 0) {
//System.out.println("检查文件夹是否存在");
File f = new File(path);
if (!f.exists()) {
f.mkdir(); }
errorflag = 1;
}
// System.out.println(path);
appender = new RollingFileAppender(layout,
new File(path, key.toLowerCase() + ".log")
.getPath());
}
// 判断日志的级别是否为warn
if (key.toLowerCase().equals("warn")) {
// 设置log日志在父目录下的warn文件夹中
/*-------
* 这里你也可以重定向warn日志的输出路径
*/
String path = "";
path = dir + File.separator + "warn";
if (warnflag == 0) {
//System.out.println("检查文件夹是否存在");
File f = new File(path);
if (!f.exists()) {
f.mkdir(); }
warnflag = 1;
} // System.out.println(path);
appender = new RollingFileAppender(layout,
new File(path, key.toLowerCase() + ".log")
.getPath());
}
// 判断日志的级别是否为debug
if (key.toLowerCase().equals("debug")) {
// 设置log日志在父目录下的debug文件夹中
/*-------
* 这里你也可以重定向debug日志的输出路径
*/
String path = "";
path = dir + File.separator + "debug";
if (debugflag == 0) {
//System.out.println("检查文件夹是否存在");
File f = new File(path);
if (!f.exists()) {
f.mkdir(); }
debugflag = 1;
} appender = new RollingFileAppender(layout,
new File(path, key.toLowerCase() + ".log")
.getPath());
}
appender.setMaxFileSize(this.maxFileSize); //设置文件的大小
appender.setMaxBackupIndex(this.maxBackupIndex);
appenders.put(key, appender);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
} finally {
//R_W_LOCK.writeLock().unlock();
}
}
appender.append(event);
} public void setMaxBackupIndex(int maxBackups) {
this.maxBackupIndex = maxBackups;
} /**
* 功能:设置log日志文件的大小
* @param maxFileSize
*/
public void setMaxFileSize(String maxFileSize) {
this.maxFileSize = maxFileSize;
} /**
* 功能:关闭文件锁
*/
public void close() {
//R_W_LOCK.readLock().lock();
try {
Iterator it = appenders.values().iterator();
while (it.hasNext()) {
RollingFileAppender rf = (RollingFileAppender) it.next();
rf.close();
}
} finally {
//R_W_LOCK.readLock().unlock();
}
} public boolean requiresLayout() {
return false;
}
}
log4j.appender.MF=org.apache.log4j.MultiFileAppender //用我自己写的配饰器类来记录日志
log4j.appender.MF.maxBackupIndex=100000
log4j.appender.MF.maxFileSize=1MB
log4j.appender.MF.layout=org.apache.log4j.PatternLayout
log4j.appender.MF.layout.ConversionPattern=[%-5p] %d: %m%n
log4j.appender.MF.dir=D\:\\guojie1\\logs //存放日志的目录,呵呵log4j.rootLogger=debug, MFlog4j.logger.sky_ccy=debug