版权声明:本文为博主原创文章,未经博主允许不得转载。 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