为什么利用logback
记得前几年岁情的时候,公司利用的日志框架照旧log4j,约莫从16年中到此刻,不管是我参加的别人已经搭建好的项目照旧我本身主导的项目,日志框架根基都换成了logback,总结一下,logback约莫有以下的一些利益:
总而言之,假如各人的项目内里需要选择一个日志框架,那么我小我私家很是发起利用logback。
logback加载
我们简朴阐明一下logback加载进程,当我们利用logback-classic.jar时,应用启动,那么logback会凭据如下顺序举办扫描:
以上任何一项找到了,就不举办后续扫描,凭据对应的设置举办logback的初始化,详细代码实现可见ch.qos.logback.classic.util.ContextInitializer类的findURLOfDefaultConfigurationFile要领。
当所有以上四项都找不到的环境下,logback会挪用ch.qos.logback.classic.BasicConfigurator的configure要领,结构一个ConsoleAppender用于向节制台输出日志,默认日志输格外式为”%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} – %msg%n”。
logback的configuration
logback的重点该当是Appender、Logger、Pattern,在这之前先简朴相识一下logback的<configuration>,<configuration>只有三个属性:
<logger>与<root>
先从最根基的<logger>与<root>开始。
<logger>用来配置某一个包可能详细某一个类的日志打印级别、以及指定<appender>。<logger>可以包括零个可能多个<appender-ref>元素,标识这个appender将会添加到这个logger。<logger>仅有一个name属性、一个可选的level属性和一个可选的additivity属性:
<root>也是<logger>元素,可是它是根logger,只有一个level属性,因为它的name就是ROOT,关于这个处所,有伴侣微信上问起,源码在LoggerContext中:
public LoggerContext() {
super();
this.loggerCache = new ConcurrentHashMap<String, Logger>();
this.loggerContextRemoteView = new LoggerContextVO(this);
this.root = new Logger(Logger.ROOT_LOGGER_NAME, null, this);
this.root.setLevel(Level.DEBUG);
loggerCache.put(Logger.ROOT_LOGGER_NAME, root);
initEvaluatorMap();
size = 1;
this.frameworkPackages = new ArrayList<String>();
}
Logger的结构函数为:
Logger(String name, Logger parent, LoggerContext loggerContext) {
this.name = name;
this.parent = parent;
this.loggerContext = loggerContext;
}
看到第一个参数就是Root的name,而这个Logger.ROOT_LOGGER_NAME的界说为final public String ROOT_LOGGER_NAME = “ROOT”,由此可以看出<root>节点的name就是”ROOT”。
接着写一段代码来测试一下:
public class Slf4jTest {
@Test
public void testSlf4j() {
Logger logger = LoggerFactory.getLogger(Object.class);
logger.trace("=====trace=====");
logger.debug("=====debug=====");
logger.info("=====info=====");
logger.warn("=====warn=====");
logger.error("=====error=====");
}
}