日志库的设计思路

一、基本思路

日志库的设计,抓住最核心的一条,就是日志从产生到到达最终目的地期间的处理流程。
一般而言,为了设计一个灵活可扩展,可配置的日志库,可将日志库抽象为4个部分:记录器、过滤器、格式化器、输出器四部分。

  • 记录器——负责产生日志记录的原始信息,比如(原始信息,日志等级,时间,记录的位置)等信息
  • 过滤器——负责按指定的过滤条件过滤掉我们不需要的日志(比如按日志等级过滤)
  • 格式化器——负责对原始日志信息按照我们想要的格式去格式化
  • 输出器——负责将将要进行记录的日志(一般经过过滤器及格式化器的处理后)记录到日志目的地(例如:输出到文件中)

通过将日志库分为4个抽象,使之成了一个较为灵活可扩展的日志库。比如你想实现输出到文件和输出到TCP中这两个功能,你只需分别实现这两个输出器的实例即可。

实现了上面的抽象就基本实现日志库的核心功能。在具体实现上,需要设计一个Logger,将上面的抽象组合起来。另外还有一些其他的工作需要完善,比如读取日志配置文件,根据配置文件中的配置条件去构建相应的代码等等其他工作。

二、一条日志的生命周期

可能到目前对日志库是怎么工作的还有些模糊,下面以一条日志的生命周期为例来说明日志库是怎么工作的:

  1. 产生。info!("log information.");
  2. 经过记录器。记录器去获取日志发生的时间,位置,线程信息等等信息,会有一个数据结构去存储你需要的信息(例如:msg:"log information.",time:2018-3-20 10:00:00,level:info,location:main.rs:3 lines
  3. 经过过滤器。决定是否记录(例如,过滤条件设为info级以下的过滤掉,这里条日志信息等级是info,满足条件,继续。)
  4. 经过格式化器。假设我们想输出为2018-3-22 10:00:00 [info] log information.
  5. 到输出器。例如输出到文件中,我们就将这条信息写到文件上(File::write(....);,文件中会记录2018-3-22 10:00:00 [info] log information.).
  6. 假如你还实现了日志回滚等功能的话,在日志写入文件之后,还要判断是否触发日志回滚操作,如果满足了日志回滚的条件(比如文件Size超过某一大小),则进行日志回滚操作。
  7. 这条日志的生命周期结束了。

三、伪代码实现:

  1. 从配置文件中读取配置(可通过序列化或其他方式),生成Config。
  2. LoggerBuilder根据Config去构造Logger。
  3. 由Logger实现日志库的核心功能。
//配置
struct Config {
    level:Level,
    ...
}

//Logger建造者
struct LoggerBuilder {
    ...
}

//Logger
struct Logger {
    record:Recorder,
    filter:Filter,
    formater:Formater,
    output:Output,
}
......

四、更多功能细节

上面是日志库设计的主干,可能我们还需要更多的功能,比如日志回滚、运行时修改配置等......

对于日志回滚,可抽象为两部分,一个是触发回滚操作的条件,一个是何种具体的回滚操作。比如,我们希望当文件大小为1G时就触发回滚操作,回滚的具体操作是删除旧的内容从新开始记录。这里需要你做的就是实现(触发条件+具体操作)这两个抽象。

对于运行时修改配置,实质是根据最新的配置重新生成日志实例,具体实现时可设置一个定时器,定时去读取新的配置,依据新的配置重新生成日志实例,再用这个日志实例记录日志......

五、后记

是不是设计日志库的时候功能越多越好呢?个人认为不是的,功能越多,抽象越复杂,代码越臃肿,比如日志回滚功能的实现,实现过程中会不可避免的增加了锁等,造成性能的下降,所以,够用就好。

各种语言对应的日志库已经有很多了,一般都能够满足需要,如果不满需要,也可以加以扩展已满足自己的项目需要。

原文地址:https://www.cnblogs.com/s-lisheng/p/11249130.html

时间: 2024-10-10 23:52:34

日志库的设计思路的相关文章

C++的开源跨平台日志库glog学习研究(二)--宏的使用

上一篇从整个工程上简单分析了glog,请看C++的开源跨平台日志库glog学习研究(一),这一篇对glog的实现代码入手,比如在其源码中以宏的使用最为广泛,接下来就先对各种宏的使用做一简单分析. 1. 日志输出宏 这里我们以一条最简单的日至输出为例说明: LOG(WARNING) << "This is a warning message"; 这里LOG是一个宏,其定义如下(logging.h line 487): #define LOG(severity) COMPACT

数据库水平切分的原理探讨、设计思路--数据库分库,分表,集群,负载均衡器

本文转载:http://www.cnblogs.com/olartan/archive/2009/12/02/1615131.html 第1章  引言 数据量巨大时,首先把多表分算到不同的DB中,然后把数据根据关键列,分布到不同的数据库中.库分布以后,系统的查询,io等操作都可以有多个机器组成的群组共同完成了.本文主要就是针对,海量数据库,进行分库.分表.负载均衡原理,进行探讨,并提出解决方案. 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互联网应用,每

数据库架构设计思路

一 .58同城数据库架构设计思路 (1)可用性设计 解决思路:复制+冗余 副作用:复制+冗余一定会引发一致性问题 保证"读"高可用的方法:复制从库,冗余数据,如下图  带来的问题:主从不一致 解决方案:见下文 保证"写"高可用的一般方法:双主模式,即复制主库(很多公司用单master,此时无法保证写的可用性),冗余数据,如下图  带来的问题:双主同步key冲突,引不一致 解决方案: a)方案一:由数据库或者业务层保证key在两个主上不冲突 b)方案二:见下文 58同

