1
1
package dev .dsf .common .logging ;
2
2
3
+ import java .util .Comparator ;
4
+ import java .util .Locale ;
5
+ import java .util .function .Function ;
6
+ import java .util .stream .Stream ;
7
+
3
8
import org .apache .logging .log4j .Level ;
4
9
import org .apache .logging .log4j .core .Appender ;
5
10
import org .apache .logging .log4j .core .LoggerContext ;
@@ -102,27 +107,36 @@ public StringLayout fileLayout(Configuration configuration)
102
107
}
103
108
}
104
109
105
- public Log4jConfiguration (LoggerContext loggerContext , String name , String fileNamePart , Log4jLayout consoleLayout ,
106
- Level consoleLevel , Log4jLayout fileLayout , Level fileLevel )
110
+ public Log4jConfiguration (LoggerContext loggerContext , String name , String fileNamePart ,
111
+ Log4jLayout consoleOutLayout , Level consoleOutLevel , Log4jLayout consoleErrLayout , Level consoleErrLevel ,
112
+ Log4jLayout fileLayout , Level fileLevel )
107
113
{
108
114
super (loggerContext , ConfigurationSource .NULL_SOURCE );
109
115
110
116
if (name != null )
111
117
setName (name );
112
118
113
- addLogger ("dev.dsf" , min (consoleLevel , fileLevel ));
119
+ addLogger ("dev.dsf" , min (consoleOutLevel , consoleErrLevel , fileLevel ));
114
120
addLogger ("org.eclipse.jetty" , Level .INFO );
115
121
addLogger ("ca.uhn.fhir.parser.LenientErrorHandler" , Level .ERROR );
116
122
117
123
LoggerConfig root = getRootLogger ();
118
124
root .setLevel (Level .WARN );
119
125
120
- if (!Level .OFF .equals (consoleLevel ))
126
+ if (!Level .OFF .equals (consoleOutLevel ))
127
+ {
128
+ Appender console = ConsoleAppender .newBuilder ().setName ("CONSOLE.OUT" ).setTarget (Target .SYSTEM_OUT )
129
+ .setLayout (consoleOutLayout .consoleLayout (this )).build ();
130
+ addAppender (console );
131
+ root .addAppender (console , consoleOutLevel , null );
132
+ }
133
+
134
+ if (!Level .OFF .equals (consoleErrLevel ))
121
135
{
122
- Appender console = ConsoleAppender .newBuilder ().setName ("CONSOLE" ).setTarget (Target .SYSTEM_OUT )
123
- .setLayout (consoleLayout .consoleLayout (this )).build ();
136
+ Appender console = ConsoleAppender .newBuilder ().setName ("CONSOLE.ERR " ).setTarget (Target .SYSTEM_ERR )
137
+ .setLayout (consoleErrLayout .consoleLayout (this )).build ();
124
138
addAppender (console );
125
- root .addAppender (console , consoleLevel , null );
139
+ root .addAppender (console , consoleErrLevel , null );
126
140
}
127
141
128
142
if (!Level .OFF .equals (fileLevel ))
@@ -139,26 +153,80 @@ public Log4jConfiguration(LoggerContext loggerContext, String name, String fileN
139
153
}
140
154
}
141
155
142
- private Level min (Level a , Level b )
156
+ private Level min (Level ... levels )
143
157
{
144
- return a . isLessSpecificThan ( b ) ? a : b ;
158
+ return Stream . of ( levels ). sorted ( Comparator . comparing ( Level :: intLevel ). reversed ()). findFirst (). get () ;
145
159
}
146
160
147
161
protected void addLogger (String loggerName , Level level )
148
162
{
149
- addLogger (loggerName , level , null , true );
163
+ LoggerConfig config = new LoggerConfig ();
164
+ config .setLevel (level );
165
+
166
+ addLogger (loggerName , config );
167
+ }
168
+
169
+ protected void addSpecialLogger (String name , String fileNamePart , Function <Configuration , StringLayout > fileLayout ,
170
+ Function <Configuration , StringLayout > outLayout , Function <Configuration , StringLayout > errLayout ,
171
+ Level level )
172
+ {
173
+ String loggerName = "dsf-" + name + "-logger" ;
174
+ String appenderName = name .toUpperCase (Locale .ENGLISH );
175
+ fileNamePart = fileNamePart + "-" + name ;
176
+
177
+ Appender file = createFileAppender (appenderName , fileNamePart , fileLayout .apply (this ));
178
+ Appender out = createConsoleAppender (appenderName , Target .SYSTEM_OUT , outLayout .apply (this ));
179
+ Appender err = createConsoleAppender (appenderName , Target .SYSTEM_ERR , errLayout .apply (this ));
180
+
181
+ LoggerConfig config = new LoggerConfig ();
182
+ config .setLevel (file == null && out == null && err == null ? Level .OFF : level );
183
+ config .setAdditive (false );
184
+
185
+ if (file != null )
186
+ {
187
+ addAppender (file );
188
+ config .addAppender (file , null , null );
189
+ }
190
+ if (out != null )
191
+ {
192
+ addAppender (out );
193
+ config .addAppender (out , null , null );
194
+ }
195
+ if (err != null )
196
+ {
197
+ addAppender (err );
198
+ config .addAppender (err , null , null );
199
+ }
200
+
201
+ addLogger (loggerName , config );
202
+ }
203
+
204
+ private Appender createFileAppender (String appenderName , String fileNamePart , StringLayout layout )
205
+ {
206
+ if (layout == null )
207
+ return null ;
208
+
209
+ return RollingFileAppender .newBuilder ().setName (appenderName + ".FILE" )
210
+ .withFileName ("log/" + fileNamePart + ".log" )
211
+ .withFilePattern ("log/" + fileNamePart + "_%d{yyyy-MM-dd}_%i.log.gz" ).setIgnoreExceptions (false )
212
+ .setLayout (layout )
213
+ .withPolicy (CompositeTriggeringPolicy .createPolicy (OnStartupTriggeringPolicy .createPolicy (1 ),
214
+ TimeBasedTriggeringPolicy .newBuilder ().build ()))
215
+ .build ();
150
216
}
151
217
152
- protected void addLogger (String loggerName , Level level , Appender appender , boolean additive )
218
+ private Appender createConsoleAppender (String appenderName , Target target , StringLayout layout )
153
219
{
154
- LoggerConfig c = new LoggerConfig ();
155
- c .setLevel (level );
156
- c .setAdditive (additive );
220
+ if (layout == null )
221
+ return null ;
157
222
158
- if (appender != null )
159
- c .addAppender (appender , null , null );
223
+ String name = appenderName + "." + switch (target )
224
+ {
225
+ case SYSTEM_OUT -> "OUT" ;
226
+ case SYSTEM_ERR -> "ERR" ;
227
+ };
160
228
161
- addLogger ( loggerName , c );
229
+ return ConsoleAppender . newBuilder (). setName ( name ). setTarget ( target ). setLayout ( layout ). build ( );
162
230
}
163
231
164
232
@ Override
0 commit comments