Log4j之自定义Appender

log4j.properties



log4j.rootLogger=debug,myFileAppender
##自定义的appender
log4j.appender.myFileAppender=myappender.MWLogFileAppender
log4j.appender.myFileAppender.Encoding=utf-8
log4j.appender.myFileAppender.File=c:\\w\\wang-%s_%s_0.%s.log
log4j.appender.myFileAppender.layout=org.apache.log4j.PatternLayout
#每分钟产生一个日志 '.'yyyy-MM-dd-HH-mm'.log'中可以有空格,相应的结果是日志文件名中也有相应的空格,控制之前生成的日志的文件名显示。
log4j.appender.myFileAppender.MaxFileSize=1KB
log4j.appender.myFileAppender.MaxBackupIndex=2
log4j.appender.myFileAppender.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} %m%n


package myappender;
import java.io.File;
import java.io.IOException;
import java.io.InterruptedIOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.log4j.RollingFileAppender;
import org.apache.log4j.helpers.CountingQuietWriter;
import org.apache.log4j.helpers.LogLog;
import org.apache.log4j.spi.LoggingEvent;
/**
 * 自定义 rollingFileppender文件名格式
 * @author abc
 *
 */
public class MWLogFileAppender extends RollingFileAppender {

    private long nextRollover = 0;

    public void rollOver() {
        File target;
        File file;

        if (qw != null) {
            long size = ((CountingQuietWriter) qw).getCount();
            LogLog.debug("rolling over count=" + size);
            // if operation fails, do not roll again until
            // maxFileSize more bytes are written
            nextRollover = size + maxFileSize;
        }
        LogLog.debug("maxBackupIndex=" + maxBackupIndex);

        boolean renameSucceeded = true;
        // If maxBackups <= 0, then there is no file renaming to be done.
        if (maxBackupIndex > 0) {
            // Delete the oldest file, to keep Windows happy.
            //file = new File(fileName + '.' + maxBackupIndex);
            file = new File(getRollingFileName(fileName, maxBackupIndex));
            if (file.exists())
                renameSucceeded = file.delete();

            // Map {(maxBackupIndex - 1), ..., 2, 1} to {maxBackupIndex, ..., 3,
            // 2}
            for (int i = maxBackupIndex - 1; i >= 1 && renameSucceeded; i--) {
                //file = new File(fileName + "." + i);
                file = new File(getRollingFileName(fileName, i));
                if (file.exists()) {
                    //target = new File(fileName + '.' + (i + 1));
                    target = new File(getRollingFileName(fileName, i+1));
                    LogLog.debug("Renaming file " + file + " to " + target);
                    renameSucceeded = file.renameTo(target);
                }
            }

            if (renameSucceeded) {
                // Rename fileName to fileName.1
                //target = new File(fileName + "." + 1);
                target = new File(this.getRollingFileName(fileName, 1));

                this.closeFile(); // keep windows happy.

                file = new File(fileName);
                LogLog.debug("Renaming file " + file + " to " + target);
                renameSucceeded = file.renameTo(target);
                //
                // if file rename failed, reopen file with append = true
                //
                if (!renameSucceeded) {
                    try {
                        this.setFile(fileName, true, bufferedIO, bufferSize);
                    } catch (IOException e) {
                        if (e instanceof InterruptedIOException) {
                            Thread.currentThread().interrupt();
                        }
                        LogLog.error("setFile(" + fileName
                                + ", true) call failed.", e);
                    }
                }
            }
        }

        //
        // if all renames were successful, then
        //
        if (renameSucceeded) {
            try {
                // This will also close the file. This is OK since multiple
                // close operations are safe.
                this.setFile(fileName, false, bufferedIO, bufferSize);
                nextRollover = 0;
            } catch (IOException e) {
                if (e instanceof InterruptedIOException) {
                    Thread.currentThread().interrupt();
                }
                LogLog.error("setFile(" + fileName + ", false) call failed.", e);
            }
        }
    }

    private String getRollingFileName(String fileName, int index) {
        Pattern p = Pattern.compile("_\\d+\\."); 
        Matcher m=p.matcher(fileName);
        
        return m.replaceFirst(String.format("_%d.", index));
    }

    public synchronized void setFile(String fileName, boolean append,
            boolean bufferedIO, int bufferSize) throws IOException {
        String processName = "01";

        SimpleDateFormat format = new SimpleDateFormat("MMddyyyy");
        String dateString = format.format(new Date(System.currentTimeMillis()));

        String processId = String.valueOf(Thread.currentThread().getId());
        String temp = String.format(fileName, processName, dateString,
                processId);
        //System.out.println(temp);
        super.setFile(temp, append, bufferedIO, bufferSize);
    }

    protected void subAppend(LoggingEvent event) {
        super.subAppend(event);
        if (fileName != null && qw != null) {
            long size = ((CountingQuietWriter) qw).getCount();
            if (size >= maxFileSize && size >= nextRollover) {
                rollOver();
            }
        }
    }

}

d

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值