📄 daterollingfileappender.java
字号:
package lib.commons.logging;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintStream;
import java.io.PrintWriter;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.lang.CharEncoding;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.io.FilenameUtils;
import lib.commons.Utils;
public class DateRollingFileAppender extends LogAppender {
private String fileDirectory, fileNamePattern, fileDateFormat,
fileEncoding;
private boolean flushEveryTime;
private String currentDate, currentFileName;
private Object lockObject = new Object();
private PrintWriter fileWriter = null;
public DateRollingFileAppender(Configuration configuration,
LogLayout logLayout) {
super(configuration, logLayout);
if (null != configuration) {
fileDirectory = configuration.getString("fileDirectory");
fileNamePattern = configuration.getString("fileNamePattern");
fileDateFormat = configuration.getString("fileDateFormat");
fileEncoding = configuration.getString("fileEncoding");
flushEveryTime = configuration.getBoolean("flushEveryTime");
}
}
public String getFileDirectory() {
return null == fileDirectory ? Utils.EMPTY_STRING : fileDirectory;
}
public String getFileNamePattern() {
return fileNamePattern;
}
public String getFileDateFormat() {
return null == fileDateFormat ? "yyyyMMdd" : fileDateFormat;
}
public String getFileEncoding() {
return (CharEncoding.isSupported(fileEncoding) ? fileEncoding
: CharEncoding.UTF_8);
}
public boolean isFlushEveryTime() {
return flushEveryTime;
}
public String getCurrentFileName() {
return currentFileName;
}
public void append(LogInfo logInfo) {
switchFile(logInfo);
synchronized (lockObject) {
if (null == fileWriter) {
if (!(LogFactory.getDfltLogAppender() instanceof DateRollingFileAppender)) {
LogFactory.getDfltLogAppender().append(logInfo);
if (isFlushEveryTime())
LogFactory.getDfltLogAppender().flush();
}
} else {
String message = getLogLayout().formatLogInfo(logInfo);
fileWriter.println(message);
if (isFlushEveryTime())
fileWriter.flush();
}
}
}
public void close() {
if (null != fileWriter) {
synchronized (lockObject) {
if (null != fileWriter) {
fileWriter.flush();
fileWriter.close();
fileWriter = null;
}
}
}
}
public void flush() {
if (null != fileWriter) {
synchronized (lockObject) {
if (null != fileWriter) {
fileWriter.flush();
}
}
}
}
private void switchFile(LogInfo logInfo) {
String fileDate = DateFormatUtils.format(logInfo.getLogDate(),
getFileDateFormat());
if (!fileDate.equals(currentDate)) {
synchronized (lockObject) {
if (null != fileWriter) {
fileWriter.flush();
fileWriter.close();
fileWriter = null;
}
File dir = new File(getFileDirectory());
if (!dir.exists()) {
dir.mkdirs();
}
String fileName = StringUtils.replace(fileNamePattern,
"${date}", fileDate);
String filePath = FilenameUtils.concat(getFileDirectory(),
fileName);
PrintWriter tmpWriter = null;
try {
tmpWriter = new PrintWriter(
new OutputStreamWriter(
new PrintStream(new FileOutputStream(
filePath, true), true),
getFileEncoding()));
fileWriter = tmpWriter;
currentDate = fileDate;
currentFileName = fileName;
} catch (Exception err) {
err.printStackTrace();
if (null != tmpWriter)
tmpWriter.close();
}
}
}
}
public static void main(String[] args) {
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -