log4j 如何输出信息到不同的文件

lovely_autumn 2009-11-09 05:21:32
今天在做项目时候,要用到log4j,我想把等级info输出到info.log的文件中,把等级为error的输出到error.log的文件中。
同时,我只要输出自己想要的东西。比如info:只要输出我想要的东西,而不是把hibernate里底层,包中的也输出来。这样看起来比较吃力。。

请高手指点指点。。。。。。。。。。。。。。。。。。。。。。。
...全文
421 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
铁匠梁 2009-11-09
  • 打赏
  • 举报
回复
找个log4j的配置大全看看,可以实现不同的包路径输出到不同的文件中。
sky_ccy 2009-11-09
  • 打赏
  • 举报
回复
下面是log4j.properties的内容
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, MF

log4j.logger.sky_ccy=debug

sky_ccy 2009-11-09
  • 打赏
  • 举报
回复
以下是源码
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;
}
}
sky_ccy 2009-11-09
  • 打赏
  • 举报
回复
呵呵,,我写过个程序,实现了这个写法

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