Python LOGGING使用方法

1. 简介

使用场景

场景 适合使用的方法
在终端输出程序或脚本的使用方法 print
报告一个事件的发生(例如状态的修改) logging.info()或logging.debug()
发生了一个特定的警告性的事件 logging.warn()
发生了一个特定的错误性的事件 raise
发生了一个特定的错误性的事件,但是又不想因为此错误导致程序退出(例如程序是一个守护进程) logging.error(),logging.exception(),logging.critical()

日志的严重程度

由高到低

Level
CRITICAL
ERROR
WARNING
INFO
DEBUG

logging默认的严重程度是WARNING,即在这个严重程度或以上的日志才会被记录。

有两种常用的记录日志的方式:

  1. 输出到终端
import logging
logging.error('hello1')
  1. 记录到文件,也就是硬盘
import logging
logging.basicConfig(filename='./log.log',level=logging.DEBUG)
logging.error('hello1')

basicConfig方法用于快速设置日志,有下面的参数:

  • filename 包日志保存到哪个文件
  • filemode记录日志的模式,a代表在文件中追加日志,w是删除原有文件,创建新文件。
  • format 设置日志IDE输出格式,
  • level 日志的严重程度,
  • datefmt 日期格式
  • stream 日志输出到那里,如果有filename参数,忽略改参数

logging中包含了四个主要的类:

  • logger 提供应用程序直接使用的接口
  • handler将日志记录到指定的输出,例如文件或终端
  • filter提供了对日志进行过滤的功能
  • formatter决定日志记录的最终输出格式。

