72
72
* <strong>LOG_LEVEL_IN_BRACKETS</strong>, <strong>LOG_SHOW_DATE_TIME</strong>,
73
73
* <strong>LOG_SHOW_NAME</strong>, <strong>LOG_SHOW_SHORT_NAME</strong>,
74
74
* <strong>LOG_SHOW_THREAD_ID</strong>, <strong>LOG_SHOW_THREAD_NAME</strong>.
75
- *
75
+ * <p>
76
76
* <strong>Fine-grained configuration with markers</strong>
77
77
* <p>
78
78
* The AWS Lambda Logger supports markers since <em>v2.0.0</em>.
85
85
* The logger for {@code org.test.Class} has the common <em>warn</em> log level.
86
86
* Also, it has additional levels <em>info</em> with the marker <em>iAmMarker</em>
87
87
* 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>
88
102
*/
89
103
public class LambdaLoggerFactory implements ILoggerFactory {
90
104
91
105
private static final String AT = "@" ;
92
- private static final String COLON = ":" ;
93
- private static final String COMMA = "," ;
94
106
private static final String CONFIGURATION_FILE = "lambda-logger.properties" ;
95
107
private static final char DOT = '.' ;
96
108
private static final String DOTS = "\\ .+" ;
@@ -102,6 +114,8 @@ public class LambdaLoggerFactory implements ILoggerFactory {
102
114
private final DateFormat dateTimeFormat ;
103
115
private final List <LoggerLevel > defaultLoggerLevel ;
104
116
private final boolean levelInBrackets ;
117
+ private final String logLevelSeparator ;
118
+ private final String markerSeparator ;
105
119
private final Properties properties ;
106
120
private final String requestId ;
107
121
private final boolean showDateTime ;
@@ -119,6 +133,9 @@ public LambdaLoggerFactory() {
119
133
loggers = new ConcurrentHashMap <>();
120
134
properties = loadProperties (configurationFile );
121
135
dateTimeFormat = getDateTimeFormat (ConfigurationProperty .DateTimeFormat );
136
+ // logLevelSeparator and markerSeparator should be resolved before defaultLoggerLevel
137
+ logLevelSeparator = getStringProperty (ConfigurationProperty .LogLevelSeparator );
138
+ markerSeparator = getStringProperty (ConfigurationProperty .MarkerSeparator );
122
139
defaultLoggerLevel = getLoggerLevelProperty (ConfigurationProperty .DefaultLogLevel );
123
140
levelInBrackets = getBooleanProperty (ConfigurationProperty .LevelInBrackets );
124
141
requestId = getStringProperty (ConfigurationProperty .RequestId );
@@ -272,13 +289,13 @@ private List<LoggerLevel> parseLoggerLevelString(String loggerLevelString)
272
289
throws IllegalArgumentException {
273
290
var loggerLevels = new ArrayList <LoggerLevel >();
274
291
275
- for (String loggerLevel : loggerLevelString .split (COMMA )) {
292
+ for (String loggerLevel : loggerLevelString .split (logLevelSeparator )) {
276
293
var loggerLevelBuilder = LoggerLevel .builder ();
277
294
var loggerLevelWithMarkers = loggerLevel .split (AT );
278
295
279
296
loggerLevelBuilder .level (Level .valueOf (loggerLevelWithMarkers [0 ].toUpperCase ()));
280
297
if (loggerLevelWithMarkers .length > 1 ) {
281
- for (String markerName : loggerLevelWithMarkers [1 ].split (COLON )) {
298
+ for (String markerName : loggerLevelWithMarkers [1 ].split (markerSeparator )) {
282
299
loggerLevelBuilder .marker (markerName );
283
300
}
284
301
}
@@ -292,12 +309,13 @@ public enum ConfigurationProperty {
292
309
293
310
DateTimeFormat ("dateTimeFormat" , "LOG_DATE_TIME_FORMAT" , null ), DefaultLogLevel (
294
311
"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" );
301
319
302
320
public final String defaultValue ;
303
321
public final String propertyName ;
0 commit comments