首页 > 代码库 > [python标准库]Logging模块

[python标准库]Logging模块

1.模块简介

  logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级、日志保存路径、日志文件回滚等;相比print,具备如下优点:

  1. 可以通过设置不同的日志等级,在release版本中只输出重要信息,而不必显示大量的调试信息;
  2. print将所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其它数据;logging则可以由开发者决定将信息输出到什么地方,以及怎么输出;

  模块提供logger,handler,filter,formatter。

  • logger:提供日志接口,供应用代码使用。logger最长用的操作有两类:配置和发送日志消息。可以通过logging.getLogger(name)获取logger对象,如果不指定name则返回root对象,多次使用相同的name调用getLogger方法返回同一个logger对象。
  • handler:将日志记录(log record)发送到合适的目的地(destination),比如文件,socket等。一个logger对象可以通过addHandler方法添加0到多个handler,每个handler又可以定义不同日志级别,以实现日志分级过滤显示。
  •  filter:提供一种优雅的方式决定一个日志记录是否发送到handler。
  •  formatter:指定日志记录输出的具体格式。formatter的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。

2.模块的使用

 a.简单的将日志打印到屏幕

import logging

logging.debug(This is debug message)
logging.info(This is info message)
logging.warning(This is warning message)

#输出结果:
WARNING:root:This is warning message

  默认情况下,logging将日志打印到屏幕,日志级别为WARNING;
  日志级别大小关系为:CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET,当然也可以自己定义日志级别。

  b.通过logging.basicConfig函数对日志的输出格式及方式做相关配置

import logging

logging.basicConfig(level=logging.DEBUG,
                format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s,
                datefmt=%a, %d %b %Y %H:%M:%S,
                filename=LOG.log,
                filemode=w)
    
logging.debug(This is debug message)
logging.info(This is info message)
logging.warning(This is warning message)

#输出到LOG.log
Mon, 12 Jun 2017 18:31:10 log.py[line:14] DEBUG This is debug message
Mon, 12 Jun 2017 18:31:10 log.py[line:15] INFO This is info message
Mon, 12 Jun 2017 18:31:10 log.py[line:16] WARNING This is warning message
技术分享logging.basicConfig函数各参数:

  c.将日志同时输出到文件和屏幕

技术分享
import logging

logging.basicConfig(level=logging.DEBUG,
                format=%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s,
                datefmt=%a, %d %b %Y %H:%M:%S,
                filename=myapp.log,
                filemode=w)

#################################################################################################
#定义一个StreamHandler,将INFO级别或更高的日志信息打印到标准错误,并将其添加到当前的日志处理对象#
console = logging.StreamHandler()
console.setLevel(logging.INFO)
formatter = logging.Formatter(%(name)-12s: %(levelname)-8s %(message)s)
console.setFormatter(formatter)
logging.getLogger(‘‘).addHandler(console)
#################################################################################################

logging.debug(This is debug message)
logging.info(This is info message)
logging.warning(This is warning message)
View Code

  d.logging之日志回滚

import logging
from logging.handlers import RotatingFileHandler

#定义一个RotatingFileHandler,最多备份5个日志文件,每个日志文件最大10M
Rthandler = RotatingFileHandler(myapp.log, maxBytes=10*1024*1024,backupCount=5)
Rthandler.setLevel(logging.INFO)
formatter = logging.Formatter(%(name)-12s: %(levelname)-8s %(message)s)
Rthandler.setFormatter(formatter)
logging.getLogger(‘‘).addHandler(Rthandler)

  logging有一个日志处理的主对象,其它处理方式都是通过addHandler添加进去的。logging的几种handle方式如下:

技术分享
logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件
logging.FileHandler: 日志输出到文件
日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler
logging.handlers.BaseRotatingHandler
logging.handlers.RotatingFileHandler
logging.handlers.TimedRotatingFileHandler
logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets
logging.handlers.DatagramHandler:  远程输出日志到UDP sockets
logging.handlers.SMTPHandler:  远程输出日志到邮件地址
logging.handlers.SysLogHandler: 日志输出到syslog
logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer
logging.handlers.HTTPHandler: 通过"GET""POST"远程输出到HTTP服务器
View Code

  由于StreamHandler和FileHandler是常用的日志处理方式,所以直接包含在logging模块中,而其他方式则包含在logging.handlers模块中.

  e.单文件日志

import logging
  
  
logging.basicConfig(filename=log.log,
                    format=%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s,
                    datefmt=%Y-%m-%d %H:%M:%S %p,
                    level=10)
  
logging.debug(debug)
logging.info(info)
logging.warning(warning)
logging.error(error)
logging.critical(critical)
logging.log(10,log)
技术分享
CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0
日志等级  

  注:只有【当前写等级】大于【日志等级】时,日志文件才被记录。

   f.多文件日志

技术分享
# 定义文件
file_1_1 = logging.FileHandler(l1_1.log, a, encoding=utf-8)
fmt = logging.Formatter(fmt="%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s")
file_1_1.setFormatter(fmt)

file_1_2 = logging.FileHandler(l1_2.log, a, encoding=utf-8)
fmt = logging.Formatter()
file_1_2.setFormatter(fmt)

# 定义日志
logger1 = logging.Logger(s1, level=logging.ERROR)
logger1.addHandler(file_1_1)
logger1.addHandler(file_1_2)


# 写日志
logger1.critical(1111)
日志一
技术分享
# 定义文件
file_2_1 = logging.FileHandler(l2_1.log, a)
fmt = logging.Formatter()
file_2_1.setFormatter(fmt)

# 定义日志
logger2 = logging.Logger(s2, level=logging.INFO)
logger2.addHandler(file_2_1)
日志二

如上述创建的两个日志对象

  • 当使用【logger1】写日志时,会将相应的内容写入 l1_1.log 和 l1_2.log 文件中
  • 当使用【logger2】写日志时,会将相应的内容写入 l2_1.log 文件中

3.日志小实例

技术分享
#在CMD窗口上只打出error以上级别的日志,但是在日志中打出debug以上的信息
import logging
logger = logging.getLogger("simple_example")
logger.setLevel(logging.DEBUG)
# 建立一个filehandler来把日志记录在文件里,级别为debug以上
fh = logging.FileHandler("spam.log")
fh.setLevel(logging.DEBUG)
# 建立一个streamhandler来把日志打在CMD窗口上,级别为error以上
ch = logging.StreamHandler()
ch.setLevel(logging.ERROR)
# 设置日志格式
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
ch.setFormatter(formatter)
fh.setFormatter(formatter)
#将相应的handler添加在logger对象中
logger.addHandler(ch)
logger.addHandler(fh)
# 开始打日志
logger.debug("debug message")
logger.info("info message")
logger.warn("warn message")
logger.error("error message")
logger.critical("critical message")
View Code

 

参考资料:

每个 Python 程序员都要知道的日志实践

 

 

 

 

[python标准库]Logging模块