1 /*
2 * Copyright 2012 The Netty Project
3 *
4 * The Netty Project licenses this file to you under the Apache License,
5 * version 2.0 (the "License"); you may not use this file except in compliance
6 * with the License. You may obtain a copy of the License at:
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 * License for the specific language governing permissions and limitations
14 * under the License.
15 */
16 package io.netty.util.internal.logging;
17
18
19 import org.slf4j.LoggerFactory;
20 import org.slf4j.helpers.NOPLoggerFactory;
21
22 import java.io.OutputStream;
23 import java.io.PrintStream;
24 import java.io.UnsupportedEncodingException;
25
26 /**
27 * Logger factory which creates a <a href="http://www.slf4j.org/">SLF4J</a>
28 * logger.
29 */
30 public class Slf4JLoggerFactory extends InternalLoggerFactory {
31
32 public static final InternalLoggerFactory INSTANCE = new Slf4JLoggerFactory();
33
34 /**
35 * @deprecated Use [email protected] #INSTANCE} instead.
36 */
37 @Deprecated
38 public Slf4JLoggerFactory() {
39 }
40
41 Slf4JLoggerFactory(boolean failIfNOP) {
42 assert failIfNOP; // Should be always called with true.
43
44 // SFL4J writes it error messages to System.err. Capture them so that the user does not see such a message on
45 // the console during automatic detection.
46 final StringBuffer buf = new StringBuffer();
47 final PrintStream err = System.err;
48 try {
49 System.setErr(new PrintStream(new OutputStream() {
50 @Override
51 public void write(int b) {
52 buf.append((char) b);
53 }
54 }, true, "US-ASCII"));
55 } catch (UnsupportedEncodingException e) {
56 throw new Error(e);
57 }
58
59 try {
60 if (LoggerFactory.getILoggerFactory() instanceof NOPLoggerFactory) {
61 throw new NoClassDefFoundError(buf.toString());
62 } else {
63 err.print(buf);
64 err.flush();
65 }
66 } finally {
67 System.setErr(err);
68 }
69 }
70
71 @Override
72 public InternalLogger newInstance(String name) {
73 return new Slf4JLogger(LoggerFactory.getLogger(name));
74 }
75 }