扩展log4j——自定义日志文件创建方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33222871/article/details/80662662

之前使用过logstash,发现它的文件写入功能比log4j更加完善

logstash允许动态创建文件夹,我只使用了按照日期创建日志文件


如果配置日志路径如下

/home/log/log/%{yyyy}/%{MM}/%{dd}-log.log

那么就会创建路径为/home/log/log/2018/06/12-log.log的文件


log4j有个DailyRollingFileAppender,支持按一定时间规则写入日志,但是创建规则是在原有的日志文件之后加上时间后缀,这样所有日志文件都在一个文件夹,非常不友好


因此,我自定义了appender,允许创建文件夹的方式存储日志文件,每天凌晨写入新的日志文件


内容如下

import org.apache.log4j.spi.LoggingEvent;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author 墨盒
 */
public class EveryDayRollingFileAppender extends FileAppender {

    private SimpleDateFormat format;
    private String fileName;

    private Level level;

    private static final String SEPERTOR = "-";
    private String regex = "\\{([^\\{\\}]+)\\}";//

    private long next;

    private Date now;

    public Level getLevel() {
        return level;
    }

    public void setLevel(Level level) {
        this.level = level;
    }

    public EveryDayRollingFileAppender() {
        now = new Date();
        level = Level.WARN;
    }


    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    //TODO 18-6-16 该方法被调用了两次
    @Override
    public void activateOptions() {
        Pattern pattern = Pattern.compile(regex);


        Matcher matcher = pattern.matcher(fileName);
        StringBuilder builder = new StringBuilder();
        while (matcher.find()) {
            String temp = matcher.group(1);

            builder.append(temp).append(SEPERTOR);

        }
        if (builder.length() != 0) {
            format = new SimpleDateFormat(builder.deleteCharAt(builder.length() - 1).toString());
            changeFile();
            setNextTime();日志采集小工具
        } else {
            format = null;
            try {
                setFile(fileName, getAppend(), getBufferedIO(), getBufferSize());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }

    private void changeFile() {
        if (format != null) {
            try {
                setFile(createFile(), getAppend(), getBufferedIO(), getBufferSize());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    protected void setNextTime() {
        Calendar c = Calendar.getInstance();
        c.setTime(now);
        c.add(Calendar.DAY_OF_YEAR, 1);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.HOUR, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        next = c.getTimeInMillis();

        System.out.println(new Date(next));
    }


    @Override
    protected void subAppend(LoggingEvent event) {
        if (event.getLevel().syslogEquivalent <= level.syslogEquivalent) {
            long n = System.currentTimeMillis();
            if (n >= next) {
                now.setTime(n);

                changeFile();

                setNextTime();


            }
            super.subAppend(event);
        }
    }

    public String createFile() {
        String file = format.format(now);

        String s[] = file.split(SEPERTOR);

        String temp = fileName;
        for (int i = 0; i < s.length; i++) {
            temp = temp.replaceFirst(regex, s[i]);
        }


        File f = new File(temp);
        if (!f.getParentFile().exists())
            f.getParentFile().mkdirs();
        else if (f.exists())
            f.delete();

        return f.getAbsolutePath();

    }
}


log4j配置如下,

log4j.appender.logfile=org.apache.log4j.EveryDayRollingFileAppender
# 需要写入的日志级别
log4j.appender.logfile.level=INFO
# 日志路径
log4j.appender.logfile.fileName=/home/inkbox/log/log/{yyyy}/{MM}/{dd}_logSocket.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%m%n

猜你喜欢

转载自blog.csdn.net/qq_33222871/article/details/80662662