Exploring
首页
  • Java

    • 面向对象的思想OOP
    • 浅谈Java反射原理
    • endorsed覆盖JDK中的类
  • 认证与授权

    • LDAP概念和原理介绍
    • OAuth2介绍
  • Impala

    • Impala 介绍
  • MySQL

    • 关于MySQL的一些面试题
    • 解决MySQL不到中文数据
    • 数据库之事务与实现原理
  • Oracle

    • oracle的表空间,用户管理,表操作,函数
    • oracle的查询、视图、索引
    • plsql简单入门
  • Redis

    • 数据类型详解
    • 跳越表
    • 数据持久化的两种方式
  • 共识算法

    • gossip
  • RPC

    • GRPC初识与快速入门
    • ProtocolBuffer基本语法
  • RabbitMQ

    • RabbitMQ入门程序之HelloWorld
    • RabbitMQ之工作模式
  • Zookeeper

    • Zookeeper一文入门
  • Docker

    • Docker入门初体验
  • Maven

    • 把自己的包到Maven中央仓库
    • Maven之自定义插件
  • Nginx

    • nginx的安装
    • nginx的配置文件
    • nignx 的变量
  • Tomcat

    • Servlet3通过SPI进行注册组件
  • Vagrant

    • vagrant 初始化
    • vagrant 常用配置
    • vagrant 自己制作 box
  • Linux

    • 启动方式 Systemd
    • 后台服务
    • 防火墙与 Iptables
  • 设计模式

    • 设计模式-代理
    • 设计模式-单例模式
    • 设计模式-迭代器
  • 分布式

    • CAP 理论
  • 数据结构

    • 数据结构之堆Heap
    • 数据结构之哈希表
    • 数据结构之队列
  • 计算机网络

    • HTTP与HTTPS详解
    • 浅谈DNS协议
    • ISP中的网络层
  • 算法

    • 常用查找算法及Java实现
    • 常用排序算法及Java实现
    • 迪杰斯特拉算法
  • 操作系统

    • 操作系统之进程调度算法
    • 操作系统之进程通讯IPC
    • 操作系统之内存管理
  • 抓包

    • 生成安卓系统证书
  • 加解密

    • 常见加密算法
    • 公开秘钥基础知识
    • RSA 解析
  • Windows

    • scoop 包管理
    • windows-terminal 配置
    • 增强 PowerShell
归档
Github (opens new window)
首页
  • Java

    • 面向对象的思想OOP
    • 浅谈Java反射原理
    • endorsed覆盖JDK中的类
  • 认证与授权

    • LDAP概念和原理介绍
    • OAuth2介绍
  • Impala

    • Impala 介绍
  • MySQL

    • 关于MySQL的一些面试题
    • 解决MySQL不到中文数据
    • 数据库之事务与实现原理
  • Oracle

    • oracle的表空间,用户管理,表操作,函数
    • oracle的查询、视图、索引
    • plsql简单入门
  • Redis

    • 数据类型详解
    • 跳越表
    • 数据持久化的两种方式
  • 共识算法

    • gossip
  • RPC

    • GRPC初识与快速入门
    • ProtocolBuffer基本语法
  • RabbitMQ

    • RabbitMQ入门程序之HelloWorld
    • RabbitMQ之工作模式
  • Zookeeper

    • Zookeeper一文入门
  • Docker

    • Docker入门初体验
  • Maven

    • 把自己的包到Maven中央仓库
    • Maven之自定义插件
  • Nginx

    • nginx的安装
    • nginx的配置文件
    • nignx 的变量
  • Tomcat

    • Servlet3通过SPI进行注册组件
  • Vagrant

    • vagrant 初始化
    • vagrant 常用配置
    • vagrant 自己制作 box
  • Linux

    • 启动方式 Systemd
    • 后台服务
    • 防火墙与 Iptables
  • 设计模式

    • 设计模式-代理
    • 设计模式-单例模式
    • 设计模式-迭代器
  • 分布式

    • CAP 理论
  • 数据结构

    • 数据结构之堆Heap
    • 数据结构之哈希表
    • 数据结构之队列
  • 计算机网络

    • HTTP与HTTPS详解
    • 浅谈DNS协议
    • ISP中的网络层
  • 算法

    • 常用查找算法及Java实现
    • 常用排序算法及Java实现
    • 迪杰斯特拉算法
  • 操作系统

    • 操作系统之进程调度算法
    • 操作系统之进程通讯IPC
    • 操作系统之内存管理
  • 抓包

    • 生成安卓系统证书
  • 加解密

    • 常见加密算法
    • 公开秘钥基础知识
    • RSA 解析
  • Windows

    • scoop 包管理
    • windows-terminal 配置
    • 增强 PowerShell
