为什么利用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====="); } }