在我的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);” - 没有。 怎么了?