从事服务器程序开发的工程师们,几乎不可避免地需要使用到日志系统(Logging System)。
如果从头开发一个服务器程序,我们有若干开源的日志系统可供选择,例如:Java语言中,Log4j是个不错的选择;Python语言中,有logging类;C语言中,有:Log4c、libqb等。
这些开源的日志系统,几乎都使用到相同的设计模式,不同之处在于实现语言、实现方法,以及附加的一些额外功能。今天,我想介绍一下这个共通的设计模式,这会有助于我们用好这些开源的日志系统,或改进它们。
这些日志系统,包含三个要素:
- content: 日志的内容,通过在代码中调用日志接口,如log_printf("xxx"),向日志系统传递内容
- target: 日志的目标,即日志写到什么地方,例如可以同时写到stderr/syslog/xxx.log
- filter: 日志过滤规则,用于决定每一条日志能否输出到某个目标上
一个日志系统,可以定义多个日志目标;每个日志目标,有属于它自己的若干条过滤规则。
当日志系统,通过日志接口,接收到一条日志内容后(content),它做以下处理:
for t in targets; { pass = False; for f in t.filters; { if content satisfies f; { pass = True; break; } } if (pass) { print con