参考文章直达车
logback(一)理论概述
logback(二)springboot配置日志文件格式、logback-spring配置文件详解
logback(三)mybatis-plus结合logback将sql语句输出到日志文件
Logback继承了log4j,是一款开源项目。它由Ceki Gülcü设计,也是 log4j的创始人。 它建立在十年来设计工业强度测试系统的经验基础上。由此产生的产品,比所有现有的日志记录系统更快,占用更小的空间,有时还会有很大的差距 。同样重要的是,日志返回提供了其他日志系统所没有的独特而非常有用的特性。
Logback试图在类路径找到一个文件 logback-test.xml
如果没有找到这样的文件,会在类路径检查文件 logback.xml
如果还没找到,服务提供者装载设施 (在JDK 1.6中引入的) 用于解析的实现 com.qos.logback.classic.spi.Configurator 界面通过查找文件 meta - inf \ \ ch.qos.logback.classic.spi.Configurator服务。 其内容应指定完全 限定的类名 配置器 实现。
如果以上都不是成功,logback配置本身 自动使用 BasicConfigurator 这将导致日志输出到控制台。
我们常用的有第一种(日志分级别配置使用)和第四种(默认,什么都不配置的情况下)
除了Logback-classic .jar之外,Logback-classic模块还需要在类路径中存在slf4j-api.jar(这个是一个独立的模块,有很多包都引用了它,如下图)和logback-core.jar。
package com.fox.test;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.util.StatusPrinter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Demo {
public static void main(String[] args) {
Logger logger = LoggerFactory.getLogger("com.fox.test.Demo");
// 也可以这样写getLogger(当前类名.class)
// Logger logger = LoggerFactory.getLogger(Demo.class);
logger.debug("Hello world");
// 打印内部状态
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);
}
}
在main()方法的第一行,变量名 logger 从 LoggerFactory 类调用静态检索 getLogger方法获取一个 Logger 实例。 这个日志程序被命名为 “com.fox.test.Demo”。方法传入“Hello world”作为参数。 我们说main方法包含一个DEBUG级别的日志语句,消息为“Hello world”。
注意,上面的示例没有引用任何logback返回类。 在大多数情况下,就logback记录而言,您的类只需要导入SLF4J类。 因此,绝大多数(如果不是全部的话)类将使用SLF4J API,并且不会注意logback返回的存在。
启动 Demo 应用程序将在控制台上输出一行代码。 根据logback的默认配置策略,当没有找到默认配置文件时,logback将向根记录器添加一个ConsoleAppender。
14:06:27.434 [main] DEBUG com.fox.test.Demo - Hello world
打印内部状态结果如下
14:06:27,384 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
14:06:27,384 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml]
14:06:27,392 |-INFO in ch.qos.logback.classic.BasicConfigurator@11028347 - Setting up default configuration.
Logback解释说,由于没有找到Logback-test.xml和Logback.xml配置文件(稍后讨论),它使用默认策略配置自己,这是一个基本的ConsoleAppender。 Appender是一个可以被视为输出目的地的类。 appender存在于许多不同的目的地,包括控制台、文件、Syslog、TCP Sockets、JMS等等。 用户还可以根据具体情况轻松创建自己的appender。
注意,如果出现错误,logback将自动在控制台上打印其内部状态。
前面的例子相当简单,大型应用程序中的实际日志记录不会有太大的不同。 日志记录语句的一般模式不会改变, 只有配置过程会有所不同。
还可以通过以下方式来打印不同级别的日志,由低到高TRACE(跟踪) DEBUG INFO WARN ERROR OFF(关闭)
logger.trace("trace哈哈哈");
logger.debug("debug哈哈哈");
logger.info("info哈哈哈");
logger.warn("warn哈哈哈");
logger.error("error哈哈哈");
可以这样打印,将参数和变量拼接起来
int one = 15;
String two = "你好";
logger.debug("debug哈哈哈,第一个参数:" + one + ",第二个参数:" + two);
15:31:43.490 [main] DEBUG com.fox.test.Demo - debug哈哈哈,第一个参数:15,第二个参数:你好
但是,为了提高性能的同时最小化的影响代码的可读性,提供了一种更方便的形式
如果有多个参数,可以写多个占位符{},它将自动对应后面的参数
int one = 15;
String two = "你好";
logger.debug("debug哈哈哈,第一个参数:{},第二个参数:{}", one, two);
15:29:58.015 [main] DEBUG com.fox.test.Demo - debug哈哈哈,第一个参数:15,第二个参数:你好
对于一些日志而言,会产生构造消息参数的成本,即将整数one转换为String,并连接中间字符串。 这与是否记录消息无关。
第二种变体的性能至少比第一种变体高30倍。
因为在评估是否记录日志之后,并且只有当决定为正时,记录器才会实现格式化消息并将“{}”对替换为条目的字符串值。 换句话说,当禁用日志语句时,这种形式不会产生参数构造的成本。
当然在实践中,这种开销是微不足道的。但是为了代码可读性高,还是建议使用第二种