如何使用JDK Logging手动滚动日志文件

我有一个应用程序,它使用JDK Logging和logging.properties文件,该文件通过java.util.logging.FileHandler.count配置一些较旧的日志文件。

在应用程序的某些点,我想触发日志文件的手动翻转,以启动新的日志文件,例如在计划的活动开始之前。

这可能与JDK Logging有关吗?

在Log4j我使用以下,但在这种情况下,我想使用JDK日志记录!

Logger logger = Logger.getRootLogger(); Enumeration appenders = logger.getAllAppenders(); while(appenders.hasMoreElements()) { Object obj = appenders.nextElement(); if(obj instanceof RollingFileAppender) { ((RollingFileAppender)obj).rollOver(); } } 

您必须编写自己的处理程序才能使轮换工作。 像JBoss Log Manager这样的东西可以用于JDK日志记录,只是替换了logmanger部分。 它已经有一些不同的旋转处理程序 。

您可以通过创建一个具有零限制且不附加的丢弃FileHandler来触发旋转。

new FileHandler(pattern, 0, count, false).close();

  1. 删除并关闭现有的FileHandler
  2. 创建并关闭旋转FileHandler。
  3. 使用默认设置创建和添加FileHandler。

否则你可以使用reflection:

  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 } } } 

}