diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/CommandCenterLog.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/CommandCenterLog.java index 9ec3c1fb..d12624a3 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/CommandCenterLog.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/CommandCenterLog.java @@ -25,7 +25,7 @@ import java.util.logging.Logger; public class CommandCenterLog extends LogBase { private static final Logger heliumRecordLog = Logger.getLogger("cspCommandCenterLog"); - private static final String FILE_NAME = "commandCenter.log"; + private static final String FILE_NAME = "command-center.log"; private static Handler logHandler = null; static { 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 c3736eab..afa9d977 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 @@ -24,7 +24,10 @@ import java.util.logging.Logger; import com.alibaba.csp.sentinel.util.PidUtil; /** - * Default log base dir is ${user.home}, we can use {@link #LOG_DIR} System property to override it. + * Default log base dir is ${user.home}/logs/csp/, we can use {@link #LOG_DIR} System property to override it. + * Default log file name dose not contain pid, but if multi instances of the same app are running in the same + * machine, we may want to distinguish the log file by pid number, in this case, {@link #LOG_NAME_USE_PID} + * System property could be configured as "true" to turn on this switch. * * @author leyou */ @@ -33,9 +36,21 @@ public class LogBase { private static final String DIR_NAME = "logs" + File.separator + "csp"; private static final String USER_HOME = "user.home"; public static final String LOG_DIR = "csp.sentinel.log.dir"; + public static final String LOG_NAME_USE_PID = "csp.sentinel.log.use.pid"; + private static boolean logNameUsePid = false; + private static String logBaseDir; static { + try { + init(); + } catch (Throwable t) { + t.printStackTrace(); + System.exit(-1); + } + } + + private static void init() { // first use -D, then use user home. String logDir = System.getProperty(LOG_DIR); @@ -53,6 +68,19 @@ public class LogBase { // logBaseDir must end with File.separator logBaseDir = logDir; System.out.println("INFO: log base dir is: " + logBaseDir); + + String usePid = System.getProperty(LOG_NAME_USE_PID, ""); + logNameUsePid = "true".equalsIgnoreCase(usePid); + System.out.println("INFO: log name use pid is: " + logNameUsePid); + } + + /** + * Whether log file name should contain pid. This switch is configured by {@link #LOG_NAME_USE_PID} System property. + * + * @return if log file name should contain pid, return true, otherwise return false. + */ + public static boolean isLogNameUsePid() { + return logNameUsePid; } private static String addSeparator(String logDir) { @@ -61,7 +89,7 @@ public class LogBase { } return logDir; } - + protected static void log(Logger logger, Handler handler, Level level, String detail, Object... params) { if (detail == null) { return; @@ -73,7 +101,7 @@ public class LogBase { logger.log(level, detail, params); } } - + protected static void log(Logger logger, Handler handler, Level level, String detail, Throwable throwable) { if (detail == null) { return; @@ -93,7 +121,10 @@ public class LogBase { protected static Handler makeLogger(String logName, Logger heliumRecordLog) { CspFormatter formatter = new CspFormatter(); - String fileName = LogBase.getLogBaseDir() + logName + ".pid" + PidUtil.getPid(); + String fileName = LogBase.getLogBaseDir() + logName; + if (isLogNameUsePid()) { + fileName += ".pid" + PidUtil.getPid(); + } Handler handler = null; try { handler = new DateFileLogHandler(fileName + ".%d", 1024 * 1024 * 200, 4, true); diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/RecordLog.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/RecordLog.java index 5ba3e979..a73b56b2 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/RecordLog.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/log/RecordLog.java @@ -25,14 +25,14 @@ import java.util.logging.Logger; * @author youji.zj */ public class RecordLog extends LogBase { - private static final Logger heliumRecordLog = Logger.getLogger("cspRecordLog"); - private static final String FILE_NAME = "record.log"; + private static final Logger heliumRecordLog = Logger.getLogger("cspSentinelRecordLog"); + private static final String FILE_NAME = "sentinel-record.log"; private static Handler logHandler = null; static { logHandler = makeLogger(FILE_NAME, heliumRecordLog); } - + public static void info(String detail, Object... params) { log(heliumRecordLog, logHandler, Level.INFO, detail, params); } diff --git a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/metric/MetricWriter.java b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/metric/MetricWriter.java index 7cd6f735..349ca528 100755 --- a/sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/metric/MetricWriter.java +++ b/sentinel-core/src/main/java/com/alibaba/csp/sentinel/node/metric/MetricWriter.java @@ -27,6 +27,7 @@ import java.util.Comparator; import java.util.Date; import java.util.List; +import com.alibaba.csp.sentinel.log.LogBase; import com.alibaba.csp.sentinel.util.PidUtil; import com.alibaba.csp.sentinel.config.SentinelConfig; import com.alibaba.csp.sentinel.log.RecordLog; @@ -36,7 +37,7 @@ import com.alibaba.csp.sentinel.log.RecordLog; *
    *
  1. metric with the same second should write to the same file;
  2. *
  3. single file size must be controlled;
  4. - *
  5. file name is like: {@code ${AppName}_pid-metrics.log.yyyy-MM-dd.[number]}
  6. + *
  7. file name is like: {@code ${appName}-metrics.log.pid${pid}.yyyy-MM-dd.[number]}
  8. *
  9. metric of different day should in different file;
  10. *
  11. every metric file is accompanied with an index file, which file name is {@code ${metricFileName}.idx}
  12. *
@@ -47,16 +48,21 @@ public class MetricWriter { private static final String CHARSET = SentinelConfig.charset(); public static final String METRIC_BASE_DIR = RecordLog.getLogBaseDir(); - public static final String METRIC_FILE_SUFFIX = "-metrics.log"; + /** + * Note: {@link MetricFileNameComparator}'s implementation relays on the metric file name, + * we should be careful when changing the metric file name. + * + * @see #formMetricFileName(String, int) + */ + public static final String METRIC_FILE = "metrics.log"; public static final String METRIC_FILE_INDEX_SUFFIX = ".idx"; - public static final Comparator METRIC_FILENAME_CMP = new MetricFileNameComparator(); + public static final Comparator METRIC_FILE_NAME_CMP = new MetricFileNameComparator(); private final DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** * 排除时差干扰 */ private long timeSecondBase; - private final StringBuilder sb = new StringBuilder(32); private String baseDir; private String baseFileName; /** @@ -86,7 +92,9 @@ public class MetricWriter { if (singleFileSize <= 0 || totalFileCount <= 0) { throw new IllegalArgumentException(); } - RecordLog.info("[MetricWriter] Creating new MetricWriter, singleFileSize=" + singleFileSize + ", totalFileCount=" + totalFileCount); + RecordLog.info( + "[MetricWriter] Creating new MetricWriter, singleFileSize=" + singleFileSize + ", totalFileCount=" + + totalFileCount); this.baseDir = METRIC_BASE_DIR; File dir = new File(baseDir); if (!dir.exists()) { @@ -193,7 +201,7 @@ public class MetricWriter { list.add(file.getAbsolutePath()); } } - Collections.sort(list, METRIC_FILENAME_CMP); + Collections.sort(list, METRIC_FILE_NAME_CMP); if (list.isEmpty()) { return baseDir + baseFileName + "." + dateStr; } @@ -209,30 +217,38 @@ public class MetricWriter { /** * A comparator for metric file name. Metric file name is like:
*
-     * aliswitch-8728-metrics.log.2018-03-06
-     * aliswitch-8728-metrics.log.2018-03-07
-     * aliswitch-8728-metrics.log.2018-03-07.10
-     * aliswitch-8728-metrics.log.2018-03-06.100
+     * metrics.log.2018-03-06
+     * metrics.log.2018-03-07
+     * metrics.log.2018-03-07.10
+     * metrics.log.2018-03-06.100
      * 
*

* File name with the early date is smaller, if date is same, the one with the small file number is smaller. * Note that if the name is an absolute path, only the fileName({@link File#getName()}) part will be considered. * So the above file names should be sorted as:
*

-     * aliswitch-8728-metrics.log.2018-03-06
-     * aliswitch-8728-metrics.log.2018-03-06.100
-     * aliswitch-8728-metrics.log.2018-03-07
-     * aliswitch-8728-metrics.log.2018-03-07.10
+     * metrics.log.2018-03-06
+     * metrics.log.2018-03-06.100
+     * metrics.log.2018-03-07
+     * metrics.log.2018-03-07.10
+     *
      * 
*

*/ private static final class MetricFileNameComparator implements Comparator { + private final String pid = "pid"; + @Override public int compare(String o1, String o2) { String name1 = new File(o1).getName(); String name2 = new File(o2).getName(); String dateStr1 = name1.split("\\.")[2]; String dateStr2 = name2.split("\\.")[2]; + // in case of file name contains pid, skip it + if (dateStr1.startsWith(pid)) { + dateStr1 = name1.split("\\.")[3]; + dateStr2 = name2.split("\\.")[3]; + } // compare date first int t = dateStr1.compareTo(dateStr2); @@ -273,7 +289,7 @@ public class MetricWriter { list.add(file.getAbsolutePath()); } } - Collections.sort(list, MetricWriter.METRIC_FILENAME_CMP); + Collections.sort(list, MetricWriter.METRIC_FILE_NAME_CMP); return list; } @@ -323,9 +339,12 @@ public class MetricWriter { } /** - * Form metric file name use the specific appName and pid. Not that only + * Form metric file name use the specific appName and pid. Note that only * form the file name, not include path. * + * Note: {@link MetricFileNameComparator}'s implementation relays on the metric file name, + * we should be careful when changing the metric file name. + * * @param appName * @param pid * @return metric file name. @@ -334,7 +353,17 @@ public class MetricWriter { if (appName == null) { appName = ""; } - return appName + "-" + pid + METRIC_FILE_SUFFIX; + // dot is special char that should be replaced. + final String dot = "."; + final String separator = "-"; + if (appName.contains(dot)) { + appName = appName.replace(dot, separator); + } + String name = appName + separator + METRIC_FILE; + if (LogBase.isLogNameUsePid()) { + name += ".pid" + pid; + } + return name; } /** diff --git a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/RecordLogTest.java b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/RecordLogTest.java index 9652f217..e2e4bd99 100755 --- a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/RecordLogTest.java +++ b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/RecordLogTest.java @@ -19,6 +19,7 @@ import java.io.File; import com.alibaba.csp.sentinel.log.LogBase; import com.alibaba.csp.sentinel.log.RecordLog; +import com.alibaba.csp.sentinel.util.PidUtil; import org.junit.Test; @@ -61,4 +62,30 @@ public class RecordLogTest { assertTrue(RecordLog.getLogBaseDir().startsWith(System.getProperty("user.home"))); } + public void testLogNameNotUsePid() { + String userHome = System.getProperty("user.home"); + String newLogBase = userHome + File.separator + "tmpLogDir" + System.currentTimeMillis(); + System.setProperty(LogBase.LOG_DIR, newLogBase); + RecordLog.info("testLogNameNotUsePid"); + File[] files = new File(newLogBase).listFiles(); + assertTrue(files != null && files.length > 0); + for (File f : files) { + assertTrue(!f.getName().contains("pid" + PidUtil.getPid())); + } + } + + public void testLogNameUsePid() { + String userHome = System.getProperty("user.home"); + String newLogBase = userHome + File.separator + "tmpLogDir" + System.currentTimeMillis(); + System.setProperty(LogBase.LOG_DIR, newLogBase); + System.setProperty(LogBase.LOG_NAME_USE_PID, "true"); + + RecordLog.info("testLogNameUsePid"); + File[] files = new File(newLogBase).listFiles(); + assertTrue(files != null && files.length > 0); + for (File f : files) { + assertTrue(f.getName().contains("pid" + PidUtil.getPid())); + } + } + } \ No newline at end of file diff --git a/sentinel-core/src/test/java/com/alibaba/csp/sentinel/node/metric/MetricWriterTest.java b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/node/metric/MetricWriterTest.java new file mode 100644 index 00000000..548a106a --- /dev/null +++ b/sentinel-core/src/test/java/com/alibaba/csp/sentinel/node/metric/MetricWriterTest.java @@ -0,0 +1,54 @@ +package com.alibaba.csp.sentinel.node.metric; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; + +import org.junit.Test; + +import static org.junit.Assert.*; + +public class MetricWriterTest { + @Test + public void testFileNameCmp() { + String[] arr = new String[] { + "metrics.log.2018-03-06", + "metrics.log.2018-03-07", + "metrics.log.2018-03-07.51", + "metrics.log.2018-03-07.10", + "metrics.log.2018-03-06.100" + }; + String[] key = new String[] { + "metrics.log.2018-03-06", + "metrics.log.2018-03-06.100", + "metrics.log.2018-03-07", + "metrics.log.2018-03-07.10", + "metrics.log.2018-03-07.51" + }; + ArrayList list = new ArrayList(Arrays.asList(arr)); + Collections.sort(list, MetricWriter.METRIC_FILE_NAME_CMP); + assertEquals(Arrays.asList(key), list); + } + + @Test + public void testFileNamePidCmp() { + String[] arr = new String[] { + "metrics.log.pid1234.2018-03-06", + "metrics.log.pid1234.2018-03-07", + "metrics.log.pid1234.2018-03-07.51", + "metrics.log.pid1234.2018-03-07.10", + "metrics.log.pid1234.2018-03-06.100" + }; + String[] key = new String[] { + "metrics.log.pid1234.2018-03-06", + "metrics.log.pid1234.2018-03-06.100", + "metrics.log.pid1234.2018-03-07", + "metrics.log.pid1234.2018-03-07.10", + "metrics.log.pid1234.2018-03-07.51" + }; + ArrayList list = new ArrayList(Arrays.asList(arr)); + Collections.sort(list, MetricWriter.METRIC_FILE_NAME_CMP); + assertEquals(Arrays.asList(key), list); + } + +} \ No newline at end of file