1919 */
2020package org .openscience .cdk .tools ;
2121
22+ import org .apache .logging .log4j .Level ;
23+ import org .apache .logging .log4j .LogManager ;
24+ import org .apache .logging .log4j .Logger ;
25+ import org .apache .logging .log4j .core .LoggerContext ;
26+ import org .apache .logging .log4j .core .config .ConfigurationSource ;
27+ import org .apache .logging .log4j .core .config .Configurator ;
28+ import org .apache .logging .log4j .core .config .xml .XmlConfiguration ;
29+ import org .apache .logging .log4j .internal .LogManagerStatus ;
30+
2231import java .io .BufferedReader ;
32+ import java .io .InputStream ;
2333import java .io .PrintWriter ;
2434import java .io .StringReader ;
25-
26- import org . apache . log4j . Level ;
27- import org . apache . log4j . Logger ;
35+ import java . net . URI ;
36+ import java . util . HashMap ;
37+ import java . util . Map ;
2838
2939/**
3040 * Useful for logging messages. Often used as a class static variable instantiated like:
@@ -88,7 +98,7 @@ public class LoggingTool implements ILoggingTool {
8898
8999 private boolean toSTDOUT = false ;
90100
91- private Logger log4jLogger ;
101+ private Logger log4jLogger ;
92102 private static ILoggingTool logger ;
93103 private String classname ;
94104
@@ -97,6 +107,19 @@ public class LoggingTool implements ILoggingTool {
97107 /** Default number of StackTraceElements to be printed by debug(Exception). */
98108 public final int DEFAULT_STACK_LENGTH = 5 ;
99109
110+ /** Log4J2 has customer levels and no longer has "TRACE_INT" etc so we can't know the values at compile
111+ * time and therefore it's not possible use a switch. */
112+ private static final Map <Level , Integer > LOG4J2_LEVEL_TO_CDK_LEVEL = new HashMap <>();
113+
114+ static {
115+ LOG4J2_LEVEL_TO_CDK_LEVEL .put (Level .TRACE , TRACE );
116+ LOG4J2_LEVEL_TO_CDK_LEVEL .put (Level .DEBUG , DEBUG );
117+ LOG4J2_LEVEL_TO_CDK_LEVEL .put (Level .INFO , INFO );
118+ LOG4J2_LEVEL_TO_CDK_LEVEL .put (Level .WARN , WARN );
119+ LOG4J2_LEVEL_TO_CDK_LEVEL .put (Level .ERROR , ERROR );
120+ LOG4J2_LEVEL_TO_CDK_LEVEL .put (Level .FATAL , FATAL );
121+ }
122+
100123 /**
101124 * Constructs a LoggingTool which produces log lines without any special
102125 * indication which class the message originates from.
@@ -126,7 +149,7 @@ public LoggingTool(Class<?> classInst) {
126149 stackLength = DEFAULT_STACK_LENGTH ;
127150 this .classname = classInst .getName ();
128151 try {
129- log4jLogger = Logger .getLogger (classname );
152+ log4jLogger = LogManager .getLogger (classname );
130153 } catch (NoClassDefFoundError e ) {
131154 toSTDOUT = true ;
132155 logger .debug ("Log4J class not found!" );
@@ -149,9 +172,9 @@ public LoggingTool(Class<?> classInst) {
149172 // by default debugging is set off, but it can be turned on
150173 // with starting java like "java -Dcdk.debugging=true"
151174 if (System .getProperty ("cdk.debugging" , "false" ).equals ("true" )) {
152- log4jLogger .setLevel (Level .DEBUG );
175+ Configurator .setLevel (log4jLogger . getName (), Level .DEBUG );
153176 } else {
154- log4jLogger .setLevel (Level .WARN );
177+ Configurator .setLevel (log4jLogger . getName (), Level .WARN );
155178 }
156179 if (System .getProperty ("cdk.debug.stdout" , "false" ).equals ("true" )) {
157180 toSTDOUT = true ;
@@ -170,13 +193,20 @@ public LoggingTool(Class<?> classInst) {
170193 */
171194 public static void configureLog4j () {
172195 LoggingTool localLogger = new LoggingTool (LoggingTool .class );
173- try { // NOPMD
174- org .apache .log4j .PropertyConfigurator .configure (LoggingTool .class
175- .getResource ("/org/openscience/cdk/config/data/log4j.properties" ));
196+ try {
197+ try (InputStream resourceAsStream = LoggingTool .class .getResourceAsStream ("cdk-log4j2.xml" )) {
198+ if (resourceAsStream != null ) {
199+ XmlConfiguration config = new XmlConfiguration (
200+ LoggerContext .getContext (true ),
201+ new ConfigurationSource (resourceAsStream ));
202+ Configurator .reconfigure (config );
203+ }
204+ }
176205 } catch (NullPointerException e ) { // NOPMD
177206 localLogger .error ("Properties file not found: " , e .getMessage ());
178207 localLogger .debug (e );
179208 } catch (Exception e ) {
209+ e .printStackTrace ();
180210 localLogger .error ("Unknown error occurred: " , e .getMessage ());
181211 localLogger .debug (e );
182212 }
@@ -467,22 +497,22 @@ public static ILoggingTool create(Class<?> sourceClass) {
467497 public void setLevel (int level ) {
468498 switch (level ) {
469499 case TRACE :
470- log4jLogger .setLevel (Level .TRACE );
500+ Configurator .setLevel (log4jLogger . getName (), Level .TRACE );
471501 break ;
472502 case DEBUG :
473- log4jLogger .setLevel (Level .DEBUG );
503+ Configurator .setLevel (log4jLogger . getName (), Level .DEBUG );
474504 break ;
475505 case INFO :
476- log4jLogger .setLevel (Level .INFO );
506+ Configurator .setLevel (log4jLogger . getName (), Level .INFO );
477507 break ;
478508 case WARN :
479- log4jLogger .setLevel (Level .WARN );
509+ Configurator .setLevel (log4jLogger . getName (), Level .WARN );
480510 break ;
481511 case ERROR :
482- log4jLogger .setLevel (Level .ERROR );
512+ Configurator .setLevel (log4jLogger . getName (), Level .ERROR );
483513 break ;
484514 case FATAL :
485- log4jLogger .setLevel (Level .FATAL );
515+ Configurator .setLevel (log4jLogger . getName (), Level .FATAL );
486516 break ;
487517 default :
488518 throw new IllegalArgumentException ("Invalid log level: " + level );
@@ -496,22 +526,10 @@ public void setLevel(int level) {
496526 public int getLevel () {
497527 Level level = log4jLogger .getLevel ();
498528 if (level == null )
499- level = Logger .getRootLogger ().getLevel ();
500- switch (level .toInt ()) {
501- case Level .TRACE_INT :
502- return TRACE ;
503- case Level .DEBUG_INT :
504- return DEBUG ;
505- case Level .INFO_INT :
506- return INFO ;
507- case Level .WARN_INT :
508- return WARN ;
509- case Level .ERROR_INT :
510- return ERROR ;
511- case Level .FATAL_INT :
512- return FATAL ;
513- default :
514- throw new IllegalArgumentException ("Unsupported log4j level: " + level );
515- }
529+ level = LogManager .getRootLogger ().getLevel ();
530+ Integer res = LOG4J2_LEVEL_TO_CDK_LEVEL .get (level );
531+ if (res == null )
532+ throw new IllegalArgumentException ("Unsupported log4j level: " + level );
533+ return res ;
516534 }
517535}
0 commit comments