V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zhijieju
V2EX  ›  Python

GitHub:你的日志记录方式何必是 logging!

  •  
  •   zhijieju · 2020-07-15 22:08:45 +08:00 · 1836 次点击
    这是一个创建于 1627 天前的主题,其中的信息可能已经有所发展或是发生改变。

    hello,小伙伴们,大家好,今天给大家介绍的开源项目是:loguru,这个开源项目是一个Python简易日志库,这个开源项目的宗旨是通过添加一系列有用的功能来解决标准记录器的注意事项,从而减少 Python日志记录的痛苦。

    我们使用 logging 的配置方法基本上是这样的:

    import logging
    
    logging.basicConfig(
        filename='test.log',
        level=logging.DEBUG,
        format='[line:%(lineno)d] - %(funcName)s: %(asctime)s - %(levelname)s - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S',
    )
    

    使用官方自带的logging模块,每次创建项目都要自己去配置一下才可以,经常码代码使用起来有点吗发,但是使用这个loguru模块,只需要两行代码即可完成以上配置,简单易用。

    安装


    pip install loguru
    

    使用方法


    最简单的使用方法,只需要倒入模块,然后 debug 输出,看控制台效果即可。

    from loguru import logger
    
    logger.debug("That's it, beautiful and simple logging!")
    

    打印在控制台中是彩色的!

    如果你的终端兼容,loguru 会自动为日志添加颜色。你可以通过使用接收器格式的标记标签来定义自己喜欢的样式。

    logger.add(sys.stdout, colorize=True, format="<green>{time}</green> <level>{message}</level>")
    

    输出到文件中

    只需要添加一行代码即可

    from loguru import logger
    
    # 添加到名为 demo.log 文件中
    logger.add("demo.log")
    logger.debug("That's it, beautiful and simple logging!")
    

    输出到文件中

    以时间为文件名分割日志,可以这样做:

    from loguru import logger
    
    # 以时间分割日志
    logger.add('file_{time}.log')
    
    logger.debug("That's it, beautiful and simple logging!")
    

    效果展示(看文件名称)

    文件控制的高级用法


    logger.add("rotation.log", rotation="500 MB")
    

    以上配置可以实现每 500MB 存储一个文件,每个 log 文件过大就会新创建一个 log 文件。我们在配置 log 名字时加上了一个 time 占位符,这样在生成时可以自动将时间替换进去,生成一个文件名包含时间的 log 文件。

    我们也可以使用rotation参数实现定时创建 log 文件,例如:

    logger.add('runtime_{time}.log', rotation='12:00')
    

    这样就是实现每天 12 点新创建一个 log 文件输出了。

    另外我们也可以配置 log 文件的循环时间,比如每隔两周创建一个 log 文件,写法如下:

    logger.add('runtime_{time}.log', rotation='2 week')
    

    这样我们就可以实现两周创建一个 log 文件了。

    不知道大家有没有遇到过这样的情况,很多情况下,一些非常久远的 log 对我们来说并没有什么用处了,它白白占据了一些存储空间,不清除掉就会非常浪费。retention 这个参数可以配置日志的最长保留时间。

    比如我们想要设置日志文件最长保留 7 天,可以这么来配置:

    logger.add('runtime.log', retention='7 days')
    

    这样 log 文件里面就会保留最新 7 天的 log,老师再也不用担心 log 沉积的问题。

    loguru 还可以配置文件的压缩格式,比如使用 zip 文件格式保存,如下:

    logger.add('runtime.log', compression='zip')
    

    这样可以更加节省存储空间。

    字符串输出

    logger.info('If you are using Python {}, prefer {feature} of course!', 3.6, feature='f-strings')
    

    这样在添加参数就非常方便了。

    Traceback 记录

    在很多情况下,如果遇到运行错误,而我们在打印输出 log 的时候万一不小心没有配置好 Traceback 的输出,很有可能我们就没法追踪错误所在了。

    但用了 loguru 之后,我们用它提供的装饰器就可以直接进行 Traceback 的记录,类似这样的配置即可:

    @logger.catch
    def my_function(x, y, z):
        # An error? It's caught anyway!
        return 1 / (x + y + z)
    

    我们做个测试,我们在调用时三个参数都传入 0,直接引发除以 0 的错误,看看会出现什么情况:

    my_function(0, 0, 0)
    

    运行完毕之后,可以发现 log 里面就出现了 Traceback 信息,而且给我们输出了当时的变量值,真的是不能再赞了!结果如下:

    > File "run.py", line 15, in <module>
        my_function(0, 0, 0)
        └ <function my_function at 0x1171dd510>
    
      File "/private/var/py/logurutest/demo5.py", line 13, in my_function
        return 1 / (x + y + z)
                    │   │   └ 0
                    │   └ 0
                    └ 0
    
    ZeroDivisionError: division by zero
    

    根据需要进行结构化日志记录


    希望对日志进行序列化以便于解析或传递日志?使用该serialize参数,每条日志消息在发送到已配置的接收器之前将转换为 JSON 字符串。

    logger.add('file_{time}.log', serialize=True)
    # {"text": "2020-07-15 21:47:33.793 | DEBUG    | __main__:<module>:14 - That's it, beautiful and simple logging!\n", "record": {"elapsed": {"repr": "0:00:00.017317", "seconds": 0.017317}, "exception": null, "extra": {}, "file": {"name": "loguru_demo.py", "path": "/Users/notes/modules/loguru_demo.py"}, "function": "<module>", "level": {"icon": "\ud83d\udc1e", "name": "DEBUG", "no": 10}, "line": 14, "message": "That's it, beautiful and simple logging!", "module": "loguru_demo", "name": "__main__", "process": {"id": 7280, "name": "MainProcess"}, "thread": {"id": 4458839488, "name": "MainThread"}, "time": {"repr": "2020-07-15 21:47:33.793271+08:00", "timestamp": 1594820853.793271}}}
    

    邮件通知


    Loguru 可以轻松地与功能强大的notifiers库结合使用(必须单独安装),以在程序意外失败时接收电子邮件或发送其他多种通知。

    import notifiers
    
    params = {
        "username": "[email protected]",
        "password": "abc123",
        "to": "[email protected]"
    }
    
    # Send a single notification
    notifier = notifiers.get_notifier("gmail")
    notifier.notify(message="The application is running!", **params)
    
    # Be alerted on each error message
    from notifiers.logging import NotificationHandler
    
    handler = NotificationHandler("gmail", defaults=params)
    logger.add(handler, level="ERROR")
    

    或者配合ES使用

    ####~~比内置日志记录快 10 倍~~ 尽管在大多数情况下,日志记录对性能的影响可以忽略不计,但零成本的日志记录器将允许在任何地方使用它而无需过多担心。在即将发布的版本中,Loguru 的关键功能将以 C 语言实现,以实现最大速度。

    以上就是loguru的基本用法了,感兴趣的小伙伴可以研究一下这个的用法,特别简单易用,赶快去配置到你的项目中吧!

    开源地址: https://github.com/Delgan/loguru

    今天的推荐不知道大家喜欢吗?如果你们喜欢话,请在文章底部留言或点赞,以表示对我的支持,你们的留言,点赞,转发关注是我持续更新的动力哦!

    关注公众号回复:"1024",免费领取一大波学习资源,先到先得哦!

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1933 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 00:53 · PVG 08:53 · LAX 16:53 · JFK 19:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.