当前位置:   article > 正文

Python log日志

python log日志

结构

下面列出了模块定义的基本类及其功能。

  • 记录器::公开应用程序代码直接使用的接口。
  • 处理程序: 将日志记录(由记录器创建)发送到适当的目的地。
  • 过滤器::提供了一种更细粒度的设施,用于确定要输出哪些日志记录。
  • 格式化程序: 指定最终输出中日志记录的布局。

日志级别

日志级别的数值如下表所示。如果您想定义自己的级别,并且需要它们具有相对于预定义级别的特定值,那么这些主要是有用的。如果您定义一个具有相同数值的级别,它会覆盖预定义的值;预定义的名称丢失。

等级数值
CRITICAL50
ERROR40
WARNING30
INFO20
DEBUG10
NOTSET0

LogRecord

属性名称格式描述
参数你不应该需要自己格式化。合并成的参数元组msg产生message,或一个字典,其值用于合并(当只有一个参数时,它是一个字典)。
上升时间%(asctime)sLogRecord创建时的人类可读时间 。默认情况下,它的格式为“2003-07-08 16:49:45,896”(逗号后面的数字是时间的毫秒部分)。
创建%(created)fLogRecord创建 的时间(由 返回time.time())。
exc_info你不应该需要自己格式化。异常元组 (à la sys.exc_info) 或者,如果没有发生异常,则为None.
文件名%(filename)s的文件名部分pathname
函数名%(funcName)s包含日志调用的函数名称。
级别名称%(levelname)s消息的文本记录级别('DEBUG''INFO''WARNING'、 'ERROR''CRITICAL')。
水平诺%(levelno)s消息的数字日志记录级别 ( DEBUGINFOWARNINGERRORCRITICAL)。
线诺%(lineno)d发出日志记录调用的源行号(如果可用)。
模块%(module)s模块( 的名称部分filename)。
毫秒%(msecs)dLogRecord创建时间的毫秒部分 。
信息%(message)s记录的消息,计算为。这是在调用时设置的 。msg % argsFormatter.format()
留言你不应该需要自己格式化。在原始日志记录调用中传递的格式字符串。与args产生message或任意对象合并(请参阅使用任意对象作为消息)。
名称%(name)s用于记录呼叫的记录器的名称。
路径名%(pathname)s发出日志记录调用的源文件的完整路径名(如果可用)。
过程%(process)d进程 ID(如果可用)。
进程名%(processName)s进程名称(如果可用)。
相对创建%(relativeCreated)d创建 LogRecord 的时间(以毫秒为单位),相对于加载日志记录模块的时间。
堆栈信息你不应该需要自己格式化。从当前线程中的堆栈底部到并包括导致创建此记录的日志记录调用的堆栈帧的堆栈帧信息(如果可用)。
线%(thread)d线程 ID(如果可用)。
线程名%(threadName)s线程名称(如果可用)。

在 3.1 版更改:添加了processName


基本应用

日志文件名可动态生成变更

  1. # 生成动态日志
  2. import logging.handlers
  3. import logging
  4. class GetLog:
  5. def __init__(self, log_abs_path):
  6. self.log_abs_path = log_abs_path
  7. self.logger = None
  8. def log(self, name, level):
  9. if self.logger is None:
  10. self.logger = logging.getLogger(name=name)
  11. self.logger.setLevel(logging.DEBUG)
  12. fm = "%(asctime)s:%(levelname)s:%(name)s:%(filename)s:%(lineno)d:%(message)s"
  13. fmt = logging.Formatter(fm)
  14. cl = logging.handlers.TimedRotatingFileHandler("{}".format(self.log_abs_path),
  15. when="midnight",
  16. interval=31,
  17. encoding="utf8")
  18. cl.setLevel(level)
  19. cl.setFormatter(fmt)
  20. cl.suffix = "%Y-%m-%d"
  21. self.logger.addHandler(cl)
  22. return self.logger
  23. def debug(self):
  24. return self.log(name="debug", level="DEBUG")
  25. def info(self):
  26. return self.log(name="info", level="INFO")
  27. def warning(self):
  28. return self.log(name="warning", level="WARNING")
  29. def error(self):
  30. return self.log(name="error", level="ERROR")
  31. def critical(self):
  32. return self.log(name="critical", level="CRITICAL")

实例化

  1. # 创建info级别的实例,单独的文件记录info日志
  2. log_info = GetLog(log_path="./info.log").info()
  3. log_info.info("info")
  4. # 创建error级别的实例,单独的文件记录error日志
  5. log_error = GetLog(log_path="./error.log").error()
  6. log_error.error("error")


