加入收藏 | 设为首页 | 会员中心 | 我要投稿 安卓应用网 (https://www.0791zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

对python中的logger模块全面讲解

发布时间:2020-05-28 05:20:23 所属栏目:Python 来源:互联网
导读:logging模块介绍Python的logging模块提供了通用的日志系统,熟练使用logging模块可以方便开发者开发第三方模块或者是自己的Python应用。同样这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,

logging模块介绍

Python的logging模块提供了通用的日志系统,熟练使用logging模块可以方便开发者开发第三方模块或者是自己的Python应用。同样这个模块提供不同的日志级别,并可以采用不同的方式记录日志,比如文件,HTTP、GET/POST,SMTP,Socket等,甚至可以自己实现具体的日志记录方式。下文我将主要介绍如何使用文件方式记录log。

logging模块包括logger,handler,filter,formatter这四个基本概念。

logging模块与log4j的机制是一样的,只是具体的实现细节不同。模块提供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的构造方法需要两个参数:消息的格式字符串和日期字符串,这两个参数都是可选的。

与log4j类似,logger,handler和日志消息的调用可以有具体的日志级别(Level),只有在日志消息的级别大于logger和handler的级别。

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')
 
屏幕上打印:
root  : INFO  This is info message
root  : WARNING This is warning message
./myapp.log文件中内容为:
Sun,24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message
Sun,24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message
Sun,24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message

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服务器

import logging
import sys
# 获取logger实例,如果参数为空则返回root logger
logger = logging.getLogger("AppName")
# 指定logger输出格式
formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s')
# 文件日志
file_handler = logging.FileHandler("test.log")
file_handler.setFormatter(formatter) # 可以通过setFormatter指定输出格式
# 控制台日志
console_handler = logging.StreamHandler(sys.stdout)
console_handler.formatter = formatter # 也可以直接给formatter赋值
# 为logger添加的日志处理器,可以自定义日志处理器让其输出到其他地方
logger.addHandler(file_handler)
logger.addHandler(console_handler)
# 指定日志的最低输出级别,默认为WARN级别
logger.setLevel(logging.INFO)
# 输出不同级别的log
logger.debug('this is debug info')
logger.info('this is information')
logger.warn('this is warning message')
logger.error('this is error message')
logger.fatal('this is fatal message,it is same as logger.critical')
logger.critical('this is critical message')
# 2016-10-08 21:59:19,493 INFO : this is information
# 2016-10-08 21:59:19,493 WARNING : this is warning message
# 2016-10-08 21:59:19,493 ERROR : this is error message
# 2016-10-08 21:59:19,493 CRITICAL: this is fatal message,it is same as logger.critical
# 2016-10-08 21:59:19,493 CRITICAL: this is critical message
# 移除一些日志处理器
logger.removeHandler(file_handler)

python:logging模块

10 DECEMBER 2015

概述

python的logging模块(logging是线程安全的)给应用程序提供了标准的日志信息输出接口。logging不仅支持把日志输出到文件,还支持把日志输出到TCP/UDP服务器,EMAIL服务器,HTTP服务器,UNIX的syslog系统等。在logging中主要有四个概念:logger、handler、filter和formatter,下面会分别介绍。

logger

Logger对象扮演了三重角色:

它给应用程序暴漏了几个方法,以便应用程序能在运行时记录日志。

Logger对象根据日志的级别或根据Filter对象,来决定记录哪些日志。

Logger对象负责把日志信息传递给相关的handler。

在Logger对象中,最常使用的方法分为两类:configuration,message sending。 configuration方法包括:

setLevel(level)

setLevel(level)方法用来设置logger的日志级别,如果日志的级别低于setLevel(level)方法设置的值,那么logger不会处理它。logging模块内建的日志级别有:

CRITICAL = 50
FATAL = CRITICAL
ERROR = 40
WARNING = 30
WARN = WARNING
INFO = 20
DEBUG = 10
NOTSET = 0 (数值越大级别越高)
addFilter(filter)
removeFilter(filter)
addHandler(handler)
removeHandler(handler)

message sending方法包括:

debug(log_message,[*args[,**kwargs]])

使用DEBUG级别,记录log_message % args。

为了记录异常信息,需要将关键字参数exc_info设置为一个true值。

比如:

logger.debug("Houston,we have a %s","thorny problem",exc_info=1)
info(log_message,**kwargs]])

使用INFO级别,记录log_message % args。

为了记录异常信息,需要将关键字参数exc_info设置为一个true值。

比如:

logger.info("Houston,"interesting problem",exc_info=1)
warning(log_message,**kwargs]])

使用WARNING级别,记录log_message % args。

为了记录异常信息,需要将关键字参数exc_info设置为一个true值。

比如:

logger.warning("Houston,"bit of a problem",exc_info=1)
error(log_message,**kwargs]])

使用Error级别,记录log_message % args。

为了记录异常信息,需要将关键字参数exc_info设置为一个true值。

比如:

logger.error("Houston,"major problem",exc_info=1)
critical(log_message,**kwargs]])

使用CRITICAL级别,记录log_message % args。

为了记录异常信息,需要将关键字参数exc_info设置为一个true值。

比如:

logger.critical("Houston,"major disaster",exc_info=1)
exception(message[,*args]) 
self.error(*((msg,) + args),**{'exc_info': 1})
log(log_level,log_message,**kwargs]])

使用整型的级别level,记录log_message % args。

为了记录异常信息,需要将关键字参数exc_info设置为一个true值。

比如:

logger.log(level,"We have a %s","mysterious problem",exc_info=1)
logging.getLogger([name])

方法返回一个Logger实例的引用,如果提供了name参数,那么它就是这个Logger实例的名称,如果没提供name参数,那么这个Logger实例的名称是root。

可以通过Logger实例的name属性,来查看Logger实例的名称。

Logger实例的名称是使用句号(.)分隔的多级结构。

在这种命名方式中,后面的logger是前面的logger的子(父子logger只是简单的通过命名来识别),比如:有一个名称为foo的logger,那么诸如foo.bar、foo.bar.baz和foo.bam这样的logger都是foo这个logger的子logger。

子logger会自动继承父logger的定义和配置。

使用相同的名称多次调用logging.getLogger([name])方法,会返回同一个logger对象的引用。

这个规则不仅仅在同一个module有效,而且对在同一个Python解释器进程的多个module也有效。

因此应用程序可以在一个module中定义一个父logger,然后在其他module中继承这个logger,而不必把所有的logger都配置一遍。

handler

(编辑:安卓应用网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读