• 【Python】发布一个简单好用的日志记录器bestlog


    需求

    日志是非常重要的一个东西,我们往往习惯于在开发一个新项目的第一行代码时,就用 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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    日志输出效果:

    [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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    你可以指定日志保存的路径,日志默认的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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    日志输出效果:

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

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

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

  • 相关阅读:
    让Ansible更安全:使用Vault进行加密
    神经网络的基本特性有,简述什么是神经网络
    p38 2带头结点单链表删除所有x元素
    Git版本控制管理——补丁
    vscode类似GitHub Copilot的插件推荐
    Flink技术简介与入门实践
    图扑数字孪生洗煤厂,低代码构建云端工厂
    Jmeter接口自动化(三)逻辑控制器
    必看:阿里云99元服务器原价续费,你肯定不知道!
    深入理解Java集合框架:构建高效、灵活的数据管理方案
  • 原文地址:https://blog.csdn.net/CharlesSimonyi/article/details/127957125