从01开始 从01开始
首页
  • 计算机简史
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • MySQL
  • Git
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC基础
  • SpringBoot

    • SpringBoot基础
  • Windows使用技巧
  • 输入法
  • 浏览器
  • 终端软件
  • 装机
  • 笔记类软件
  • Markdown
  • 微信
  • 各大平台
  • RSS
  • WPS
  • 手机
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 教程简介
  • 英语学习方法论
  • 字母
  • 音标
  • 单词
  • 语法
  • 英语兔的相关视频
  • Larry想做技术大佬的相关视频
  • 驾驶技能
  • 住房相关
  • 厨艺
  • 关于税
  • 理财
  • 睡眠
  • 皮肤
  • 口腔健康
  • 学会呼吸
  • 健身日志
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • 三国杀
  • 网站介绍
  • 关于我
  • 网站动态
  • 友人帐
  • 打赏
  • 如何搭建一个博客
  • 关于邮件服务器
  • 本站的分享资料
  • 年度总结

    • 2022 年度总结
    • 2023 年度总结
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

PeterJXL

首页
  • 计算机简史
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • MySQL
  • Git
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC基础
  • SpringBoot

    • SpringBoot基础
  • Windows使用技巧
  • 输入法
  • 浏览器
  • 终端软件
  • 装机
  • 笔记类软件
  • Markdown
  • 微信
  • 各大平台
  • RSS
  • WPS
  • 手机
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 教程简介
  • 英语学习方法论
  • 字母
  • 音标
  • 单词
  • 语法
  • 英语兔的相关视频
  • Larry想做技术大佬的相关视频
  • 驾驶技能
  • 住房相关
  • 厨艺
  • 关于税
  • 理财
  • 睡眠
  • 皮肤
  • 口腔健康
  • 学会呼吸
  • 健身日志
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • 三国杀
  • 网站介绍
  • 关于我
  • 网站动态
  • 友人帐
  • 打赏
  • 如何搭建一个博客
  • 关于邮件服务器
  • 本站的分享资料
  • 年度总结

    • 2022 年度总结
    • 2023 年度总结
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • JavaSE

  • JavaSenior

  • JavaEE

    • JavaEE概念

    • Ant

    • Maven

    • 日志

      • 日志介绍
      • print大法
      • 常见的日志框架-简单介绍
      • 一个日志框架的设计
        • 前言
        • 设计思路
        • 正交性
      • JDK Logging
      • log4j2 笔记
      • 日志的一些小技巧
      • 日志系统小结
    • Junit

    • JDBC

    • XML和JSON

  • JavaWeb

  • Spring

  • 主流框架

  • SpringMVC

  • SpringBoot

  • Java
  • JavaEE
  • 日志
2022-12-03
目录

一个日志框架的设计

# 03.一个日志框架的设计

日志框架内部的原理

# 前言

在介绍具体的框架怎么使用之前,我们先介绍其设计思路,这有助于我们理解和使用他们。

一个日志框架,如果让你来设计?应该怎么做?

首先得明确需求,这个框架应该能做什么:

  1. 除了能将日志打印到控制台,还能打印到文件,甚至可以通过网络发送邮件或 发到数据库里去存储。
  2. 日志应该能格式化输出。例如txt纯文本,xml格式甚至HTML格式等
  3. 日志内容应该有标准。例如代码执行的时间,执行的函数是什么,结果是什么,不能乱打一气
  4. 日志应该能够分级(前面我们讲过日志的级别)
  5. 对于不同的package,甚至不同的class,能灵活的输出到不同的地方。例如对于error的日志,则打印到error.log,对于成功的日志,则打到success.log
  6. ...................................

本文主要参考了《码农翻身》的一个小片段: 一个著名的日志系统是怎么设计出来的? (opens new window),已获得作者授权。

‍

# 设计思路

既然是在Java中,首先得有个类用来表示日志的概念;一个是时间戳,一个是日志内容,我们称这个类为Logger。这样,用户在打印日志的时候,就可以用logger提供的方法

‍

第一,既然要能将日志打印到多个地方,那么可以写个接口,具体的实现依靠子类:

取名叫Appender,指可以不断的追加(append)日志。

‍

第二和第三,日志能格式化输出,那么同理,定义一个Formatter接口,具体的实现依赖于子类,里面包含了日期格式化等方法

‍

‍

第四,既然日志要分级,就定义一个常量类即可,里面分别有几个常量标书不同的级别。级别有高低之分。

‍

‍

第五,对于不同的package,甚至不同的类,如何做到输出的地方不同呢?在定义logger的时候传入包名或类名!

private static Logger logger = Logger.getLogger("com.peterjxl.logging");
1

‍

‍

‍

‍

# 正交性

‍

以下内容来自一个著名的日志系统是怎么设计出来的? (opens new window)

如果你把Logger, Appender, Formatter看成坐标系中的X轴,Y轴,Z轴,这三者可以独立变化而不互相影响

可以任意扩展Appender接口而影响不到Logger和Formatter, 无论有多少个Logger 都影响不了Appender和Formatter , 这就是正交

图片

当你从系统中提取出正交的概念的时候,那就威力无比了,因为变化被封装在了一个维度上,你可以把这些概念任意组合,而不会变成意大利面条似的代码。

图片

‍

‍

在 GitHub 上编辑此页 (opens new window)
上次更新: 2024/3/24 02:47:36
常见的日志框架-简单介绍
JDK Logging

← 常见的日志框架-简单介绍 JDK Logging→

Theme by Vdoing | Copyright © 2022-2024 粤ICP备2022067627号-1 粤公网安备 44011302003646号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式