python的logging模块详解,python中logging的用法

  python的logging模块详解,python中logging的用法

  本文介绍了Python日志模块的用法,通过示例代码详细介绍。对大家的学习或者工作都有一定的参考价值,有需要的朋友可以参考一下。

  

一、概述

  

步骤

  创建记录器对象创建处理程序对象创建格式化程序对象将格式化程序绑定到处理程序对象将处理程序对象绑定到记录器对象集级别测试

二、低配logging

  日志分为以下五个级别,自下而上匹配:debug-info-warning-error-critical,最低级别默认为警告级别。

  关键=50、错误=40、警告=30、信息=20、调试=10

  

v1:屏幕输出

  版本v1无法指定日志的级别;无法指定日志的格式;只能打印到屏幕上,不能写入文件。

  导入日志记录

  Logging.debug(“调试信息”)

  Logging.info(“正常信息”)

  Logging.warning(警告信息)# warning : root : 3360警告信息

  Logging.error(错误消息)# ERROR:root:错误消息

  Logging.critical(关键错误消息)# CRITICAL:root:错误消息

  

v2:输出到文件

  版本v2无法指定字符编码;您只能打印到文件。

  在logging.basicConfig()函数中,可以通过特定的参数来改变日志模块的默认行为,可用的参数有:

  filename:用指定的文件名创建一个filed Handler(Handler的概念将在后面详细解释),这样日志将被存储在指定的文件中。filemode:文件打开方法。当指定filename时,使用此参数。默认值为“A”或“W”。format:指定了处理程序使用的日志显示格式。datefmt:指定日期和时间格式。level:设置rootlogger的日志级别(具体概念后面会解释)stream:用指定的流创建StreamHandler。您可以将输出指定到sys.stderr、sys.stdout或file,默认值为sys.stderr。如果同时列出了filename和stream参数,则stream参数将被忽略。导入日志记录

  #日志的基本配置

  logging . basic config(filename= access . log ,

  format= %(ASC time)s-%(name)s-%(level name)s-%(module)s :%(message)s ,

  date fmt= % Y-% m-% d % h :% m :% S % p ,

  级别=10)

  Logging.debug(调试信息)# 2019-11-28 18:25:26pm-root-debug-run 3360调试信息

  Logging.info(正常信息)# 2019-11-28 18:25:26pm-root-info-run 3360正常信息

  Logging.warning(警告信息)# 2019-11-28 18:25:26pm-root-warning-run 3360警告信息

  Logging.error(错误消息)# 2019-11-28 18:25:26pm-root-Error-run 3360错误消息

  Logging.critical(严重错误消息)# 2019-11-28 18:25336026pm-root-critical-run 3360严重错误消息

  格式参数中可能使用的格式字符串:

  % (name) s:日志记录者的名字%(levelno)s:日志级别%(levelname)s:日志级别%(pathname)s,文本形式。Tune:使用日志输出函数的模块的完整路径名,可能不是。

  有

  • %(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:用户输出的消息
  •   

    v3:使用内置各种对象

      logging模块包含四种角色:logger、Filter、Formatter、Handler对象

      

    • logger:产生日志的对象
    • Filter:过滤日志的对象
    • Formatter:可以定制不同的日志格式对象,然后绑定给不同的Handler对象使用,以此来控制不同的Handler的日志格式
    • Handler:接收日志然后控制打印到不同的地方,FileHandler用来打印到文件中,StreamHandler用来打印到终端

      

    import logging

      # 1、logger对象:负责产生日志,然后交给Filter过滤,然后交给不同的Handler输出

      logger = logging.getLogger(__file__)

      # 2、Filter对象:不常用,略

      # 3、Handler对象:接收logger传来的日志,然后控制输出

      h1 = logging.FileHandler(t1.log) # 打印到文件

      h2 = logging.FileHandler(t2.log) # 打印到文件

      sm = logging.StreamHandler() # 打印到终端

      # 4、Formatter对象:日志格式

      formmater1 = logging.Formatter(%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s,

       datefmt=%Y-%m-%d %H:%M:%S %p, )

      formmater2 = logging.Formatter(%(asctime)s : %(message)s,

       datefmt=%Y-%m-%d %H:%M:%S %p, )

      formmater3 = logging.Formatter(%(name)s %(message)s, )

      # 5、为Handler对象绑定格式

      h1.setFormatter(formmater1)

      h2.setFormatter(formmater2)

      sm.setFormatter(formmater3)

      # 6、将Handler添加给logger并设置日志级别

      logger.addHandler(h1)

      logger.addHandler(h2)

      logger.addHandler(sm)

      # 设置日志级别,可以在两个关卡进行设置logger与handler

      # logger是第一级过滤,然后才能到handler

      logger.setLevel(30)

      h1.setLevel(10)

      h2.setLevel(10)

      sm.setLevel(10)

      # 7、测试

      logger.debug(debug)

      logger.info(info)

      logger.warning(warning)

      logger.error(error)

      logger.critical(critical)

      

    三、高配logging

      

    1、 配置日志文件

      以上三个版本的日志只是为了引出我们下面的日志配置文件

      

    import os

      import logging.config

      # 定义三种日志输出格式 开始

      standard_format = [%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d] \

       [%(levelname)s][%(message)s] # 其中name为getLogger()指定的名字;lineno为调用日志输出函数的语句所在的代码行

      simple_format = [%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s

      id_simple_format = [%(levelname)s][%(asctime)s] %(message)s

      # 定义日志输出格式 结束

      logfile_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # log文件的目录,需要自定义文件路径 # atm

      logfile_dir = os.path.join(logfile_dir, log) # C:\Users\oldboy\Desktop\atm\log

      logfile_name = log.log # log文件名,需要自定义路径名

      # 如果不存在定义的日志目录就创建一个

      if not os.path.isdir(logfile_dir): # C:\Users\oldboy\Desktop\atm\log

       os.mkdir(logfile_dir)

      # log文件的全路径

      logfile_path = os.path.join(logfile_dir, logfile_name) # C:\Users\oldboy\Desktop\atm\log\log.log

      # 定义日志路径 结束

      # log配置字典

      LOGGING_DIC = {

       version: 1,

       disable_existing_loggers: False,

       formatters: {

       standard: {

       format: standard_format

       },

       simple: {

       format: simple_format

       },

       },

       filters: {}, # filter可以不定义

       handlers: {

       # 打印到终端的日志

       console: {

       level: DEBUG,

       class: logging.StreamHandler, # 打印到屏幕

       formatter: simple

       },

       # 打印到文件的日志,收集info及以上的日志

       default: {

       level: INFO,

       class: logging.handlers.RotatingFileHandler, # 保存到文件

       formatter: standard,

       filename: logfile_path, # 日志文件

       maxBytes: 1024 * 1024 * 5, # 日志大小 5M (*****)

       backupCount: 5,

       encoding: utf-8, # 日志文件的编码,再也不用担心中文log乱码了

       },

       },

       loggers: {

       # logging.getLogger(__name__)拿到的logger配置。如果设置为固定值logger1,则下次导入必须设置成logging.getLogger(logger1)

       : {

       # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕

       handlers: [default, console],

       level: DEBUG,

       propagate: False, # 向上(更高level的logger)传递

       },

       },

      }

      def load_my_logging_cfg():

       logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置

       logger = logging.getLogger(__name__) # 生成一个log实例

       logger.info(It works!) # 记录该文件的运行状态

       return logger

      if __name__ == __main__:

       load_my_logging_cfg()

      

    2、 使用日志

      

    import time

      import logging

      import my_logging # 导入自定义的logging配置

      logger = logging.getLogger(__name__) # 生成logger实例

      def demo():

       logger.debug("start range... time:{}".format(time.time()))

       logger.info("中文测试开始。。。")

       for i in range(10):

       logger.debug("i:{}".format(i))

       time.sleep(0.2)

       else:

       logger.debug("over range... time:{}".format(time.time()))

       logger.info("中文测试结束。。。")

      if __name__ == "__main__":

       my_logging.load_my_logging_cfg() # 在你程序文件的入口加载自定义logging配置

       demo()

      

    四、Django日志配置文件

      Django(发音:[`dʒæŋɡəʊ])是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。

      

    # logging_config.py

      LOGGING = {

       version: 1,

       disable_existing_loggers: False,

       formatters: {

       standard: {

       format: [%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]

       [%(levelname)s][%(message)s]

       },

       simple: {

       format: [%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s

       },

       collect: {

       format: %(message)s

       }

       },

       filters: {

       require_debug_true: {

       (): django.utils.log.RequireDebugTrue,

       },

       },

       handlers: {

       # 打印到终端的日志

       console: {

       level: DEBUG,

       filters: [require_debug_true],

       class: logging.StreamHandler,

       formatter: simple

       },

       # 打印到文件的日志,收集info及以上的日志

       default: {

       level: INFO,

       class: logging.handlers.RotatingFileHandler, # 保存到文件,自动切

       filename: os.path.join(BASE_LOG_DIR, "xxx_info.log"), # 日志文件

       maxBytes: 1024 * 1024 * 5, # 日志大小 5M

       backupCount: 3,

       formatter: standard,

       encoding: utf-8,

       },

       # 打印到文件的日志:收集错误及以上的日志

       error: {

       level: ERROR,

       class: logging.handlers.RotatingFileHandler, # 保存到文件,自动切

       filename: os.path.join(BASE_LOG_DIR, "xxx_err.log"), # 日志文件

       maxBytes: 1024 * 1024 * 5, # 日志大小 5M

       backupCount: 5,

       formatter: standard,

       encoding: utf-8,

       },

       # 打印到文件的日志

       collect: {

       level: INFO,

       class: logging.handlers.RotatingFileHandler, # 保存到文件,自动切

       filename: os.path.join(BASE_LOG_DIR, "xxx_collect.log"),

       maxBytes: 1024 * 1024 * 5, # 日志大小 5M

       backupCount: 5,

       formatter: collect,

       encoding: "utf-8"

       }

       },

       loggers: {

       # logging.getLogger(__name__)拿到的logger配置

       : {

       handlers: [default, console, error],

       level: DEBUG,

       propagate: True,

       },

       # logging.getLogger(collect)拿到的logger配置

       collect: {

       handlers: [console, collect],

       level: INFO,

       }

       },

      }

      # -----------

      # 用法:拿到俩个logger

      logger = logging.getLogger(__name__) # 线上正常的日志

      collect_logger = logging.getLogger("collect") # 领导说,需要为领导们单独定制领导们看的日志

      到此这篇关于Python日志模块的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持盛行IT软件开发工作室。

    郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

    留言与评论(共有 条评论)
       
    验证码: