需求
日志是非常重要的一个东西,我们往往习惯于在开发一个新项目的第一行代码时,就用 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具有如下特性:
-
把日志内容同时输出到文件和stdout,每行日志有具体时间、level、tag、和消息内容
-
每天的日志自动切割成一个独立的文件(否则几十天的日志在一个文件里,打开文件都头疼)
-
根据设定,自动清理日期过老的日志(非常重要,生产环境中,有的人往往不注意这点,突然有一天服务器就死机了,原来是日志文件过多,一年多的日志都堆在那里,可用磁盘空间都为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文件夹),可以找到对应的日志文件:
而且日志文件会自动按天分割哦
灵感
之所以发布【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功能,主要用于多线程、多任务、多账号的程序,用于在日志中区分,是哪个线程、哪个任务、哪个账号出了问题。
这点在我们的一些链游开源项目中可以看到它的用途,因为一个脚本运行起来以后,需要处理上百个不同的账号,有了 tag 我们才好从日志中区分,是哪个账号,出了什么问题。