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

解决方案 »

  1.   

    以下是源码
    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;
    }
    }
      

  2.   

    下面是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, MFlog4j.logger.sky_ccy=debug 
      

  3.   

    找个log4j的配置大全看看,可以实现不同的包路径输出到不同的文件中。