001    package com.github.sarxos.webcam.log;
002    
003    import java.io.File;
004    import java.io.FileInputStream;
005    import java.io.FileNotFoundException;
006    import java.io.IOException;
007    import java.io.InputStream;
008    import java.lang.reflect.Method;
009    
010    import org.slf4j.Logger;
011    import org.slf4j.LoggerFactory;
012    
013    
014    /**
015     * Configure loggers.
016     * 
017     * @author Bartosz Firyn (SarXos)
018     */
019    public class WebcamLogConfigurator {
020    
021            /**
022             * Logger instance.
023             */
024            private static final Logger LOG = LoggerFactory.getLogger(WebcamLogConfigurator.class);
025    
026            /**
027             * Configure SLF4J.
028             * 
029             * @param is input stream to logback configuration xml
030             */
031            public static void configure(InputStream is) {
032    
033                    ClassLoader cl = Thread.currentThread().getContextClassLoader();
034    
035                    try {
036    
037                            String[] names = {
038                            "ch.qos.logback.classic.LoggerContext",
039                            "ch.qos.logback.classic.joran.JoranConfigurator",
040                            };
041    
042                            for (String name : names) {
043                                    Class.forName(name, false, cl);
044                            }
045    
046                            Object context = LoggerFactory.getILoggerFactory();
047    
048                            Class<?> cfgc = Class.forName("ch.qos.logback.classic.joran.JoranConfigurator");
049                            Object configurator = cfgc.newInstance();
050    
051                            Method setContext = cfgc.getMethod("setContext");
052                            setContext.invoke(configurator, context);
053    
054                            Method reset = context.getClass().getMethod("reset");
055                            reset.invoke(context, new Object[0]);
056    
057                            Method doConfigure = cfgc.getMethod("doConfigure");
058                            doConfigure.invoke(configurator, is);
059    
060                    } catch (ClassNotFoundException e) {
061                            System.err.println("WLogC: Logback JARs are missing in classpath");
062                    } catch (Exception e) {
063                            LOG.error("Joran configuration exception", e);
064                    }
065            }
066    
067            /**
068             * Configure SLF4J.
069             * 
070             * @param file logback configuration file
071             */
072            public static void configure(File file) {
073                    FileInputStream fis = null;
074                    try {
075                            fis = new FileInputStream(file);
076                            configure(fis);
077                    } catch (FileNotFoundException e) {
078                            LOG.error("File not found " + file, e);
079                            e.printStackTrace();
080                    } finally {
081                            if (fis != null) {
082                                    try {
083                                            fis.close();
084                                    } catch (IOException e) {
085                                            LOG.error("Cannot close file " + file, e);
086                                            e.printStackTrace();
087                                    }
088                            }
089                    }
090            }
091    
092            /**
093             * Configure SLF4J.
094             * 
095             * @param file logback configuration file path
096             */
097            public static void configure(String file) {
098                    configure(new File(file));
099            }
100    }