前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python logging 使用记录:设置INFO级别不生效,格式化,输出到文件

python logging 使用记录:设置INFO级别不生效,格式化,输出到文件

作者头像
Happyjava
发布2020-12-02 10:00:53
2.7K0
发布2020-12-02 10:00:53
举报
文章被收录于专栏:Happy的分享Happy的分享

错误示范

代码语言:javascript
复制
import logging

log = logging.getLogger()
log.setLevel(logging.INFO)
log.info("INFO INFO INFO")
log.warning("这是WARN")
代码语言:javascript
复制
# 输出
D:\workspace\investment\venv\Scripts\python.exe D:/workspace/python-common/basic/logging_test.py
这是WARN

没有输出INFO的日志级别。默认是WARN级别的日志,这里没有输出WARN说明没有设置成功。

设置一个handler

代码语言:javascript
复制
import logging

if __name__ == '__main__':
    log = logging.getLogger()
    handler = logging.StreamHandler()
    log.addHandler(handler)
    log.setLevel(logging.INFO)
    log.info("这是INFO-1")

这时可以正常输出INFO了

logging.getLogger() 和 logging.getLogger(name)

代码语言:javascript
复制
import logging

if __name__ == '__main__':
    log = logging.getLogger()
    handler = logging.StreamHandler()  # StreamHandler是输出到控制台
    log.addHandler(handler)
    log.setLevel(logging.INFO)
    log.info("这是INFO-1")

    logger = logging.getLogger()
    logger.info("这是INFO-2")
image
image

此时第二个logger也被设置了INFO级别了,查看源码:

image
image

可以看到名字为None时返回的是一个root对象,这也是为什么第二个logger也被修改的原因。

日志输出位置

常见的输出到控制台和文件

代码语言:javascript
复制
import logging

if __name__ == '__main__':
    log = logging.getLogger("console-logger")
    handler = logging.StreamHandler()
    log.addHandler(handler)
    log.setLevel(logging.INFO)
    log.info("这是INFO-1")

    log2 = logging.getLogger("file-logger")
    file_handler = logging.FileHandler("E:/test.log")
    log2.addHandler(file_handler)
    log2.setLevel(logging.WARNING)
    log2.info("这个不会被记录")
    log2.warning("警告警告~~~~")

设置格式

默认只是输出了message,这样子还不如直接用print()函数了。所以还需要格式化一下:

image
image

设置格式化要用到logging.Handler

代码语言:javascript
复制
import logging


def print_name(logger, name):
    logger.info("name={}".format(name))


if __name__ == '__main__':
    log = logging.getLogger("console-logger")
    handler = logging.StreamHandler()
    handler.setFormatter(logging.Formatter("%(asctime)s %(filename)s %(funcName)s[line:%(lineno)d]%(levelname)s - %(message)s"))
    log.addHandler(handler)
    log.setLevel(logging.INFO)
    log.info("这是INFO-1")
    print_name(log, "happyjava")
复制代码

输出效果:

image
image

formatter参数

代码语言:javascript
复制
#     format参数中可能用到的格式化串
#     %(name)s Logger的名字
#     %(levelno)s 数字形式的日志级别
#     %(levelname)s 文本形式的日志级别
#     %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
#     %(filename)s 调用日志输出函数的模块的文件名
#     %(module)s 调用日志输出函数的模块名
#     %(funcName)s 调用日志输出函数的函数名
#     %(lineno)d 调用日志输出函数的语句所在的代码行
#     %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
#     %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
#     %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
#     %(thread)d 线程ID。可能没有
#     %(threadName)s 线程名。可能没有
#     %(process)d 进程ID。可能没有
#     %(message)s用户输出的消息
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 设置一个handler
  • logging.getLogger() 和 logging.getLogger(name)
  • 日志输出位置
  • 设置格式
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档