日志记录函数以它们用来跟踪的事件的级别或严重性命名。下面描述了标准级别及其适用性(从高到低的顺序)

日志等级(level) 描述
DEBUG   最详细的日志信息,典型应用场景是 问题诊断
INFO     信息详细程度仅次于DEBUG,通常只记录关键节点信息,用于确认一切都是按照我们预期的那样进行工作
WARNING    当某些不期望的事情发生时记录的信息(如,磁盘可用空间较低),但是此时应用程序还是正常运行的
ERROR     由于一个更严重的问题导致某些功能不能正常运行时记录的信息
CRITICAL    当发生严重错误,导致应用程序不能继续运行时记录的信息

日志级别等级排序:critical > error > warning > info > debug

import logging

# 打印日志级别
def test_logging():
logging.debug('Python debug')
logging.info('Python info')
logging.warning('Python warning')
logging.error('Python Error')
logging.critical('Python critical') test_logging() #输出结果 WARNING:root:Python warning
ERROR:root:Python Error
CRITICAL:root:Python critical

设置日志显示级别

通过 logging.basicConfig() 可以设置 root 的日志级别,和日志输出格式

logging.basicConfig() 关键字参数

关键字 描述
filename 创建一个 FileHandler,使用指定的文件名,而不是使用 StreamHandler。
filemode 如果指明了文件名,指明打开文件的模式(如果没有指明 filemode,默认为 'a')。
format handler 使用指明的格式化字符串。
datefmt handler 使用指明的格式化字符串。
level 指明根 logger 的级别。
stream 使用指明的流来初始化 StreamHandler。该参数与 'filename' 不兼容,如果两个都有,'stream' 被忽略。

format 格式

格式                    描述
%(levelno)s        打印日志级别的数值
%(levelname)s   打印日志级别名称
%(pathname)s   打印当前执行程序的路径
%(filename)s     打印当前执行程序名称
%(funcName)s   打印日志的当前函数
%(lineno)d         打印日志的当前行号
%(asctime)s      打印日志的时间
%(thread)d        打印线程 ID
%(threadName)s  打印线程名称
%(process)d         打印进程 ID
%(message)s       打印日志信息

注意:Logging.basicConfig() 需要在开头就设置,在中间设置并无作用

import logging
# 更改显示消息的格式
logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG)
#logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
#logging.basicConfig(filename='myapp.log',level=logging.DEBUG)
logging.debug('Python message format Debug')
logging.info('Python message format Info')
logging.warning('Python message format Warning')

  

logging 模块四大组件

组件名称  对应类名   功能描述
日志器    Logger        暴露函数给应用程序,基于日志记录器和过滤器级别决定哪些日志有效
处理器      Handler       将 logger 创建的日志记录发送到合适的目的输出
过滤器      Filter           提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
格式器      Formatter    决定日志记录的最终输出格式

日志器- Logger

Logger 持有日志记录器的方法,日志记录器不直接实例化,而是通过模块级函数 logger.getlogger (name) 来实例化,使用相同的名称多次调用 getLogger() 总是会返回对相同 Logger 对象的引用。

  • 应用程序代码能直接调用日志接口。

  • Logger最常用的操作有两类:配置和发送日志消息。

  • 初始化 logger = logging.getLogger("endlesscode"),获取 logger 对象,getLogger() 方法后面最好加上所要日志记录的模块名字,配置文件和打印日志格式中的 %(name)s 对应的是这里的模块名字,如果不指定name则返回root对象。

  • logger.setLevel(logging.DEBUG),Logging 中有 NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL这几种级别,日志会记录设置级别以上的日志

  • 多次使用相同的name调用 getLogger 方法返回同一个 looger 对象;

Logger是一个树形层级结构,在使用接口 debug,info,warn,error,critical 之前必须创建 Logger 实例:

创建方法: logger = logging.getLogger(logger_name)

创建Logger实例后,可以使用以下方法进行日志级别设置,增加处理器 Handler:

  • logger.setLevel(logging.ERROR) # 设置日志级别为 ERROR,即只有日志级别大于等于 ERROR 的日志才会输出

  • logger.addHandler(handler_name) # 为 Logger 实例增加一个处理器

  • logger.removeHandler(handler_name) # 为 Logger 实例删除一个处理器

处理器- Handler

Handler 处理器类型有很多种,比较常用的有三个,StreamHandler,FileHandler,NullHandler

StreamHandler

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

创建 StreamHandler 之后,可以通过使用以下方法设置日志级别,设置格式化器 Formatter,增加或删除过滤器 Filter:

ch.setLevel(logging.WARN) # 指定日志级别,低于WARN级别的日志将被忽略

ch.setFormatter(formatter_name) # 设置一个格式化器formatter

ch.addFilter(filter_name) # 增加一个过滤器,可以增加多个

ch.removeFilter(filter_name) # 删除一个过滤器

过滤器- Filter

Handlers 和 Loggers 可以使用 Filters 来完成比级别更复杂的过滤。Filter 基类只允许特定 Logger 层次以下的事件。例如用 ‘A.B’ 初始化的 Filter 允许Logger ‘A.B’, ‘A.B.C’, ‘A.B.C.D’, ‘A.B.D’ 等记录的事件,logger‘A.BB’, ‘B.A.B’ 等就不行。如果用空字符串来初始化,所有的事件都接受。

