当前位置:   article > 正文

python-logging库

logging库

1.logging模块简介

logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志输出格式等

2.logging库日志级别

级别级别数值使用时机
DEBUG10详细信息,常用于调试
INFO20程序正常运行过程中产生的一些信息
WARNING30警告用户,虽然程序还在正常工作,但有可能发生错误
ERROR40由于更严重的问题,程序已不能执行一些功能了
CRITICAL50严重错误,程序已不能继续运行

默认的日志级别是waring

3.logging模块简单使用

logging模块向控制台输出

  1. # -*- coding: UTF-8 -*-
  2. import logging
  3. # 默认的日志输出级别为warning
  4. # 使用basicConfig()来指定日志输出级别
  5. logging.basicConfig(level=logging.DEBUG)
  6. logging.debug("This is debug info")
  7. logging.info("This is info info")
  8. logging.warning("This is warning info")
  9. logging.error("This is error info")
  10. logging.critical("This is critical info")

控制台输出:
DEBUG:root:This is debug info
INFO:root:This is info info
WARNING:root:This is warning info
ERROR:root:This is error info
CRITICAL:root:This is critical info

Process finished with exit code 0

logging模块输出日志到文件中

  1. # 日志输出到文件,默认是追加,filemode="a";通过设置filemode="w",日志输出先清除文件原有内容再写入
  2. logging.basicConfig(filename="log.txt", level=logging.DEBUG)
  3. logging.basicConfig(filename="log1.txt", filemode="w", level=logging.DEBUG)
  4. logging.debug("This is debug info")
  5. logging.info("This is info info")
  6. logging.warning("This is warning info")
  7. logging.error("This is error info")
  8. logging.critical("This is critical info")

logging模块输出日志,设置输出格式和一些其他信息

  1. logging.basicConfig(format="%(asctime)s %(levelname)s %(filename)s %(lineno)s %(message)s", level=logging.DEBUG)
  2. logging.debug("This is debug info")
  3. logging.info("This is info info")
  4. logging.warning("This is warning info")
  5. logging.error("This is error info")
  6. logging.critical("This is critical info")
  7. #设置时间格式
  8. logging.basicConfig(format="%(asctime)s %(levelname)s %(filename)s %(lineno)s %(message)s",
  9. datefmt="%Y-%m-%d %H-%M-%S", level=logging.DEBUG)
  10. logging.debug("This is debug info")
  11. logging.info("This is info info")
  12. logging.warning("This is warning info")
  13. logging.error("This is error info")
  14. logging.critical("This is critical info")

控制台输出

2021-08-12 23:56:04,650 DEBUG testlogging.py 16 This is debug info
2021-08-12 23:56:04,650 INFO testlogging.py 17 This is info info
2021-08-12 23:56:04,650 WARNING testlogging.py 18 This is warning info
2021-08-12 23:56:04,650 ERROR testlogging.py 19 This is error info
2021-08-12 23:56:04,650 CRITICAL testlogging.py 20 This is critical info


2021-08-12 23-58-26 DEBUG testlogging.py 17 This is debug info
2021-08-12 23-58-26 INFO testlogging.py 18 This is info info
2021-08-12 23-58-26 WARNING testlogging.py 19 This is warning info
2021-08-12 23-58-26 ERROR testlogging.py 20 This is error info
2021-08-12 23-58-26 CRITICAL testlogging.py 21 This is critical info

4.logging的高级应用

logging模块采用了模块化设计,主要包含四种组件:

Logger: 记录器,提供应用程序代码能直接使用的接口;

Handler: 处理器,将记录器产生的日志发送到目的地;

Filter: 过滤器,提供更好的粒度控制,决定哪些日志会被输出;

Formatter: 格式化器,设置日志内容的组成结构和消息字段;

创建一个logger,接着可以创建多个Handler,设置Handler的日志等级,可以创建Formatter来渲染Handler(设置日志输出的格式),将多个Handler添加到logger里,程序调用logger的函数输出日志。可以理解为创建一只笔,为这只笔绑定输出载体(可以一对多),可以是控制台,可以是文件等等,通过格式化器,对笔输出的内容进行格式化处理。

Logger记录器 

1.提供应用程序的调用接口

logger = logging.getLogger(__name__) 

logger是单例的

2.决定日志记录的级别

logger.setLevel()

3.将日志内容传递到相关联的handlers中

