7272 * <strong>LOG_LEVEL_IN_BRACKETS</strong>, <strong>LOG_SHOW_DATE_TIME</strong>,
7373 * <strong>LOG_SHOW_NAME</strong>, <strong>LOG_SHOW_SHORT_NAME</strong>,
7474 * <strong>LOG_SHOW_THREAD_ID</strong>, <strong>LOG_SHOW_THREAD_NAME</strong>.
75- *
75+ * <p>
7676 * <strong>Fine-grained configuration with markers</strong>
7777 * <p>
7878 * The AWS Lambda Logger supports markers since <em>v2.0.0</em>.
8585 * The logger for {@code org.test.Class} has the common <em>warn</em> log level.
8686 * Also, it has additional levels <em>info</em> with the marker <em>iAmMarker</em>
8787 * and <em>trace</em> with markers <em>important</em> and <em>notify-admin</em>.
88+ * <p>
89+ * You can customize level and marker separators with properties <strong>logLevelSeparator</strong>
90+ * and <strong>markerSeparator</strong>. Remember that separators are not a single characters but
91+ * regular expressions. The environment variables are <strong>LOG_LEVEL_SEPARATOR</strong> and
92+ * <strong>LOG_MARKER_SEPARATOR</strong> accordingly.
93+ * <p>
94+ * Example:
95+ * <pre><code class="language-properties">
96+ * log.org.test.Class=warn info@iAmMarker trace@important|notify-admin
97+ * # multi-space
98+ * logLevelSeparator=\\s+
99+ * # single pipe symbol
100+ * markerSeparator=\\|
101+ * </code></pre>
88102 */
89103public class LambdaLoggerFactory implements ILoggerFactory {
90104
91105 private static final String AT = "@" ;
92- private static final String COLON = ":" ;
93- private static final String COMMA = "," ;
94106 private static final String CONFIGURATION_FILE = "lambda-logger.properties" ;
95107 private static final char DOT = '.' ;
96108 private static final String DOTS = "\\ .+" ;
@@ -102,6 +114,8 @@ public class LambdaLoggerFactory implements ILoggerFactory {
102114 private final DateFormat dateTimeFormat ;
103115 private final List <LoggerLevel > defaultLoggerLevel ;
104116 private final boolean levelInBrackets ;
117+ private final String logLevelSeparator ;
118+ private final String markerSeparator ;
105119 private final Properties properties ;
106120 private final String requestId ;
107121 private final boolean showDateTime ;
@@ -119,6 +133,9 @@ public LambdaLoggerFactory() {
119133 loggers = new ConcurrentHashMap <>();
120134 properties = loadProperties (configurationFile );
121135 dateTimeFormat = getDateTimeFormat (ConfigurationProperty .DateTimeFormat );
136+ // logLevelSeparator and markerSeparator should be resolved before defaultLoggerLevel
137+ logLevelSeparator = getStringProperty (ConfigurationProperty .LogLevelSeparator );
138+ markerSeparator = getStringProperty (ConfigurationProperty .MarkerSeparator );
122139 defaultLoggerLevel = getLoggerLevelProperty (ConfigurationProperty .DefaultLogLevel );
123140 levelInBrackets = getBooleanProperty (ConfigurationProperty .LevelInBrackets );
124141 requestId = getStringProperty (ConfigurationProperty .RequestId );
@@ -272,13 +289,13 @@ private List<LoggerLevel> parseLoggerLevelString(String loggerLevelString)
272289 throws IllegalArgumentException {
273290 var loggerLevels = new ArrayList <LoggerLevel >();
274291
275- for (String loggerLevel : loggerLevelString .split (COMMA )) {
292+ for (String loggerLevel : loggerLevelString .split (logLevelSeparator )) {
276293 var loggerLevelBuilder = LoggerLevel .builder ();
277294 var loggerLevelWithMarkers = loggerLevel .split (AT );
278295
279296 loggerLevelBuilder .level (Level .valueOf (loggerLevelWithMarkers [0 ].toUpperCase ()));
280297 if (loggerLevelWithMarkers .length > 1 ) {
281- for (String markerName : loggerLevelWithMarkers [1 ].split (COLON )) {
298+ for (String markerName : loggerLevelWithMarkers [1 ].split (markerSeparator )) {
282299 loggerLevelBuilder .marker (markerName );
283300 }
284301 }
@@ -292,12 +309,13 @@ public enum ConfigurationProperty {
292309
293310 DateTimeFormat ("dateTimeFormat" , "LOG_DATE_TIME_FORMAT" , null ), DefaultLogLevel (
294311 "defaultLogLevel" , "LOG_DEFAULT_LEVEL" , "INFO" ), LevelInBrackets ("levelInBrackets" ,
295- "LOG_LEVEL_IN_BRACKETS" , "false" ), LogLevel ("log." , "LOG_" , null ), RequestId ("requestId" ,
296- "LOG_AWS_REQUEST_ID" , "AWS_REQUEST_ID" ), ShowDateTime ("showDateTime" , "LOG_SHOW_DATE_TIME" ,
297- "false" ), ShowLogName ("showLogName" , "LOG_SHOW_NAME" , "true" ), ShowShortLogName (
298- "showShortLogName" , "LOG_SHOW_SHORT_NAME" , "false" ), ShowThreadId ("showThreadId" ,
299- "LOG_SHOW_THREAD_ID" , "false" ), ShowThreadName ("showThreadName" , "LOG_SHOW_THREAD_NAME" ,
300- "false" );
312+ "LOG_LEVEL_IN_BRACKETS" , "false" ), LogLevel ("log." , "LOG_" , null ), LogLevelSeparator (
313+ "logLevelSeparator" , "LOG_LEVEL_SEPARATOR" , "," ), MarkerSeparator ("markerSeparator" ,
314+ "LOG_MARKER_SEPARATOR" , ":" ), RequestId ("requestId" , "LOG_AWS_REQUEST_ID" ,
315+ "AWS_REQUEST_ID" ), ShowDateTime ("showDateTime" , "LOG_SHOW_DATE_TIME" , "false" ), ShowLogName (
316+ "showLogName" , "LOG_SHOW_NAME" , "true" ), ShowShortLogName ("showShortLogName" ,
317+ "LOG_SHOW_SHORT_NAME" , "false" ), ShowThreadId ("showThreadId" , "LOG_SHOW_THREAD_ID" ,
318+ "false" ), ShowThreadName ("showThreadName" , "LOG_SHOW_THREAD_NAME" , "false" );
301319
302320 public final String defaultValue ;
303321 public final String propertyName ;
0 commit comments