logback是java中的日志框架,建立于三个主要类之上:Logger、Appender 和 Layout。
Logger作为日志的记录器,把它关联到应用的对应的context上后,主要用于存放日志对象,也可以定义日志类型、级别。Appender主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、 MySQL、 PostreSQL、 Oracle和其他数据库、 JMS和远程UNIX Syslog守护进程等。Layout 负责把事件转换成字符串,格式化的日志信息的输出。
Logger
各个logger对象都被关联到一个 LoggerContext,LoggerContext负责制造logger,也负责以树结构排列各 logger。在树结构中,logger的名称类似java中的包名,名为 "com.foo""的 logger 是名为"com.foo.Bar"的父节点。root logger 位于 logger 等级的最顶端。通过org.slf4j.LoggerFactory类的静态方法getLogger可以取得logger对象,这里使用了单例模式,因此,用同一名字调用LoggerFactory.getLogger 方法所得到的永远都是同一个logger对象的引用。
Logger logger =LoggerFactory.getLogger(“loggername”);
logger 有日志打印级别,可以为一个 logger 指定它的日志打印级别。如果不为一个 logger 指定打印级别,那么它将继承离他最近的一个有指定打印级别的祖先的打印级别。root logger 默认级别是 DEBUG。
使用ch.qos.logback.classic.Logger的setLevel方法可以设置相应的打印级别。
日志打印级别从低级到高级排序的顺序是:TRACE < DEBUG < INFO < WARN < ERROR
org.slf4j.Logger中存在着与打印级别相对应的请求打印方法。通过
Logger logger = LoggerFactory.getLogger(SimpleDemo.class);
logger.info("Hello");
打印出的日志为
23:19:41.131 [main] INFO i.b.l.demo.universal.SimpleDemo - Hello
其中显示了时间、线程、级别、全限定类名、日志信息。
如果一个 logger 允许打印一条具有某个日志级别的信息,那么它也必须允许打印具有比这个日志级别更高级别的信息,而不允许打印具有比这个日志级别更低级别的信息。
//这里强制类型转换是为了能设置 logger 的 Level
ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.foo");
logger.setLevel(Level.INFO);
Logger barlogger = LoggerFactory.getLogger("com.foo.Bar");
// 这个语句能打印,因为 WARN > INFO
logger.warn("can be printed because WARN > INFO");
// 这个语句不能打印,因为 DEBUG < INFO.
logger.debug("can not be printed because DEBUG < INFO");
// barlogger 是 logger 的一个子 logger // 它继承了 logger 的级别 INFO // 以下语句能打印,因为 INFO >= INFO
barlogger.info("can be printed because INFO >= INFO");
// 以下语句不能打印,因为 DEBUG < INFO
barlogger.debug("can not be printed because DEBUG < INFO");
Appender
Appender可以决定日志信息输出的位置,一个 logger 可以绑定多个 Appender,意味着一条信息可以同时打印到不同的目的地去。默认情况下,如果一个 logger 打印一条信息,那么这条信息首先会打印至它自己的 Appender,然后打印至它的父亲和父亲以上的祖先的 Appender,但如果它的父亲设置了 additivity = false
,那么这个 logger 除了打印至它自己的 Appender 外,只会打印至其父亲的 Appender。
Layout
在 logback 中,用 Layout 来代表日志打印格式。比如说,PatternLayout 能够识别以下这条格式:%-4relative [%thread] %-5level %logger{32} - %msg%n
然后打印出来的格式效果是:176 [main] DEBUG manual.architecture.HelloWorld2 - Hello world.
上面这个格式的第一个字段代表从程序启动开始后经过的毫秒数,第二个字段代表打印出这条日志的线程名字,第三个字段代表日志信息的日志打印级别,第四个字段代表 logger name。
logback 提供的配置方式有以下几种:
1.编程式配置
2.xml 格式
3.groovy 格式
logback 在启动时,根据以下步骤寻找配置文件:
1.在 classpath 中寻找 logback-test.xml文件
2.如果找不到 logback-test.xml,则在 classpath 中寻找 logback.groovy 文件
3.如果找不到 logback.groovy,则在 classpath 中寻找 logback.xml文件
4.如果上述的文件都找不到,则 logback 会使用 JDK 的 SPI 机制查找 META-INF/services/ch.qos.logback.classic.spi.Configurator 中的 logback 配置实现类,这个实现类必须实现 Configuration
接口,使用它的实现来进行配置
5.如果上述操作都不成功,logback 就会使用它自带的 BasicConfigurator
来配置,并将日志输出到 console
logback的状态可以显式地在代码里对其输出:
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);
如果想要重新实现 logback 的配置机制,可以直接调用这个类 JoranConfigurator
来实现:
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
try {
JoranConfigurator configurator = new JoranConfigurator();
configurator.setContext(context);
context.reset();
configurator.doConfigure(args[0]);
} catch (JoranException je) {
// StatusPrinter will handle this
}
根节点是 configuration,可包含0个或多个 appender,0个或多个 logger,最多一个 root。
属性: name, level ,additivity
name是必须有的。
level 的取值可以是 TRACE, DEBUG, INFO, WARN, ERROR, ALL, OFF, INHERITED, NULL
, 其中 INHERITED
和 NULL
的作用是一样的,是强制这个 logger 必须从其父辈继承一个日志级别。
元素:
属性: level
level取值范围只能取 TRACE, DEBUG, INFO, WARN, ERROR, ALL, OFF
。
元素:允许有0个或者多个
属性:name , class
name是必须的
class是必须的,用来指定具体的实现类。
元素:可以包含至多一个
属性:class
class是必须的,用来指定具体的实现类。如果该实现类的类型是 PatternLayout
时,那么可以不用填写。
元素:可以包含类似于 JavaBean 的配置标签。
负责两件事,一是把日志信息转换成字节数组,二是把字节数组写入到输出流。
目前PatternLayoutEncoder 是唯一有用的且默认的encoder ,有一个
属性:class
class是必须的,用来指定具体的实现类。如果该类的类型是 PatternLayoutEncoder
,那么 class 属性可以不填。
在 logback 中,支持以 ${varName} 来引用变量
对于
1.ch.qos.logback.core.ConsoleAppender
把日志添加到控制台,有以下子节点:
2.ch.qos.logback.core.FileAppender
把日志添加到文件,有以下子节点:
3.RollingFileAppender:
滚动记录文件,先将日志记录到指定文件,当符合某个条件时,将日志记录到其他文件。有以下子节点:
其中rollingPolicy主要有:
1)TimeBasedRollingPolicy: 最常用的滚动策略,它根据时间来制定滚动策略,既负责滚动也负责出发滚动。有以下子节点:
必要节点,包含文件名及“%d”转换符, “%d”可以包含一个java.text.SimpleDateFormat指定的时间格式,如:%d{yyyy-MM}。如果直接使用 %d,默认格式是 yyyy-MM-dd。RollingFileAppender 的file字节点可有可无,通过设置file,可以为活动文件和归档文件指定不同位置,当前日志总是记录到file指定的文件(活动文件),活动文件的名字不会改变;如果没设置file,活动文件的名字会根据fileNamePattern 的值,每隔一段时间改变一次。“/”或者“\”会被当做目录分隔符。
可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件。假设设置每个月滚动,且
2)FixedWindowRollingPolicy: 根据固定窗口算法重命名文件的滚动策略。有以下子节点:
窗口索引最小值
窗口索引最大值,当用户指定的窗口过大时,会自动将窗口设置为12。
必须包含“%i”例如,假设最小值和最大值分别为1和2,命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项,例如,mylog%i.log.gz 或者 没有log%i.log.zip
triggeringPolicy主要有:
1)SizeBasedTriggeringPolicy:
查看当前活动文件的大小,如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:
这是活动文件的大小,默认值是10MB。