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的架构
        • 模块划分
        • Logger,Appenders 和 Layouts
          • Logger
          • Appender
          • Layout
        • 参数化打印日志
        • 从一次 log.info()的过程
        • 参考
      • logback的配置
      • logback配置文件语法
      • logback中的Appender
      • logback配置中的Encoder
      • logback中的Layouts
      • logback中的Filter
      • logback中使用MDC
      • logback源码分析
      • 好看的彩色日志输出
    • 单元测试

    • JVM

    • Spring

    • SpringBoot

    • 一些工具

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

logback的架构

# 模块划分

当前 logback 被分为了三个模块

  • logback-core,为其他两个模块提供基础功能
  • logback-classic,是一个相对于 log4j 的显著改进版本,实现了 slf4j 的 api,所以可以轻松的切换其他日志框架,比如 jul
  • logback-access.提供了 servlet 容器的 http 访问日志记录的功能

# Logger,Appenders 和 Layouts

这个 logback 建立在这三个主要的类上面,这三个组件提供了,允许开发着在选择何种等级的日志(Appenders) 、控制日志的格式(Layouts)、和在哪里打日志(logger)

Logger 是在 logback-classic 中的、Appenders 和 Layouts 是在 logback-core 中的。

# Logger

# 名称继承

通常情况下,我们给 Logger 命名都是通过类的全限定类名。

LoggerContext 负责创建 Logger,并且按照树一样的格式来进行管理,所以 Logger 也是分等级的,root logger 就是顶端,分级规则也很简单,就是通过一个英文点来进行分,比如 com.unclezs.log,名字为 com.unclezs 的 Logger 就比名字为 com.unclezs.log 的 Logger 等级高。

获取 root logger:

Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
1

# 日志级别与继承的关系

slf4j 提供的日志级别 TRACE, DEBUG, INFO, WARN 和 ERROR

TRACE < DEBUG < INFO < WARN < ERROR.

获取日志的有效等级,当一个 log.xx 方法执行时,如果当前命名空间没有对应 Level,就会根去查找祖先节点的日志级别,直到找到为止

判断日志是否会被打印:

摘自官方文档:

A log request of level p issued to a logger having an effective level q, is enabled if p >= q.

比如 com.unclezs.a 配置的 logger 日志级别为 info com.unclezs.a.b 配置的 logger 日志级别为 error 在 com.unclezs.a.b 调用 log.warn

得到有效日志等级为 error,请求日志等级为 warn,warn < error 则不打印

# 检索 Logger

通常情况下我们都是通过 Clazz.class 来获取 Logger,但是也可以传入他的全限定类名。

当然这个名字都是自己定义的,你可以命名为 abc,bcd 之类的,但是没有什么意义,安装全限定类名进行命名可以很好的利用日志级别按照名称继承等级的好处。

# Appender

Appender 允许我们将日志打到各种地方,可以是控制台,可以是文件,也可以是数据库、JML 等等

一个 logger 可以拥有多个 Appender,并且都会执行,所以你可以通过一个 logger 就能把日志打到控制台和文件。

Appender 也是有累加性质的,也就是会查看父及 logger 有没有 Appender ,如果有,则一起执行。可以在 logger 上配置 additivity=false 来关闭这个特性。

# Layout

Appender 的子节点,定义日志的格式。

%-4relative [%thread] %-5level %logger{32} - %msg%n
1

输出

176  [main] DEBUG manual.architecture.HelloWorld2 - Hello world.
1

第一个参数代表程序启动后所过时间。

# 参数化打印日志

下面这种方式会引起 不论是否启用日志记录,都会有构造消息参数的消耗(类型转换)

logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
1

通常情况下通过下面这种防止来防止消息参数的构造消耗,但是通过这种方法如果日志是开启的情况下,还是会出现同样的情况,甚至还多了个 boolean 类型的判断消耗

if(logger.isDebugEnabled()) {
  logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
}
1
2
3

更好的方案,这样的操作的好处就是,在不进行日志打印的时候,不会进行消息参数构造,也就不会有类型转换的消耗。

logger.debug("The new entry is {}.", entry);
logger.debug("Value {} was inserted between {} and {}.", paramArray);
1
2

# 从一次 log.info()的过程

# 参考

Chapter 2: Architecture (opens new window)

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

← logback介绍 logback的配置→

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