归档
Github (opens new window)
  • Java

    • 基础

    • 并发与多线程

    • 日志系统

      • 初识Java中的日志
      • 两种常用日志框架搭配快速上手
      • logback介绍
      • logback的架构
      • logback的配置
      • logback配置文件语法
        • 配置文件的结构
        • 标签名区分大小写
        • configuration标签
        • logger标签
        • root标签
        • appenders标签
        • 设置上下文名称
        • 定义变量
        • 变量的范围
        • 变量的默认值
        • 变量的嵌套
        • 设置时间戳
        • 定义动态的变量
        • 条件判断
        • 从JNDI中获取变量
        • 配置引入
        • 日志级别改变传播器
        • 参考
      • logback中的Appender
      • logback配置中的Encoder
      • logback中的Layouts
      • logback中的Filter
      • logback中使用MDC
      • logback源码分析
      • 好看的彩色日志输出
    • 单元测试

    • JVM

    • Spring

    • SpringBoot

    • 一些工具

  • 语言
  • Java
  • 日志系统
unclezs
2020-12-03
0
目录

logback配置文件语法

# 配置文件的结构

因为logback的配置十分灵活,所以无法通过一个DTD文件或者XML Schema来指定允许的语法。

# 标签名区分大小写

对于特定的标签名字是大小写不敏感的,比如<logger>, <Logger> 和 <LOGGER>都是合法的配置,但是<xyz>只能用</xyz>关闭,不能是<XyZ>,但是针对驼峰规则是适用的,比如<xyz>只能用</Xyz>关闭,不能是<xYz>。驼峰规则可以参考维基百科camelCase convention (opens new window)

# configuration标签

根标签,其中可以包含:

  • Appender
  • Logger
  • Root
  • property

# logger标签

  • name(string): 必填,logger的名称
  • additivity(boolean):选填,是否最累加Appender(是否继承是用父logger的Appender)
  • level(TRACE,DEBUG,INFO,WARN,ERROR,ALL,OFF,INHERITED):选填,不填则同INHERITED,代表继承父logger的日志级别,大小写不敏感。
  • appender-ref:选填,子标签(非属性),可以配置多个。中有ref标签指定Appender的name.

# root标签

在整个配置文件中只能存在一个,可以当做是一个name为"ROOT"的Logger标签,但是不能有additivity属性,全局只能存在一个。

  • level(TRACE, DEBUG, INFO, WARN, ERROR, ALL or OFF):选填,不填则默认为debug
  • appender-ref:同logger

# appenders标签

  • name(string):必填,名称,用于引用

  • class(string):必填,Appender全限定类名,指定Appender

  • <encoder>

  • <layout>

  • <filter>

# 设置上下文名称

每个logger都属于loggerContext, loggerContext默认的名字是“default”,这个名字可以设置

<configuration>
  <contextName>myAppName</contextName>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d %contextName [%t] %level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="debug">
    <appender-ref ref="STDOUT" />
  </root>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12

# 定义变量

可以用<property>定义变量,在 1.0.7 版本之后可以使用<variable>互换。

可以通过file属性引入指定路径的properties文件进行变量填充。

通过resource属性可以加载classpath下面的properties文件。

可以通过${xxx}读取变量,可以是声明的变量,也可以是System.properties

<configuration>

  <property name="USER_HOME" value="/home/sebastien" />
  <property file="src/main/java/resource/var.properties" />
  <property resource="resource1.properties" />
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>${USER_HOME}/myApp.log</file>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>

  <root level="debug">
    <appender-ref ref="FILE" />
  </root>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 变量的范围

${xxx}到底可以引用哪些地方的变量呢?

读取顺序依次:

  1. 配置文件直接定义的
  2. LoggerContext
  3. VM的参数列表
  4. 环境变量

可以通过scope指定property的作用域,可选值:"local", "context" 和 "system",不填默认为local

定义一个context作用域的变量:

<configuration>
  <property scope="context" name="nodeId" value="firstNode" />
  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>/opt/${nodeId}/myApp.log</file>
    <encoder>
      <pattern>%msg%n</pattern>
    </encoder>
  </appender>
  <root level="debug">
    <appender-ref ref="FILE" />
  </root>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12

# 变量的默认值

可以通过 -: 操作符合来使用默认值,比如${LOG_DIR -: /path/logdir}

如果LOG_DIR在域中取不到,则用默认值/path/logdir

# 变量的嵌套

名称和值都是支持嵌套的,默认值中也可以使用。

假设 userid=uncle