logger.addHandler()和logger.removeHandler()

Handler处理器

将日志分发到不同的目的地。可以是文件、标准输出(sys.stdout,sys.stderr)、邮件、或者通过socke、http等协议发送到任何地方。

StreamHandler

标准输出stdout(如显示器)分发器。

创建方法:sh = logging.StreamHandler()

FileHandler

将日志保存到磁盘文件的处理器

创建方法:fh = logging.FileHandler()

所有handler都可以使用setFormatter(): 设置当前handler对象使用的消息格式

支持日志回滚的两个FileHandler处理器

RotatingFileHandler

回滚时刻是当日志文件的大小达到一定值。当日志文件的大小达到指定值的时候,RotatingFileHandler 会将日志文件重命名存档,然后打开一个新的日志文件。

代码示例:

  1. # -*- coding: UTF-8 -*-
  2. import logging.handlers
  3. # 记录器
  4. logger = logging.getLogger("app")
  5. # 处理器
  6. ro_handler = logging.handlers.RotatingFileHandler(filename="app.log", maxBytes=200, backupCount=3)
  7. # 格式化处理器
  8. formatter = logging.Formatter("%(asctime)s %(levelname)s %(filename)s :%(lineno)s %(message)s")
  9. # 给处理器设置格式
  10. ro_handler.setFormatter(formatter)
  11. # 记录器绑定处理器
  12. logger.addHandler(ro_handler)
  13. logger.error("This is a error message")
  14. logger.critical("This is a critical message")

TimeRotatingFileHandler

当某个时刻到来时执行回滚,同RotatingFileHandler 一样,当回滚时机来临时,TimedRotatingFileHandler 会将日志文件重命名存档,然后打开一个新的日志文件。

time_ro = logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0)

注:

日志回滚的意思为:比如日志文件是chat.log,当chat.log达到指定的大小之后,RotatingFileHandler自动把文件改名为chat.log.1。不过,如果chat.log.1已经存在,会先把chat.log.1重命名为chat.log.2。最后重新创建 chat.log,继续输出日志信息。【这样保证了chat.log里面是最新的日志】

Formatter格式

Formatter对象用来最终设置日志信息的顺序、结构和内容

其构造方法中,datefmt参数默认是%Y-%m-%d %H-%M-%S样式的

属性格式描述
asctime%(asctime)s日志产生的时间,默认是%Y-%m-%d %H-%M-%S,%毫秒
filename%(filename)s生成日志的py文件名
funcName%(funcName)s调用日志的函数名
levelname%(levelname)s日志级别
levelno%(levelno)s日志级别对应的数值
lineno%(lineno)s调用日志的代码行号
module%(module)s生成日志的模块
message%(message)s具体的日志信息
name%(name)s日志调用者
pathname%(pathname)s生成日志的文件的完整路径
created%(created)stime.time()生成的日志创建时间戳
msecs%(msecs)s日志生成时间的毫秒部分
process%(process)s生成日志的进程ID(如果可用)
processName%(processName)s进程名(如果可用)
thread%(thread)s生成日志的线程ID(如果可用)
threadName%(threadName)s线程名(如果可用)

5.logging高级应用代码示例

Demo1:

  1. # 记录器
  2. logger = logging.getLogger()
  3. print(logger)
  4. print(type(logger))

 控制台输出:

<RootLogger root (WARNING)>
<class 'logging.RootLogger'>

名字为root的RootLogger,日志默认等级WARNING

Demo2:

  1. logger = logging.getLogger()
  2. # 设置日志级别
  3. logger.setLevel(logging.DEBUG)
  4. print(logger)
  5. print(type(logger))

控制台输出:

<RootLogger root (DEBUG)>
<class 'logging.RootLogger'>

Demo3:

  1. # 设置logger的名字
  2. logger = logging.getLogger("applog")
  3. logger.setLevel(logging.DEBUG)
  4. print(logger)
  5. print(type(logger))

控制台输出:

<Logger applog (DEBUG)>
<class 'logging.Logger'>

名字为applog的Logger,日志等级DEBUG 

Demo4:

记录器,处理器,格式化处理器,过滤器

  1. # 记录器
  2. logger = logging.getLogger("cn.applog")
  3. # 记录器设置日志级别优先级 > 处理器设置日志级别,日志会根据记录器日志级别先进行一层过滤,然后根据处理器日志级别过滤
  4. logger.setLevel(logging.DEBUG)
  5. # 处理器Handler
  6. console_handler = logging.StreamHandler()
  7. console_handler.setLevel(logging.INFO)
  8. # 没有给handler指定日志级别,将使用logger的级别
  9. file_handler = logging.FileHandler(filename="log.txt")
  10. # 格式化处理器Formatter
  11. formatter = logging.Formatter("%(asctime)s %(levelname)s %(filename)s :%(lineno)s %(message)s")
  12. # 给处理器设置格式
  13. console_handler.setFormatter(formatter)
  14. file_handler.setFormatter(formatter)
  15. # 记录器设置处理器
  16. logger.addHandler(console_handler)
  17. logger.addHandler(file_handler)
  18. # 定义过滤器,用来过滤记录器和处理器
  19. # flt = logging.Filter("cn")
  20. # 关联过滤器
  21. # 过滤器存在层级关系
  22. # logger.addFilter(logging.Filter("cn"))
  23. # file_handler.addFilter(logging.Filter("sn"))
  24. # 使用记录器打印日志
  25. logger.debug("This is debug info")
  26. logger.info("This is info info")
  27. logger.warning("This is warning info")
  28. logger.error("This is error info")
  29. logger.critical("This is critical info")

控制台输出:

2021-08-13 19:44:45,501 INFO testlogging1.py :35 This is info info
2021-08-13 19:44:45,501 WARNING testlogging1.py :36 This is warning info
2021-08-13 19:44:45,501 ERROR testlogging1.py :37 This is error info
2021-08-13 19:44:45,501 CRITICAL testlogging1.py :38 This is critical info

(注:过滤器后面学习详述)

Demo5:

配置文件的方式来处理日志

  1. # -*- coding: UTF-8 -*-
  2. import logging.config
  3. # 配置文件的方式来处理日志
  4. # 载入配置文件的信息
  5. # logging模块的config文件的fileConfig
  6. logging.config.fileConfig("logging.conf")
  7. root_logger = logging.getLogger()
  8. root_logger.debug("This is debug info")
  9. app_logger = logging.getLogger("applog")
  10. app_logger.debug("This is debug info")

控制台输出:

2021-08-13 20:52:13 DEBUG testlogging2.py :10 This is debug info
2021-08-13 20:52:13 DEBUG testlogging2.py :13 This is debug info

配置文件:logging.conf

  1. [loggers]
  2. keys=root,applog
  3. [handlers]
  4. keys=fileHandler,consoleHandler
  5. [formatters]
  6. keys=simpleFormatter
  7. [logger_root]
  8. level=DEBUG
  9. handlers=consoleHandler
  10. [logger_applog]
  11. level=DEBUG
  12. handlers=fileHandler,consoleHandler
  13. qualname=applog
  14. propagate=0
  15. [handler_consoleHandler]
  16. class=StreamHandler
  17. args=(sys.stdout,)
  18. level=DEBUG
  19. formatter=simpleFormatter
  20. [handler_fileHandler]
  21. class=handlers.TimedRotatingFileHandler
  22. args=("app.log", "midnight", 1, 0)
  23. level=DEBUG
  24. formatter=simpleFormatter
  25. [formatter_simpleFormatter]
  26. format=%(asctime)s %(levelname)s %(filename)s :%(lineno)s %(message)s
  27. datefmt=%Y-%m-%d %H:%M:%S

# 约定俗成,root必写

# qualname别名

# propagate继承关系,比较多使用0(以后用到再详述)

# 配置文件里面不要用中文,代码会报gbk错误

其他:

1.使用logger.exception(message),记录器输出栈信息

  1. # 记录器输出栈信息
  2. try:
  3. int("abc")
  4. except Exception as e:
  5. # app_logger.error(e)
  6. app_logger.exception(e)

控制台输出:

2021-08-13 20:57:23 ERROR testlogging2.py :19 invalid literal for int() with base 10: 'abc'
Traceback (most recent call last):
  File "E:/PycharmProjects/IVSPlat/test/testlogging2.py", line 16, in <module>
    int("abc")
ValueError: invalid literal for int() with base 10: 'abc'

2.可以用字典配置来处理日志

logging.config.dictConfig({})

后续进行学习

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/590643
推荐阅读
相关标签
  

闽ICP备14008679号