创建方法: filter = logging.Filter(name='')

格式器- Formatter

使用Formatter对象设置日志信息最后的规则、结构和内容,默认的时间格式为%Y-%m-%d %H:%M:%S 

创建方法: formatter = logging.Formatter(fmt=None, datefmt=None)

其中,fmt 是消息的格式化字符串,datefmt 是日期字符串。如果不指明 fmt,将使用 '%(message)s' 。如果不指明  datefmt,将使用 ISO8601 日期格式。  

组件之间的关联关系

  • 日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,不同的处理器(handler)可以将日志输出到不同的位置;

  • 日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置;

  • 每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志;

  • 每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。

简明了说就是:日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作。

  • Logger 可以包含一个或多个 Handler 和 Filter

  • Logger 与 Handler 或 Fitler 是一对多的关系

  • 一个 Logger 实例可以新增多 个 Handler,一个 Handler 可以新增多个格式化器或多个过滤器,而且日志级别将会继承。

logging 模块详解的更多相关文章

  1. Python的logging模块详解

          Python的logging模块详解 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.日志级别 日志级别指的是产生的日志的事件的严重程度. 设置一个级别后,严重程度 ...

  2. python logging模块详解[转]

    一.简单将日志打印到屏幕: import logging logging.debug('debug message') logging.info('info message') logging.war ...

  3. Python logging模块详解

    简单将日志打印到屏幕: import logging logging.debug('debug message') logging.info('info message') logging.warni ...

  4. Python自学笔记-logging模块详解

    简单将日志打印到屏幕: import logging logging.debug('debug message') logging.info('info message') logging.warni ...

  5. [转载]Python logging模块详解

    原文地址: http://blog.csdn.net/zyz511919766/article/details/25136485 简单将日志打印到屏幕: import logging logging. ...

  6. logging模块详解以及常见代码

    1.在django中获取客户端IP地址: if 'HTTP_X_FORWARDED_FOR' in request.META: ip = request.META['HTTP_X_FORWARDED_ ...

  7. Python同时向控制台和文件输出日志logging的方法 Python logging模块详解

    Python同时向控制台和文件输出日志logging的方法http://www.jb51.net/article/66756.htm 1 #-*- coding:utf-8 -*- 2 import ...

  8. Python中操作mysql的pymysql模块详解

    Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...

  9. python之OS模块详解

    python之OS模块详解 ^_^,步入第二个模块世界----->OS 常见函数列表 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows ...

  10. python之sys模块详解

    python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...

随机推荐

  1. Zookeeper ZAB协议-Leader&Followe 对象创建和启动源码解析

    这篇博客主要是解析了Leader,Follower 对象的创建,相对来说比较简单,主要是了解一下在实例化的时候创建了哪些对象,这些对象会在数据传输的过程中发挥比较打的作用,如果有了解过的,可以直接跳过 ...

  2. kotlin inline的缺点

    inline关键字修饰的方法,可以在运行时将代码复制到使用处 用来控制打印好用 但有两个缺点: 一.修饰的方法不能太大,行数也不能太多,不然会造成很多重复代码 2.控制打印时,方法的行数最好与使用的行 ...

  3. SAP物料状态

    物料状态控制当前物料是否可以生产.采购.设计等功能 设置路径:spro-->后勤常规-->物料主数据-->设置关键字段-->定义物料状态

  4. C语言学习--指针函数与函数指针

    #include<stdio.h> #include<string.h> //指针函数: 是一个函数, 但是这个函数的返回值类型是一个指针 //函数指针: 是一个指针, 这个指 ...

  5. stream 链式结构 求和

    Double aDouble = Optional.ofNullable(wayfairMonthBill.getPaymentAmountDetailJson()) .filter(StringUt ...

  6. gin面试题

    1.gin绑定前端提交的数据到结构体 json,shouldbindjson,postform,query拿到get方法或者路由拼接这些 2.gin框架中间件多个执行顺序 3.中间件实现原理 4.设计 ...

  7. springboot+mybatis多数据源的事务问题

    1.springboot+mybatis实现多数据源后,针对单个数据源我们可以使用@Transactional(name="xxxTransactionManager") 来指定使 ...

  8. C#使用SharpZipLib解压多文件的zip压缩文件数据流,保存到本地

    代码: public async Task<ReturnModel<List<string>>> UploadModel() { var task = new Ta ...

  9. lvm 扩容操作

    lsblk查看sda分区信息: 查看vgroot大小: sda磁盘447G,vgroot用300G左右而已,如果分区vg不足,需要手动进行扩容操作: 1.  首先新建一个sda4分区: 默认的地方直接 ...

  10. 041_Record Type

    应用场景:在使用Apex新建记录时,有时需要根据具体需求为用户匹配对应的记录类型,这个时候就需要用到记录类型Id的情况. 获取RecordTypeId的方法有2种,一种是根据soql进行查询,另一种是 ...