scribble

ottocho's blog

Home About GitHub

08 Dec 2013
A Simple Python Logger

一个简单的 python logger

前言

写日志是刚需。而直接 open('filename').write(log) 太笨了。而每次都要去配置一次 logging 又犯懒。

所以实现了一个很简单的 logger 。实现也很简单,代码非常短,它的目的主要是:

  • 直接从模块中的方法获取到配置完成的logger;
  • 日志输出内容加上代码位置;
  • 对日志进行天单位的 rotate;

下面简单讲下在实现上遇到的几个问题。

logger 接口设计

对于此 logger 的接口设计,从一开始就确定如下模式:

import logr

logger = logr.get_logger('test', LOG_DIR, log_level=logging.ERROR)

logger.debug('debug')
logger.info('info')
logger.warning('warning')
logger.error('error')
logger.critical('critical')

这是在实践中总结出来的情况:

  • 配置基本类似,同样的 handler 或者 stream 配置通常是会被重复很多次的,可以直接写入基础库;
  • 而日志名、日志路径、日志级别是经常被改变配置的(或者说,通常只关心这三个配置);
  • 输出代码位置是极度有利于开发的;
  • 接口和 logging 原生保持非常接近的用法,以 logger_name 获取 logger 。

因此在多次改动,最后就如现在的实现结果。

代码位置

需求是输出代码的位置。当前的代码位置可以从当前堆栈信息中获取(ps:traceback.extract_stack()是读代码神器啊)。

由这个文档和我的代码基本可以理解了 traceback 的情况。 trackback

内容拓展

遇到的需求情况是:日志内容头需要加上自定义的内容(如上提到的代码位置信息)。这样的内容也无法利用直接的 FileHandler 来进行拓展。这自然想到利用一个 adapter 来进行拓展。而且,logging 官方也果然进行了类似的支持:Adding contextual information to your logging output

日志 rotate

实际上我更倾向于利用外部的服务(logrotate、logstash)去进行日志的管理(rotation, backup, deletion, etc)。但是如果希望在 python 层级进行这样的工作,logging 官方依旧有进行这样的工作: handlers

logging 的 handlers 功能还是比较全面的,源码实现也很好理解很好读。


【完】

ottocho 2013.12.08


Til next time,
at 22:08

scribble

Home About GitHub