zoukankan      html  css  js  c++  java
  • python日志模块

    一.简单介绍

    我们在部署系统或者某个软件服务时,为了方便定位部署过程中出现的问题,我们需要记录一些日志,方便我们定位和排查问题。python的logging模块
    提供了一组便利的日志函数,它们分别是:debug()、 info()、 warning()、 error() 和 critical()。logging函数根据它们用来跟踪的事件的级别或严重程度来命名。标准级别及其适用性描述如下(以严重程度递增排序):

    每个级别对应的数字值为
    CRITICAL:50,ERROR:40,WARNING:30,INFO:20,DEBUG:10,NOTSET:0。
    Python 中日志的默认等级是 WARNING,DEBUG 和 INFO 级别的日志将不会得到显示,在 logging 中更改设置。

    二.logging模块介绍

    logging模块提供了两种记录日志的方式:

    • 使用logging提供的模块级别的函数
      这里提到的级别函数是DEBUG、ERROR等级别
    • 使用logging日志系统的四大组件
      这里四大组件是指loggers、handlers、filters和formatters这几个组件。下面说明了它们各自的作用:
      组件名称 | 对应类名 | 功能描述 |
      -|-|-|
      日志器 | Logger | 提供了应用程序可一直使用的接口 |
      处理器 | Handler | 将logger创建的日志记录发送到合适的目的输出 |
      过滤器 | Filter | 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录 |
      格式器 | Formatter | 决定日志记录的最终输出格式 |

    日志器logger是入口,真正工作的是处理器handler,处理器handler还可以通过过滤器filter和各时期formatter对要输出的日志内容做过滤和格式化等处理操作

    三.四大组件介绍

    3.1 Logger类

    Logger对象有三个工作要做:

    • 向应用程序代码暴露几个方法,使应用程序可以在运行时记录日志消息
    • 基于日志严重等级(默认的过滤设施)或filter对象来决定要对哪些日志进行后续处理
    • 将日志消息传送给所有感兴趣的日志handlers

    Logger对象最常用的方法分为两类:配置方法和消息发送方法
    最常用的配置方法如下:

    方法 描述
    Logger.setLevel() 设置日志器将会处理的日志信息的最低严重级别
    Loggger.addHandler()和Logger.removeHandler() 为该logger对象添加和移除一个handler对象
    Logger.addFilter()和Logger.removeFilter() 为该logger对象添加和移除一个filter对象

    关于Logger.setLevel()方法的说明:
    内建等级中,级别最低的是DEBUG,级别最高的是CRITICAL。例如setLevel(logging.INFO),此时函数参数为INFO,那么该logger将只会处理INFO、WARNING、ERROR和CRITICAL级别的日志,而DEBUG级别的消息将会被忽略/丢弃。

    Logger对象配置完毕后,可以使用下面的方法来创建日志记录:

    那么,怎样得到一个Logger对象呢?一种方式是通过Logger类的实例化方法创建一个Logger类的实例,但是我们通常都是用第二种方式--logging.getLogger()方法。

    def get_log(modle_name, level=logging.FATAL):
        """
        get a log handler
        :param modle_name:
        :param level:
        :return:
        """
    
        log = logging.getLogger(modle_name)
        log.setLevel(logging.DEBUG)
    
        # new log, write log to file "/var/log/icfs/icfs-cli.log" level=logging.DEBUG
        log.addHandler(__get_file_handler())
    
        # old log, print info to stdout, only filter info like this: "Error(xxx): xxxx xxx". use by ui. level=logging.ERROR
        log.addHandler(__get_stdout_handler())
    
        # new log, print info to stderr, not count info like: "Error(xxx): xxxx xxx". default level=logging.WARNING
        log.addHandler(__get_stderr_handler(level))
    
        return log
    

    logging.getLogger()方法有一个可选参数name,该参数表示将要返回的日志器的名称标识,如果不提供该参数,则其值为'root'。若以相同的name参数值多次调用getLogger()方法,将会返回指向同一个logger对象的引用

  • 相关阅读:
    hihoCoder[Offer收割]编程练习赛1题目解析
    你的计划为什么运行不下去?怎么破?
    Activity的生命周期
    leetcode——Lowest Common Ancestor of a Binary Tree
    Spring学习笔记(四)-- Spring事务全面分析
    Docker技术-cgroup
    docker高级应用之cpu与内存资源限制(转)
    JMX 学习
    如何使用JVisualVM进行性能分析
    如何利用 JConsole观察分析Java程序的运行,进行排错调优(转)
  • 原文地址:https://www.cnblogs.com/yuhaohao/p/10969704.html
Copyright © 2011-2022 走看看