需求

日志是非常重要的一个东西,我们往往习惯于在开发一个新项目的第一行代码时,就用 logging.info 代替 print,随时保持记录的好习惯,等代码上线以后也无需修改替换那些 print,直接开跑,有了完善的日志,才便于分析生产环境中遇到的异常问题。

python的【logging】已经很好用了,但是对于新手和非python为主语言的开发者来说,第一次使用它,配置起来还是麻烦了点。

一个Logger的初始化,还需要一个Handler和一个Formatter,如果你想节约了解它的时间,那么最简单的方法就是使用【bestlog】

【bestlog】项目地址:https://github.com/encoderlee/bestlog

其实我原本想命名为【easylog】,更符合它的定义,奈何这个名字已经在pypi上面存在,只能换一个名字,再尝试构思了多个名字并且发现命名冲突后,只得取了这个名字【bestlog】

【bestlog】是什么

简单来说,它是一个预先配置好的Logger,开箱即用,你不需要管标准库【logging】中的Logger怎么配置,它已经帮你配置好了最常见的一种用法,可以满足80%的小型项目应用场景。

由【bestlog】生成的这个Logger具有如下特性:

  1. 把日志内容同时输出到文件和stdout,每行日志有具体时间、level、tag、和消息内容
  2. 每天的日志自动切割成一个独立的文件(否则几十天的日志在一个文件里,打开文件都头疼)
  3. 根据设定,自动清理日期过老的日志(非常重要,生产环境中,有的人往往不注意这点,突然有一天服务器就死机了,原来是日志文件过多,一年多的日志都堆在那里,可用磁盘空间都为0了)

【bestlog】怎么用

先从pypi安装【bestlog】

pip install bestlog

只需要一行代码就可以得到令我们满意的Logger

from bestlog import logger

log = logger.get("test")

def main():
    log.info("what the fuck")

if __name__ == '__main__':
    logger.init("test")
    main()

日志输出效果:

[2022-11-16 21:37:06,032][INFO]: what the fuck

同时我们可以在默认路径下(当前目录的logs文件夹),可以找到对应的日志文件:

Sentry Python 实时日志平台默认密码 python 日志工具_logging


而且日志文件会自动按天分割哦

Sentry Python 实时日志平台默认密码 python 日志工具_日志_02

灵感

之所以发布【bestlog】,是因为在我们的多个Python项目中,习惯于使用 logging.info 代替 print,所以每个项目都带了一个名为【logger.py】的模块,但是每次都把这个模块拷贝来拷贝去的,非常麻烦,于是我们想到了发布到pypi上,方便自己使用,也方便大家。

配置

from bestlog import logger
import logging

logger.default_log_path = "/var/log/test/"
logger.default_log_level = logging.DEBUG
logger.default_backup_days = 30

log = logger.get("test")

def main():
    log.debug("what the fuck")

if __name__ == '__main__':
    logger.init("test")
    main()

你可以指定日志保存的路径,日志默认的Level,日志默认的保留天数(默认为0,无限制天数)

当然,这些参数不仅仅可以设置全局默认值,也可以在初始化Logger的时候,即调用 logger.init() 的时候,通过 init() 的参数来指定,这样可以做到每个 Logger 不一样的配置,输出到不同的目录。

Tag

from bestlog import logger

class Worker:
    def __init__(self, name):
        self.name = name
        self.log = logger.get("test", name)

    def do_something(self):
        self.log.info("hello")

def main():
    worker1 = Worker("bob")
    worker2 = Worker("jack")
    worker1.do_something()
    worker2.do_something()

if __name__ == '__main__':
    logger.init("test", tag = True)
    main()

日志输出效果:

[2022-11-16 21:42:49,469][INFO][bob]: hello
[2022-11-16 21:42:49,470][INFO][jack]: hello

【bestlog】还有一个Tag功能,主要用于多线程、多任务、多账号的程序,用于在日志中区分,是哪个线程、哪个任务、哪个账号出了问题。

Sentry Python 实时日志平台默认密码 python 日志工具_logger_03


这点在我们的一些链游开源项目中可以看到它的用途,因为一个脚本运行起来以后,需要处理上百个不同的账号,有了 tag 我们才好从日志中区分,是哪个账号,出了什么问题。