日志分等级输出

  1. import logging
  2. import os
  3. class BaseLog:
  4. def __init__(self, level, is_file_handler=False, is_consol_handler=False, log_file_name="default.log"):
  5. """
  6. 日志类,创建实例时,指定日志输出位置(默认不输出;is_file_handler:输出到指定文件,此时log_file_name必填;
  7. is_consol_handler:输出到控制台).
  8. 建议创建多个实例,每个实例只记录一种级别的日志信息
  9. :param is_file_handler: 是否输出到指定文件
  10. :param is_consol_handler: 是否输出到控制台
  11. :param log_file_name: 生成的日志文件
  12. """
  13. current_dir = os.path.abspath(os.path.curdir)
  14. self.log_file_name = os.path.join(current_dir, log_file_name)
  15. self.is_file_handler = is_file_handler
  16. self.is_consol_handler = is_consol_handler
  17. # 创建记录器 ***注意有坑:不同name的Logger对象才可以创建不同的实例,名字一致时,会被覆盖***
  18. self.log = logging.getLogger(name=level)
  19. # 设置日志格式
  20. self.base_format = logging.Formatter(
  21. '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
  22. self.level = level
  23. self._add_filter_info(level=level)
  24. self.log.setLevel(level)
  25. def create(self):
  26. """
  27. 返回可调用的log对象
  28. :return: log对象
  29. """
  30. self._add_filter_info(self.level)
  31. self.log.setLevel(self.level)
  32. return self.log
  33. def _add_file_handler(self, level):
  34. """
  35. 添加处理器,根据等级输出日志到文件
  36. :param level: 记录的日志最低等级
  37. :return: 文件处理器
  38. """
  39. if self.is_file_handler:
  40. self.file_handler = logging.FileHandler(filename=self.log_file_name, mode="a", encoding="utf-8")
  41. self.file_handler.setLevel(level=level)
  42. self.file_handler.setFormatter(self.base_format)
  43. # 添加文件处理器
  44. self.log.addHandler(self.file_handler)
  45. return self.file_handler
  46. def _add_consol_handler(self, level):
  47. """
  48. 添加控制台处理器, 根据日志等级输出到控制台
  49. :param level: 日志最低等级
  50. :return: 控制台处理器
  51. """
  52. if self.is_consol_handler:
  53. # 设置处理器--控制台输出
  54. self.console_handler = logging.StreamHandler()
  55. self.console_handler.setLevel(level=level)
  56. self.console_handler.setFormatter(self.base_format)
  57. # 添加控制台处理器
  58. self.log.addHandler(self.console_handler)
  59. return self.console_handler
  60. def _add_filter_info(self, level):
  61. """
  62. 添加过滤器,根据日志等级添加过滤器
  63. :param level: 过滤的最低日志等级
  64. :return:
  65. """
  66. self.log_filter = logging.Filter()
  67. self.log_filter.filter(record=level)
  68. # 将过滤器添加到处理器
  69. if self.is_consol_handler:
  70. self._add_consol_handler(level=level).addFilter(self.log_filter)
  71. if self.is_file_handler:
  72. self._add_file_handler(level=level).addFilter(self.log_filter)
  1. # 创建base_log实例 每个等级创建一个
  2. from base_log.base_log import BaseLog
  3. debug_log = BaseLog(level="DEBUG", is_consol_handler=False, is_file_handler=True,
  4. log_file_name="logs/debug.log").create()
  5. info_log = BaseLog(level="INFO", is_consol_handler=False, is_file_handler=True,
  6. log_file_name="logs/info.log").create()
  7. warn_log = BaseLog(level="WARN", is_consol_handler=False, is_file_handler=True,
  8. log_file_name="logs/warn.log").create()
  9. error_log = BaseLog(level="ERROR", is_consol_handler=False, is_file_handler=True,
  10. log_file_name="logs/error.log").create()
  11. critical_log = BaseLog(level="CRITICAL", is_consol_handler=False, is_file_handler=True,
  12. log_file_name="logs/critical.log").create()
  13. debug_log.debug("debug--------")
  14. info_log.info("info-----------")
  15. info_log.error("info --error")
  16. warn_log.warning("info-----------")
  17. error_log.error("info-----------")
  18. critical_log.critical("info-----------")

执行后文件输出

loguru 别人封装的log库

  1. from loguru import logger
  2. """
  3. git地址:https://github.com/emilk/loguru
  4. """
  5. # 配置
  6. logger.add("demo_log.log", # log文件地址
  7. level="DEBUG", # log记录最低级别
  8. rotation="00:00", # 将日志记录以大小、时间等方式进行分割或划分
  9. retention="30 days", # 文件保留时间
  10. compression="zip", # 文件压缩格式
  11. backtrace=True
  12. )
  13. # logger.remove(handler_id=None) # 禁用控制台日志输出
  14. # 装饰器
  15. @logger.catch
  16. def demo_test_loguru(str):
  17. for i in range(str):
  18. # 直接使用
  19. logger.info(f"this is the {i} range")
  20. if __name__ == "__main__":
  21. logger.debug("this is debug ")
  22. logger.info("this is info")
  23. logger.error("this is error message")
  24. demo_test_loguru("haha")
  25. note_loguru_2.note_2()

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

闽ICP备14008679号