diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/DateFileLogHandler.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/DateFileLogHandler.java index 6d1196587f..347882208b 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/DateFileLogHandler.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/DateFileLogHandler.java @@ -27,7 +27,12 @@ class DateFileLogHandler extends Handler { - private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + private final ThreadLocal dateFormatThreadLocal = new ThreadLocal() { + @Override + public SimpleDateFormat initialValue() { + return new SimpleDateFormat("yyyy-MM-dd"); + } + }; private volatile FileHandler handler; @@ -64,10 +69,13 @@ public void flush() { @Override public void publish(LogRecord record) { - synchronized (monitor) { - if (endDate < record.getMillis() || !logFileExits()) { rotateDate(); } + if (shouldRotate(record)) { + synchronized (monitor) { + if (shouldRotate(record)) { + rotateDate(); + } + } } - if (System.currentTimeMillis() - startDate > 25 * 60 * 60 * 1000) { String msg = record.getMessage(); record.setMessage("missed file rolling at: " + new Date(endDate) + "\n" + msg); @@ -75,6 +83,13 @@ public void publish(LogRecord record) { handler.publish(record); } + private boolean shouldRotate(LogRecord record) { + if (endDate <= record.getMillis() || !logFileExits()) { + return true; + } + return false; + } + @Override public void setFormatter(Formatter newFormatter) { super.setFormatter(newFormatter); @@ -83,7 +98,13 @@ public void setFormatter(Formatter newFormatter) { private boolean logFileExits() { try { - File logFile = new File(pattern); + SimpleDateFormat format = dateFormatThreadLocal.get(); + String fileName = pattern.replace("%d", format.format(new Date())); + // When file count is not 1, the first log file name will end with ".0" + if (count != 1) { + fileName += ".0"; + } + File logFile = new File(fileName); return logFile.exists(); } catch (Throwable e) { @@ -93,7 +114,10 @@ private boolean logFileExits() { private void rotateDate() { this.startDate = System.currentTimeMillis(); - if (handler != null) { handler.close(); } + if (handler != null) { + handler.close(); + } + SimpleDateFormat format = dateFormatThreadLocal.get(); String newPattern = pattern.replace("%d", format.format(new Date())); // Get current date. Calendar next = Calendar.getInstance(); diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/LogBase.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/LogBase.java index 78f2bae125..68ee8137e4 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/LogBase.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/LogBase.java @@ -76,7 +76,7 @@ protected static Handler makeLogger(String logName, Logger heliumRecordLog) { String fileName = LogBase.getLogBaseDir() + logName + ".pid" + PidUtil.getPid(); Handler handler = null; try { - handler = new DateFileLogHandler(fileName + ".%d", 1024 * 1024 * 200, 1, true); + handler = new DateFileLogHandler(fileName + ".%d", 1024 * 1024 * 200, 4, true); handler.setFormatter(formatter); handler.setEncoding(LOG_CHARSET); } catch (IOException e) {