C基础 多用户分级日志库 sclog

引言 - sclog 总的设计思路 sclog在之前已经内置到simplec 简易c开发框架中一个日志库. 最近对其重新设计了一下. 减少了对外暴露的接口. 也是C开发中一个轮子. 比较简单, 非常适合学习理解,最后自己写一个自己喜欢的日志库. 首先分析分级设计的总的思路. 主要是围绕上面思路设计. 分6个等级. 2中类型的日志文件. sc.log 普通文件, 什么信息都接受, sc.log.wf只接受异常信息. 需要紧急处理的. 继续说明日志消息体的设计思路 到这里设计的总思路已经清楚了. 后

互联网数据库架构设计思路

一 .58同城数据库架构设计思路 (1)可用性设计 解决思路:复制+冗余 副作用:复制+冗余一定会引发一致性问题 保证"读"高可用的方法:复制从库,冗余数据,如下图   带来的问题:主从不一致 解决方案:见下文 保证"写"高可用的一般方法:双主模式,即复制主库(很多公司用单master,此时无法保证写的可用性),冗余数据,如下图   带来的问题:双主同步key冲突,引不一致 解决方案: a)方案一:由数据库或者业务层保证key在两个主上不冲突 b)方案二:见下文 5

对RESTful Web API的理解与设计思路

距离上一篇关于Web API的文章(如何实现RESTful Web API的身份验证)有好些时间了,在那篇文章中提到的方法是非常简单而有效的,我在实际的项目中就这么用了,代码经过一段时间的磨合,已经很稳定了,所以我打算写篇总结,并在最近这段时间里提供一个ASP.net Web API的综合例子. 对四个HTTP方法的理解 众所周知,HTTP有四个方法,GET.POST.PUT和DELETE,分别对应数据库的SELECT.INSERT.UPDATE和DELETE,一般的教程说到这里也就Over了,

Redis设计思路学习与总结

版权声明:本文由宋增宽原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/222 来源:腾云阁 https://www.qcloud.com/community 宋增宽,腾讯工程师,16年毕业加入腾讯,从事海量服务后台设计与研发工作,现在负责QQ群后台等项目,喜欢研究技术,并思考技术演变,专注于高并发业务架构的设计与性能优化. 下半年利用空余时间研究和分析了部分Redis源码,本文从网络模型.数据结构和内存管理.持久化和多机

Backbone设计思路和关键源码分析

一. Backbone的江湖地位: backbone作为一个老牌js框架为大规模前端开发提供了新的开发思路:前端MVC模式,这个模式也是前端开发演变过程中的一个重要里程碑,也为MVVM和Redux等开发思路奠定了夯实的基础,后来的react,vue无不是在backbone的影响下开创出来的经典模式.为什么这么说呢?我们先来回顾下Web前端开发的大概演变流程,本过程纯粹个人理解,抛砖引玉,共同探讨,如有偏差请看官指出错误: 1. 无前端:最早的网页就是HTML,还只是静态页面,当时的脚本含量极少甚

这个用js写的“智能推荐”插件设计思路别具一格啊

现在"智能推荐"几乎成了一个内容网站的标配,为了提高用户的滞留时间,就需要想办法搞些新花样.比如用户文章读到最后时,把用户感兴趣的文章列出来,美其名曰:猜你喜欢. 现在,如果小编出10000美刀,让你来实现这个智能推荐功能,你会怎么去做呢?根据常理,思路是不是应该是这样的? 1.设计一张tag表,每篇文章都有相应的tag,这样就可以根据tag给读者推荐相似的文章. 2.给每个用户设计一张用户自画像算法,根据算法去分析每篇文章,然后把相关文章推荐给用户. 实话说,要做好的话非常不容易,估