(粗糙选译。。)

Joran是logback所依赖的配置框架。

Configuration in logback

观察表明,在一个应用程序中,日志代码大概占4%左右。

所以即便是一个几千行。。几万行的程序也有成百上千的日志语句,鉴于它们的数量,我们需要工具来管理这些日志语句。logback既可以通过编程方式配置,也可以通过脚本配置(XML或Groovy 格式)。顺便说一下,现有的log4j用户可以使用PropertiesTranslator 应用程序将log4j.properties转换为logback.xml

让我们从讨论logback尝试配置自身的初始化步骤开始:

  1. Logback尝试在classpath中查找一个名为logback-test.xml的文件。
  2. 如果没找到,logback将尝试在classpath中检查有没有logback.groovy
  3. 如果还是没有找到,logback继续在classpath中找logback.xml
  4. 如果依然没找到,则使用service-provider loading facility(JDK 1.6中引入的)通过查找类路径中的文件META-INF\services\ch.qos.logback.classic.spi.Configurator来解析com.qos.logback.classic.spi.Configurator接口的实现。它的内容应该指定所需Configurator实现的完全限定类名。
  5. 如果以上方法都不成功,logback将使用BasicConfigurator自动配置自己,这将导致日志输出定向到控制台。

Automatically configuring logback

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>org.sample.logback</groupId>
<artifactId>test-logback</artifactId>
<version>1.0-SNAPSHOT</version> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- -source 1.5 中不支持 try-with-resources-->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties> <dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-classic -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<!--Failed to load class "org.slf4j.impl.StaticLoggerBinder".-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
</dependencies>
</project>

pom.xml

BasicConfigurator是logback默认的一个最小可用的配置。试了下文档里的例子程序,在main函数里跑,debug信息莫名奇妙输不出来(只输出info的),但在junit里跑却又可以。。

Automatic configuration with logback-test.xml or logback.xml

和没有xml文件时的默认配置等价的最小可用xml配置:

<configuration>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender> <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>

Automatic printing of status messages in case of warning or errors

启用“观察logback内部状态模式”(如果logback出现内部错误则不启用也会自动输出到控制台):

        // assume SLF4J is bound to logback in the current environment
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
// print logback's internal status
StatusPrinter.print(lc);

Status data

启用“观察logback内部状态模式”通常对诊断logback问题大有帮助。因此,强烈建议将其视为第一求助办法。(一般情况都是推荐启用的。)xml启用“观察logback内部状态模式”:

<configuration debug="true"> 

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are by default assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender> <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>

等价写法:

<configuration>
<statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /> ... the rest of the configuration file
</configuration>

Automatically reloading configuration file upon modification

30秒(默认单位是毫秒)扫描一次,如果文件改变就自动重新配置:

<configuration scan="true" scanPeriod="30 seconds" >
...
</configuration>

在编辑xml的时候很容易出错,所以感觉不是很好用。

Enabling packaging data in stack traces

Viewing status messages

通过网页来查看logback的内部状态信息。

Listening to status messages

"logback.statusListenerClass" system property

Stopping logback-classic

Configuration file syntax

Example1- 关于logger、root、appender元素的一些基本知识

<configuration debug="true">
<!--一个可选的元素,便于区分不同程序的输出-->
<contextName>myapp</contextName> <!--配置appender元素:
1、name和class是必要的
2、一个appender可以包含零到多个layout元素
3、一个appender可以包含零到多个encoder元素
4、一个appender可以包含零到多个filter元素
5、除了这三个公共元素之外,<appender>元素可以包含与appender类的JavaBean属性相对应的任意数量的元素。
-->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>myApp.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
</encoder>
</appender> <!-- 配置logger元素:
1、name是必要的
2、level是可选的,没有就继承最近的,具有“赋予等级”的祖先的“赋予等级”。
TRACE, DEBUG, INFO, WARN, ERROR, ALL, OFF, INHERITED, NULL(填最后两个
等价于省略level,并且最后两个效果等价)
3、additivity是可选的,默认是true
4、一个logger可以包含零到多个appender-ref元素
-->
<logger name="org.sample.logback.Foo" level="OFF" additivity="true" />
<logger name="org.sample.logback.LogbackTest" level="INFO" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</logger> <!-- 配置root元素:
1、它不支持除了level外的任何其它属性
2、appender-ref元素和普通logger一样
-->
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>

Example2- 变量定义初步

<configuration debug="true">

    <!-- 方法一,简单变量替换 -->
<property name="USER_HOME" value="log_files" />
<!-- 方法二,采用系统属性(System property)达到同样效果-->
<!-- java -DUSER_HOME="log_files" MyApp2 -->
<!--方法三杠一,通过文件导入变量,当变量多的时候这样比较方便-->
<property file="src/main/java/variables1.properties" />
<!--文件内容USER_HOME=log_files-->
<!-- 方法三杠二,等效三杆一,不过这个时候资源在类路径里 -->
<property resource="resource1.properties" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>${USER_HOME}/myApp.log</file>
<encoder>
<pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
</encoder>
</appender> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender> <logger name="org.sample.logback.LogbackTest" level="INFO" additivity="false">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</logger> <root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>

logback完全支持变量嵌套。变量的名称、默认值和值定义都可以引用其他变量:

USER_HOME=/home/sebastien
fileName=myApp.log
destination=${USER_HOME}/${fileName}

再比如${${userid}.password}、${id:-${userid}}。。

Example3- 变量作用域

