View Javadoc
1   /*
2    * This file is part of Waarp Project (named also Waarp or GG).
3    *
4    *  Copyright (c) 2019, Waarp SAS, and individual contributors by the @author
5    *  tags. See the COPYRIGHT.txt in the distribution for a full listing of
6    * individual contributors.
7    *
8    *  All Waarp Project is free software: you can redistribute it and/or
9    * modify it under the terms of the GNU General Public License as published by
10   * the Free Software Foundation, either version 3 of the License, or (at your
11   * option) any later version.
12   *
13   * Waarp is distributed in the hope that it will be useful, but WITHOUT ANY
14   * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
15   * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16   *
17   *  You should have received a copy of the GNU General Public License along with
18   * Waarp . If not, see <http://www.gnu.org/licenses/>.
19   */
20  package org.waarp.common.logging;
21  
22  import ch.qos.logback.classic.Level;
23  import ch.qos.logback.classic.Logger;
24  import org.slf4j.LoggerFactory;
25  import org.slf4j.helpers.NOPLoggerFactory;
26  
27  import java.io.OutputStream;
28  import java.io.PrintStream;
29  import java.io.UnsupportedEncodingException;
30  
31  /**
32   * logger factory using SLF4J from LOGBACK
33   */
34  public class WaarpSlf4JLoggerFactory extends WaarpLoggerFactory {
35    static final String ROOT = org.slf4j.Logger.ROOT_LOGGER_NAME;
36  
37    // Old versions: "root" and LoggerContext.ROOT_NAME
38  
39    /**
40     * @param level
41     */
42    public WaarpSlf4JLoggerFactory(final WaarpLogLevel level) {
43      super(level);
44      seLevelSpecific(currentLevel);
45    }
46  
47    @Override
48    protected final void seLevelSpecific(final WaarpLogLevel level) {
49      final Logger logger = (Logger) LoggerFactory.getLogger(ROOT);
50      switch (level) {
51        case TRACE:
52          logger.setLevel(Level.TRACE); //NOSONAR
53          break;
54        case DEBUG:
55          logger.setLevel(Level.DEBUG); //NOSONAR
56          break;
57        case INFO:
58          logger.setLevel(Level.INFO); //NOSONAR
59          break;
60        case ERROR:
61          logger.setLevel(Level.ERROR); //NOSONAR
62          break;
63        case WARN:
64          logger.setLevel(Level.WARN); //NOSONAR
65          break;
66        default:
67          logger.setLevel(Level.OFF); //NOSONAR
68      }
69    }
70  
71    @Override
72    public final WaarpLogger newInstance(final String name) {
73      final Logger logger = (Logger) LoggerFactory.getLogger(name);
74      return new WaarpSlf4JLogger(logger);
75    }
76  
77    WaarpSlf4JLoggerFactory(final boolean failIfNOP) {
78      super(null);
79      assert failIfNOP; // Should be always called with true.
80  
81      // SFL4J writes it error messages to System.err. Capture them so that the user does not see such a message on
82      // the console during automatic detection.
83      final StringBuilder buf = new StringBuilder();
84      final PrintStream err = System.err;//NOSONAR
85      try {
86        System.setErr(new PrintStream(new OutputStream() {
87          @Override
88          public final void write(final int b) {
89            buf.append((char) b);
90          }
91        }, true, "US-ASCII"));
92      } catch (final UnsupportedEncodingException e) {
93        throw new Error(e);
94      }
95  
96      try {
97        if (LoggerFactory.getILoggerFactory() instanceof NOPLoggerFactory) {
98          throw new NoClassDefFoundError(buf.toString());
99        } else {
100         err.print(buf);
101         err.flush();
102       }
103     } finally {
104       System.setErr(err);
105       seLevelSpecific(currentLevel);
106     }
107   }
108 
109   @Override
110   protected final WaarpLogLevel getLevelSpecific() {
111     final Logger logger = (Logger) LoggerFactory.getLogger(ROOT);
112     if (logger.isTraceEnabled()) {
113       return WaarpLogLevel.TRACE;
114     } else if (logger.isDebugEnabled()) {
115       return WaarpLogLevel.DEBUG;
116     } else if (logger.isInfoEnabled()) {
117       return WaarpLogLevel.INFO;
118     } else if (logger.isWarnEnabled()) {
119       return WaarpLogLevel.WARN;
120     } else if (logger.isErrorEnabled()) {
121       return WaarpLogLevel.ERROR;
122     }
123     return WaarpLogLevel.NONE;
124   }
125 }