我有一个使用JDK日志与配置一些通过java.util.logging.FileHandler.count旧的日志文件的logging.properties文件的应用程序。
在应用程序中的某些点,我想触发日志文件的手动翻转有一个新的日志文件开始,如日程安排的活动开始之前。
这可能与JDK日志?
在Log4j中我使用的是下面,但是在这种情况下,我想使用JDK记录!
Logger logger = Logger.getRootLogger();
Enumeration<Object> appenders = logger.getAllAppenders();
while(appenders.hasMoreElements()) {
Object obj = appenders.nextElement();
if(obj instanceof RollingFileAppender) {
((RollingFileAppender)obj).rollOver();
}
}
你会写自己的处理程序,以获得旋转工作。 喜欢的东西JBoss的日志管理器的工作原理与JDK日志,只是取代了logmanger部分。 它已经有几个不同的旋转处理 。
您可以通过零限制,无追加创建一个扔掉的FileHandler引发旋转。
new FileHandler(pattern, 0, count, false).close();
- 删除并关闭现有的FileHandler
- 创建和关闭旋转的FileHandler。
- 创建并使用默认设置添加您的FileHandler。
否则,你可以诉诸使用反射:
Method m = FileHandler.class.getDeclaredMethod("rotate");
m.setAccessible(true);
if (!Level.OFF.equals(f.getLevel())) { //Assume not closed.
m.invoke(f);
}
RollingFileHandler fileHandler = new RollingFileHandler(path);
fileHandler.setFormatter( newFormatter );
fileHandler.setLevel(level);
logger.addHandler(fileHandler);
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.logging.ErrorManager;
import java.util.logging.LogRecord;
import java.util.logging.StreamHandler;
public class RollingFileHandler extends StreamHandler {
private static String dateFormat = "yyyy-MM-dd"; //default
private String path = null;
// Standard-Log-Puffer (vergrößert sich on Demand)
static ByteArrayOutputStream bas = new ByteArrayOutputStream(1024*200*25);
/**
* Constructor.
*/
public RollingFileHandler() {
super();
setOutputStream(bas);
// Write old data in Multithread-Environment
flush();
}
public RollingFileHandler(String path) {
this.path = path;
}
/**
* Overwrites super.
*/
public synchronized void publish(LogRecord record) {
if (!isLoggable(record)) {
return;
}
super.publish(record);
}
@Override
public synchronized void flush() {
// Puffer ist leer
if (bas.size() == 0) {
return;
}
super.flush();
File file = null;
try {
String dateString = null;
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat, Locale.getDefault());
dateString = sdf.format(new Date());
String fileName = "dummyFile_" + dateString + ".log";
try {
// Auf den Servern mapping, bei lokalem Test am Arbeitsplatz brauche ich kein Logfile-Mapping
boolean windows = System.getProperty("os.name").toLowerCase().indexOf("win") >= 0 ;
if (!windows
&& path != null) {
File unixLogDir = new File(path);
if (unixLogDir.exists()) {
// Versuchen in das neue Directory zu speichern
File logfile = new File (path + "/" + fileName);
if (!logfile.exists()) {
logfile.createNewFile();
}
file = logfile;
}
}
} catch(Exception e) {
e.printStackTrace();
}
if (file == null) {
// Fallback - Umzug hat nicht geklappt
file = new File(fileName);
if (!file.exists()) {
file.createNewFile();
}
}
FileOutputStream fos = new FileOutputStream(file,true);
bas.flush();
bas.writeTo(fos);
bas.reset();
fos.close();
} catch (Exception fnfe) {
reportError(null, fnfe, ErrorManager.GENERIC_FAILURE);
fnfe.printStackTrace(System.err);
setOutputStream(System.out); //fallback stream
try {
bas.writeTo(System.out);
} catch (IOException e) {
// Da kann man nichts machen
}
}
}
}