比如{{userid}.password},可能值就是变为取${uncle.password}这个变量的值。

{id:-{userid}},id不存在则返回uncle

# 设置时间戳

可以定义一个根据当前时间的动态变化的变量。

  • key:引用名字
  • datePattern:时间格式化,和Java的SimpleDateFormat一样。
  • timeReference 设置值“contextBirth”为logback启动时间,不写默认为当前时间
<configuration>
  <!-- Insert the current time formatted as "yyyyMMdd'T'HHmmss" under
       the key "bySecond" into the logger context. This value will be
       available to all subsequent configuration elements. -->
  <timestamp key="now" datePattern="yyyyMMdd'T'HHmmss"/>

  <timestamp key="startTime" datePattern="yyyyMMdd'T'HHmmss" 
             timeReference="contextBirth"/>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <!-- use the previously created timestamp to create a uniquely
         named log file -->
    <file>log-${bySecond}.txt</file>
    <encoder>
      <pattern>%logger{35} - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="FILE" />
  </root>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 定义动态的变量

通过define标签定义变量,name为变量的值,class为PropertyDefiner接口的实现类,其中的属性是将会通过setter注入这个类,最后这个类的getPropertyValue()方法将为name对应的值。

目前已经有的实现类:

  • FileExistsPropertyDefiner 变量为主机名
  • ResourceExistsPropertyDefiner 校验文件是否存在
  • CanonicalHostNamePropertyDefiner 校验资源是否存在

可间一般用于动态获取一些值。

<configuration>

  <define name="rootLevel" class="a.class.implementing.PropertyDefiner">
    <shape>round</shape>
    <color>brown</color>
    <size>24</size>
  </define>
 
  <root level="${rootLevel}"/>
</configuration>
1
2
3
4
5
6
7
8
9
10

# 条件判断

需要依赖Janino库,支持嵌套

<dependency>
  <groupId>org.codehaus.janino</groupId>
  <artifactId>janino</artifactId>
  <version>3.0.6</version>
</dependency>
1
2
3
4
5

例子:

其中property可以简写为p,语法和java中字符串语法一样

<configuration debug="true">

  <if condition='property("HOSTNAME").contains("torino")'>
    <then>
      <appender name="CON" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%d %-5level %logger{35} - %msg %n</pattern>
        </encoder>
      </appender>
      <root>
        <appender-ref ref="CON" />
      </root>
    </then>
  </if>

  <appender name="FILE" class="ch.qos.logback.core.FileAppender">
    <file>${randomOutputDir}/conditional.log</file>
    <encoder>
      <pattern>%d %-5level %logger{35} - %msg %n</pattern>
   </encoder>
  </appender>

  <root level="ERROR">
     <appender-ref ref="FILE" />
  </root>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# 从JNDI中获取变量

从JNDI中检索一个AppName的值,赋值给contextName。

<configuration>
  <insertFromJNDI env-entry-name="java:comp/env/appName" as="appName" />
  <contextName>${appName}</contextName>

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d ${CONTEXT_NAME} %level %msg %logger{50}%n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="CONSOLE" />
  </root>
</configuration>
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 配置引入

可以通过include标签引入一个配置从其他xml中

include:可以多种方式

  • resource:类路径
  • url:web
  • file: 文件路径

include如果引入文件不存在,则会报告这个错误信息,如果想不报,可以使用属性 optional="true"

<configuration>
  <include file="src/main/java/chapters/configuration/includedConfig.xml"/>

  <root level="DEBUG">
    <appender-ref ref="includedConsole" />
  </root>

</configuration>
1
2
3
4
5
6
7
8

includedConfig.xml:

<included>
  <appender name="includedConsole" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>"%d - %m%n"</pattern>
    </encoder>
  </appender>
</included>
1
2
3
4
5
6
7

# 日志级别改变传播器

0.9.25版本开始, logback-classic附带了LevelChangePropagator,是LoggerContextListener的实现类,用于监控日志等级改变,然后传输到java.util.logging框架中,这种传播消除了禁用日志语句对性能的影响

<configuration debug="true">
  <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator"/>
  .... 
</configuration>
1
2
3
4

设置resetJUL属性来实现日志等级改变时重置jcl。

<configuration debug="true">
  <contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
    <resetJUL>true</resetJUL>
  </contextListener>
  ....
</configuration>
1
2
3
4
5
6

# 参考

Chapter 3: Logback configuration (opens new window)

在 GitHub 编辑此页 (opens new window)
上次更新: 2024/02/25, 12:11:11
logback的配置
logback中的Appender

← logback的配置 logback中的Appender→

Theme by Vdoing | Copyright © 2018-2024 unclezs
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式