以编程方式配置LogBack。再次

时间:2016-08-01 13:39:40

标签: java android logging logback slf4j

在我的android程序中我使用slf4j-logback。使用xml-configuration可以正常工作:

<configuration>
<property name="LOG_DIR" value="/sdcard/Results/.logs" />
<appender
        name="LOGCAT"
        class="ch.qos.logback.classic.android.LogcatAppender" >
    <tagEncoder>
        <pattern>akrit</pattern>
    </tagEncoder>
    <encoder>
        <pattern>[%class{0}][%thread] %msg%n</pattern>
    </encoder>
</appender>

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${LOG_DIR}/log.txt</file>
    <append>true</append>
    <encoder>
        <pattern>%date{ISO8601} [%thread] %-5level %logger{0} %msg%n</pattern>
    </encoder>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <fileNamePattern>${LOG_DIR}/log.%d.txt</fileNamePattern>
        <maxHistory>14</maxHistory>
    </rollingPolicy>
</appender>

<root level="DEBUG" >
    <appender-ref ref="LOGCAT" />
    <appender-ref ref="FILE" />
</root>

但是,以编程方式配置的相同代码逻辑不起作用 - logcat和logfile为空:

package projects.common.logger;

import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.android.LogcatAppender;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
public class LogBack {
    private static boolean debugMode = true;
    private static String logPath = null;
    public static Logger getLogger(Class<?> _clazz) {
        //return getLoggerXML(_clazz);
        return configureLogbackDirectly(_clazz, debugMode, logPath);
    }
    public static Logger getLoggerXML(Class<?> _clazz) {
        return (Logger) LoggerFactory.getLogger(_clazz);
    }
    public static void setDebugMode(boolean _debugMode) {
        debugMode = _debugMode;
    }
    public static void setLogPath(String _logPath) {
        logPath = _logPath;
    }
    private static Logger configureLogbackDirectly(Class<?> _clazz, boolean _debug, String _logPath) {
        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
        context.reset();
        Logger root = (Logger) LoggerFactory.getLogger(_clazz);
        root.setLevel(Level.ERROR);
        if (_debug)
            root.setLevel(Level.DEBUG);
        root.addAppender(logCat(context));
        if (_logPath != null)
            root.addAppender(logFile(context, _logPath));
        return root;
    }
    private static RollingFileAppender<ILoggingEvent> logFile(LoggerContext _context, String _filePath) {
        RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<ILoggingEvent>();
        rollingFileAppender.setAppend(true);
        rollingFileAppender.setContext(_context);
        rollingFileAppender.setFile(_filePath + "/log.txt");
        TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<ILoggingEvent>();
        rollingPolicy.setFileNamePattern(_filePath + "/log.%d.txt");
        rollingPolicy.setMaxHistory(7);
        rollingPolicy.setParent(rollingFileAppender);
        rollingPolicy.setContext(_context);
        rollingPolicy.start();
        rollingFileAppender.setRollingPolicy(rollingPolicy);
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setPattern("%date{ISO8601} [%thread] %-5level %logger{0} %msg%n");
        encoder.setContext(_context);
        encoder.start();
        rollingFileAppender.setEncoder(encoder);
        rollingFileAppender.setName("rollingFileAppender");
        rollingFileAppender.start();
        return rollingFileAppender;
    }
    private static LogcatAppender logCat(LoggerContext _context) {
        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
        encoder.setContext(_context);
        encoder.setPattern("[%thread] %msg%n");
        encoder.start();
        PatternLayoutEncoder tag_encoder = new PatternLayoutEncoder();
        tag_encoder.setContext(_context);
        tag_encoder.setPattern("%class{0}");
        tag_encoder.start();
        LogcatAppender logcatAppender = new LogcatAppender();
        logcatAppender.setContext(_context);
        logcatAppender.setEncoder(encoder);
        logcatAppender.setTagEncoder(tag_encoder);
        logcatAppender.setName("logcatAppender");
        logcatAppender.start();
        return logcatAppender;
    }
}

即。如果活动行“返回getLoggerXML(_clazz);” - 一切都很好, “return configureLogbackDirectly(_clazz,debugMode,logPath);” - 没有。 怎么了?

0 个答案:

没有答案