<configuration>
<!--
LOCAL SCOPE
默认的作用域。变量生命周期:在配置文件中定
义的位置开始直到配置文件被解析/执行完成。意味
着每次解析配置文件都将创建一个新的这个变量。 CONTEXT SCOPE
插入到上下文(context),直到context被清除。
一旦定义,CONTEXT SCOPE中的属性就是context的
一部分。因此,它在所有日志事件中都可用,包括
通过序列化发送到远程主机的日志事件。 SYSTEM SCOPE
带有SYSTEM作用域的属性被插入到JVM的系统属性中,
并且持续到JVM清除为止。
--> <!-- 在替换配置文件中的变量时,变量的查找
顺序是LOCAL>CONTEXT>SYSTEM,最后是操作
系统环境变量 --> <property scope="context" name="nodeId" value="firstNode" /> <appender name="FILE" class="ch.qos.logback.core.FileAppender">
<!-- 用":-"定义默认值 -->
<file>log_files/${nodeId:-secondNode}/myApp.log</file>
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender> <root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration>

Example4- HOSTNAME和CONTEXT_NAME是默认的两个变量(好像是惰性初始化的)

<configuration>
<property scope="context" name="nodeId" value="firstNode" /> <appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>log_files/${HOSTNAME}/${CONTEXT_NAME}/myApp.log</file>
<!--C:\Users\mdzz\Desktop\test-mvn\testlogback\log_files\LAPTOP-QGECNCGO\default\myApp.log-->
<encoder>
<pattern>%msg%n</pattern>
</encoder>
</appender> <root level="debug">
<appender-ref ref="FILE" />
</root>
</configuration>

Generate

The logback manual #03# Configuration的更多相关文章

  1. The logback manual #01# Introduction

    依赖包如下pom.xml: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...

  2. The logback manual #02# Architecture

    索引 Logback's architecture Logger, Appenders and Layouts Effective Level(有效等级)又名Level Inheritance Ret ...

  3. SLF4J user manual

    http://www.slf4j.org/manual.html The Simple Logging Facade for Java (SLF4J) serves as a simple facad ...

  4. Logback相关知识汇总

    例如:%-4relative 表示,将输出从程序启动到创建日志记录的时间 进行左对齐 且最小宽度为4格式修饰符,与转换符共同使用:可选的格式修饰符位于“%”和转换符之间.第一个可选修饰符是左对齐 标志 ...

  5. SLF4J user manual 专题

    System Out and Err Redirected to SLF4J The sysout-over-slf4j module allows a user to redirect all ca ...

  6. Logback 专题

    logback-spring.xml <?xml version="1.0" encoding="UTF-8"?> <configuratio ...

  7. Spring Boot 2.X(十四):日志功能 Logback

    Logback 简介 Logback 是由 SLF4J 作者开发的新一代日志框架,用于替代 log4j. 主要特点是效率更高,架构设计够通用,适用于不同的环境. Logback 分为三个模块:logb ...

  8. Logback常用配置详解

    logback是一套日志框架,由log4j的优化版,由同一个作者开发,在速度和性能上都超过其他日志框架,再结合slf4j,已成为当前最流行的日志框架. Logback最常用就是在classpath定义 ...

  9. logback配置文件详解

    一:根节点<configuration>包含的属性: scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true. scanPeriod: 设置监测配置文 ...

随机推荐

  1. 爆破root密码hash John the Ripper和hydra爆破ssh密码

    官方网站:http://www.openwall.com/john/ 下载:wget http://www.openwall.com/john/j/john-1.8.0.tar.gz 解压:tar - ...

  2. (转)Springboot日志配置(超详细,推荐)

    Spring Boot-日志配置(超详细) 更新日志: 20170810 更新通过 application.yml传递参数到 logback 中. Spring Boot-日志配置超详细 默认日志 L ...

  3. \Temporary ASP.NET Files\root\文件不断增长,如何处理?

    很久没有写博了.最近半年除了忙活布置新家和过年期间走亲访友之外,都是在公司处理一些项目中的杂事:连家里买的很多书都停下来没看了,感觉这段时间在事业和学习上一直都是忙忙碌碌,却又碌碌无为. 吐槽完,说正 ...

  4. conda常用命令

    1. conda基本命令 检查Anaconda是否成功安装 conda --version 检测目前安装了哪些环境 conda info --envs 检查目前有哪些版本的python可以安装: co ...

  5. 关于 服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF 错误

    用WebClient 去下载数据时发现有服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF错误,解决办法 1.在app.config种添加 we ...

  6. ZOJ 3690 Choosing number(矩阵)

    Choosing number [题目链接]Choosing number [题目类型]矩阵 &题解: 这题就和已经dp极像了,所以找方程就很困难了.可以这样找: 设f(n)是前n-1个人已经 ...

  7. Service Fabric下删除实例并注销应用

    Service Fabric下删除实例并注销应用: 以应用名称:Application1为例 1.打开PowerShell 2.连接集群: Connect-ServiceFabricCluster - ...

  8. Day5 装饰器和文件操作

    一.装饰器 1.什么是装饰器 装饰器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本质就是函数,功能是为其他函数添加新功能 2. 装饰器需要遵循的原则 1.不修改被装饰函数的源代码(开放封 ...

  9. JavaScript(六):错误处理机制

    1.Error()构造函数 javascript解析或执行语句时,一旦发生错误,js引擎会将其抛出! JavaScript原生提供了Error()构造函数,所有抛出的错误都是这个构造函数的实例(即对象 ...

  10. Sitecore CMS中配置模板部分

    如何在Sitecore CMS中配置模板部分. 注意: 本教程将扩展于“Sitecore CMS中创建模板”的章节. 配置折叠状态 配置模板部分的折叠状态允许用户选择默认折叠或展开哪些模板部分.此设置 ...