2. logger

  1. 命名空间

    每个logger都会有一个名字。名字中使用点号来进行等级管理。例如scanscan.htmlscan.pdf的上级

    logging中建议使用logger = logging.getLogger(__name__)来获取logger,因为__name__代表当前模块的路径

  2. 日志流

    当应用程序执行一个写日志操作时,例如logging.info(),日志流程图:

    ![enter image description here] (http://7xpt1q.com1.z0.glb.clouddn.com/img/doc/logging_flow.png)

  • 如果logger有父类,日志流会同时发送给logger和logger的父类的handler。

      ```python
    allot_logger('scan', './scan.log')
    allot_logger('scan.pdf', './scan.pdf.log')
    scan_log = logging.getLogger('scan')
    scan_pdf_log = logging.getLogger('scan.pdf')
    scan_log.info('scan_log') # 日志只会输出到./scan.log文件
    scan_pdf_log.info('scan_pdf_log') # 日志会输出到./scan.log和./scan.pdf.log两个文件
    ```
  1. 方法

    • Logger.setLevel() 设置logger的日志严重程度
    • logger.addHandler() ,Logger.remoteHandler()添加或删除Handler
    • Logger.addFilter,Logger.remoteFilter()添加或删除Filter
    • Logger.debug(), Logger.info(), Logger.warning(), Logger.error(), and Logger.critical()记录日志,其中debug是日志等级。支持字符串格式化,例如logging.debug('error_msg:%s',error_msg)
    • Logger.log(level,msg) 。logging.log(logging.WARN,'msg')等于logging.warn(msg)
  2. 属性

  • Logger.handlers 该logger已添加的Handlers
  • Logger.filters 该logger已添加的Filters
  1. 获取Logger实例

    通过getLogger() 来获取logger。

3. Handler

一个logger可以设置0个或以上的Handler。logger执行记录日志的方法后,会把日志交给Handler来处理。

1. 方法

  • Handler.setLevel() 设置logger的日志严重程度
  • Handler.addFilter,Handler.remoteFilter()添加或删除Filter
  • setFormatter() 设置日志输出的格式

2. Handler类

  1. logging.StreamHandler

    输出日志到一个文件对象,可以是open打开的文件,也可以是系统终端,例如sys.stdout或sys.stderr

    。它的构造函数是:

    StreamHandler([strm])
  • 其中strm是一个文件对象。默认是sys.stderr.
  • demo:
f=open('./test1.log','w')
handler3=logging.StreamHandler(f)
import sys
handler4=logging.StreamHandler(sys.stdout)
  1. logging.FileHandler

    向一个文件中输出日志内容。如果文件根路径不存在,会报错。如果文件根路径存在,但是文件不存在,会自动创建文件。

    。它的构造函数是:

    FileHandler(filename[,mode])
  • filename是日志文件路径。
  • mode是写文件的方法,例如’a','w',参考open里面的mode
  1. logging.handlers.RotatingFileHandler

    类似FileHandler,不同的是这个可以管理文件的大小,如果日志文件大于某个值,就会把旧的日志重命名,并创建新的日志文件。如果有三个日志文件chat.log,chat.log.1,chat.log.2 ,时间大小:chat.log>chat.log.1>chat.log.2

    它的构造函数是:

    RotatingFileHandler( filename[, mode[, maxBytes[, backupCount]]])

  • 其中filename和mode两个参数和FileHandler一样。
  • maxBytes 最大文件大小,单位字节,0代表无限大。
  • backupCount 保留的备份个数。
  • demo:
handler = RotatingFileHandler('./test.log', maxBytes=10, backupCount=5)
  1. logging.handlers.TimedRotatingFileHandler

    这个Handler和RotatingFileHandler类似,不同的是这个Handler通过时间来切分日志文件:

    TimedRotatingFileHandler( filename [,when [,interval [,backupCount]]])

    其中filename参数和backupCount参数和RotatingFileHandler具有相同的意义

    • interval是时间间隔。
    • when参数是一个字符串。表示时间间隔的单位,不区分大小写。它有以下取值:

      S 秒

      M 分

      H 小时

      D 天

      W 每星期(interval==0时代表星期一)

      midnight 每天凌晨
  2. logging.handlers.SocketHandler
  3. logging.handlers.DatagramHandler

    以上两个Handler类似,都是将日志信息发送到网络。不同的是前者使用TCP协议,后者使用UDP协议。它们的构造函数是:

    Handler(host, port)

    其中host是主机名,port是端口名
  4. logging.handlers.SysLogHandler
  5. logging.handlers.NTEventLogHandler
  6. logging.handlers.SMTPHandler
  7. logging.handlers.MemoryHandler
  8. logging.handlers.HTTPHandler

4. Formatter

logging.Formatter('%(asctime)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d %(message)s')

常用格式:

%(name)s Logger的名字
%(levelno)s 数字形式的日志级别
%(levelname)s 文本形式的日志级别
%(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
%(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 用户输出的消息

5. 常用工具

1. 初始化一个logger

def allot_logger(name, filename, level=None, format=None):
'''
初始化一个logger
:param name: logger名称
:param filename: 日志文件路径
:param format: 日志格式
:param level: 日志的严重程度
:return:
'''
if level == None:
level = logging.DEBUG
if format == None:
format = '%(asctime)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d %(message)s'
logger = logging.getLogger(name)
if not logger.handlers:
logger.setLevel(level)
handler = logging.FileHandler(filename)
handler.setFormatter(
logging.Formatter(format))
logger.handlers = [handler]
  • 如果logger有多个handler,这样会输出重复的日志,所以添加handler前,先判断handler的数量,而且采用设置handlers属性的方式而不是addHandler方法,解决多线程同步问题。

参考:

python 日志模块 logging 详解

PSL LOGGING模块教程

Python LOGGING使用方法的更多相关文章

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

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

  2. python logging 日志轮转文件不删除问题的解决方法

    项目使用了 logging 的 TimedRotatingFileHandler : #!/user/bin/env python # -*- coding: utf-8 -*- import log ...

  3. python logging模块可能会令人困惑的地方

    python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...

  4. python logging 配置

    python logging 配置 在python中,logging由logger,handler,filter,formater四个部分组成,logger是提供我们记录日志的方法:handler是让 ...

  5. python Logging的使用

    日志是用来记录程序在运行过程中发生的状况,在程序开发过程中添加日志模块能够帮助我们了解程序运行过程中发生了哪些事件,这些事件也有轻重之分. 根据事件的轻重可分为以下几个级别: DEBUG: 详细信息, ...

  6. python logging模块使用流程

    #!/usr/local/bin/python # -*- coding:utf-8 -*- import logging logging.debug('debug message') logging ...

  7. python logging详解及自动添加上下文信息

    之前写过一篇文章日志的艺术(The art of logging),提到了输出日志的时候记录上下文信息的重要性,我认为上下文信息包括: when:log事件发生的时间 where:log事件发生在哪个 ...

  8. 读懂掌握 Python logging 模块源码 (附带一些 example)

    搜了一下自己的 Blog 一直缺乏一篇 Python logging 模块的深度使用的文章.其实这个模块非常常用,也有非常多的滥用.所以看看源码来详细记录一篇属于 logging 模块的文章. 整个 ...

  9. (转)python logging模块

    python logging模块 原文:http://www.cnblogs.com/dahu-daqing/p/7040764.html 1 logging模块简介 logging模块是Python ...

随机推荐

  1. emoji表情符处理替换成空格

    /**    * 用filterOffUtf8Mb4    * Description: 过滤率四个字节的utf-8字符(emoji表情符),替换成四个空格.    *         四字节utf- ...

  2. 初识 Asp.Net内置对象之Session对象

    Session对象 Session对象用于存储在多个页面调用之间特定用户的信息.Session对象只针对单一网站使用者,不同的客户端无法相互访问.Session对象中止联机机器离现时,,也就是当网站使 ...

  3. shell--学习 sed

    sed:数据流编辑器 读一行到内存处理一行然后输出一行. 模式空间: sed:默认不编辑源文件 sed [option]    ADDRESSCOMMAND   file 1.起始行. 结束行 sed ...

  4. 【转载】Android开发学习笔记:Intent的简介以及属性的详解

    http://liangruijun.blog.51cto.com/3061169/634411/ 一.Intent的介绍 Intent的中文意思是“意图,意向”,在Android中提供了Intent ...

  5. 慎用memset();

    <span style="font-family: Arial, Helvetica, sans-serif;">void *(memset) (void *s,int ...

  6. Sass之初识

    Sass is the most mature, stable, and powerful professional grade CSS extension language in the world ...

  7. sql server实用工具sql prompt的安装与注册

    说起 sql prompt ,相信一直在sql server 领域摸爬滚打的技术人员们,并不陌生. 它是一款拥有SQL智能提示功能的SQL ServerVS插件.SQL Prompt能根据数据库的对象 ...

  8. sql 选取每个分组中的第一条数据

    --1.创建测试表Create Table #Order1( OrderName varchar(50), RequestDate datetime, OrderCount int)-- 插入测试数据 ...

  9. 【学习笔记】【C语言】变量类型

    根据变量的作用域,可以分为: 1.局部变量: 1> 定义:在函数(代码块)内部定义的变量(包括函数的形参) 2> 作用域:从定义变量的那一行开始,一直到代码块结束 3> 生命周期:从 ...

  10. VxWorks 6.9 内核编程指导之读书笔记 -- Singnals

    Signals 信号是操作系统用于异常处理和异步控制流的关键.在很多方面,信号相当于软件方面的硬件中的中断.操作系统产生的信号包括总线错误和浮点处理异常.信号也提供了API来管理和产生信号.在应用程序 ...