Python的logging,python中logging的用法
基本用法下面的代码展示了记录最基本的用法。
导入日志记录
导入系统
# 获取记录器实例,如果参数为空则返回根记录器
logger=日志记录。获取记录器( AppName )
# 指定记录器输出格式
格式化程序=记录。格式化程序( %(ASC时间)s %(级别名称)-8s:%(消息)s )
# 文件日志
文件处理程序=日志记录文件处理程序(“测试。日志”)
文件处理程序。设置格式化程序(formatter)#可以通过setFormatter指定输出格式
# 控制台日志
console_handler=日志记录StreamHandler(sys.stdout)
控制台_处理程序。formatter=formatter #也可以直接给格式程序赋值
# 为记录器添加的日志处理器
logger.addHandler(文件处理程序)
logger.addHandler(控制台处理程序)
# 指定日志的最低输出级别,默认为警告级别
logger.setLevel(日志记录。信息)
# 输出不同级别的原木
logger.debug(这是调试信息)
logger.info(这是信息)
logger.warn(这是警告消息)
logger.error(这是错误消息)
logger.fatal(这是致命消息,与记录器.关键相同)
logger.critical("这是重要消息")
# 2016-10-08 21:59:19493信息:这是信息
# 2016-10-08 21:59:19493警告:这是警告消息
# 2016-10-08 21:59:19,493错误:这是错误消息
# 2016-10-08 21:59:19,493严重:这是一条致命消息,与日志程序相同。严重
# 2016-10-08 21:59:19493关键:这是一条关键消息
# 移除一些日志处理器
logger.removeHandler(文件处理程序)除了这些基本用法,还有一些常见的小技巧可以分享一下。
格式化输出日志# 格式化输出
service_name=Booking
logger.error(%s服务已关闭!% service_name) #使用大蟒自带的字符串格式化,不推荐
logger.error(%s服务已关闭!,服务名称)#使用记录器的格式化,推荐
logger.error(%s服务是“%s!”,service_name, down) #多参数格式化
logger.error({}服务是{} 。格式(服务名称,向下)#使用格式函数,推荐
# 2018-03-08 21:59:19493错误:订票服务宕机!
记录异常信息当你使用记录模块记录异常信息时,不需要传入该异常对象,只要你直接调用logger.error()或者logger.exception()就可以将当前异常记录下来。
# 记录异常信息
尝试:
1/0
除了:
# 等同于错误级别,但是会额外记录当前抛出的异常堆栈信息
logger.exception(这是一条异常消息)
# 2016-10-08 21:59:19493错误:这是一条异常消息
#回溯(最近一次呼叫):
# File D:/Git/py _ labs/demo/use _ log。py ,第45行,在
# 1/0
# ZeroDivisionError:整数除法或以零为模
记录配置要点GetLogger()方法这是最基本的入口,该方法参数可以为空,默认的记录器名称是根,如果在同一个程序中一直都使用同名的伐木工,其实会拿到同一个实例,使用这个技巧就可以跨模块调用同样的记录器来记录日志。
另外你也可以通过日志名称来区分同一程序的不同模块,比如这个例子。
logger=logging.getLogger(App .UI’)
logger=logging.getLogger(App .服务)
格式程序日志格式格式程序对象定义了原木信息的结构和内容,构造时需要带两个参数:
一个是格式化的模板fmt,默认会包含最基本的水平和消息信息一个是格式化的时间样式datefmt,默认为%Y-%m-%d %H:%M:%S) fmt中允许使用的变量可以参考下表。
%(名称)sLogger的名字%(级别号)s数字形式的日志级别%(级别名)s文本形式的日志级别%(路径名)s调用日志输出函数的模块的完整路径名,可能没有%(文件名)s调用日志输出函数的模块的文件名%(模块)s调用日志输出函数的模块名%(funcName)s调用日志输出函数的函数名%(行号)d调用日志输出函数的语句所在的代码行%(已创建)f当前时间,用一种多用户的计算机操作系统标准的表示时间的浮点数表示%(相对创建)d输出日志信息时的,自记录器创建以来的毫秒数%(asctime)s字符串形式的当前时间。默认格式是"2003-07-08 16:49:45,896"。逗号后面的是毫秒%(线程)d线程身份证。可能没有%(线程名)s线程名。可能没有%(流程)d进程身份证。可能没有%(消息)s用户输出的消息
设置等级日志级别记录有如下级别:调试、信息、警告、错误、严重
默认级别是警告,记录模块只会输出指定水平以上的日志。这样的好处,就是在项目开发时调试用的日志,在产品释放;排放;发布阶段不用一一注释,只需要调整记录器的级别就可以了,很方便。
处理者日志处理器最常用的是流处理器和文件处理程序用于向不同的输出端打日志。
记录包含很多处理者,可能用到的有下面几种
StreamHandlerinstances向流(类似文件的对象)发送错误消息FileHandlerinstances。将错误信息发送到磁盘文件旋转FileHandlerinstances将错误消息发送到磁盘文件,支持最大日志文件大小和日志文件循环TimedRotatingFileHandlerinstances。将错误消息发送到磁盘文件,以特定的时间间隔循环日志文件SocketHandlerinstances向传输控制协议套接字发送错误消息DatagramHandlerinstances。向用户数据报协议(User Datagram Protocol)套接字发送错误信息SMTPHandlerinstances。将错误消息发送到指定的电子邮件地址。
配置配置方法记录的配置大致有下面几种方式。
通过代码进行完整配置,参考开头的例子,主要是通过获取记录器方法实现。通过代码进行简单配置,下面有例子,主要是通过基本配置方法实现。通过配置文件,下面有例子,主要是通过logging.config.fileConfig(文件路径)
logging.basicConfig basicConfig()提供了非常便捷的方式让你配置记录模块并马上开始使用,可以参考下面的例子。具体可以配置的项目请查阅官方文档
导入日志记录
伐木。基本配置(文件名=示例。日志,级别=日志记录.调试)
logging.debug(此消息应转到日志文件)
伐木。基本配置(格式= %(级别名)s:%(消息)s ,级别=日志记录.调试)
logging.debug(此消息应出现在控制台上)
伐木。基本配置(format= %(asctime)S %(message)S ,datefmt=%m/%d/%Y %I:%M:%S %p )
logging.warning(是记录此事件的时间。)备注:其实你甚至可以什么都不配置直接使用默认值在控制台中打日志,用这样的方式替换打印语句对日后项目维护会有很大帮助。
通过文件配置记录如果你希望通过配置文件来管理伐木,可以参考这个官方文档。在log4net或者log4j中这是很常见的方式。
# logging.conf
[伐木工人]
密钥=根
[logger_root]
级别=调试
处理者=控制台处理者
#,timedRotateFileHandler,errorTimedRotateFileHandler
#################################################
[经手人]
keys=consoleHandler,timedRotateFileHandler,errorTimedRotateFileHandler
[处理程序_控制台处理程序]
级别=调试
格式化程序=简单格式化程序
args=(sys.stdout,)
[handler _ timedRotateFileHandler]
级别=调试
格式化程序=简单格式化程序
args=(debug.log , H )
[handler _ errorTimedRotateFileHandler]
级别=警告
格式化程序=简单格式化程序
args=(error.log , H )
#################################################
[格式化程序]
keys=simpleFormatter,multiLineFormatter
[格式化程序_简单格式化程序]
格式=%(级别名)s %(线程名)s %(时间)s: %(消息)s
datefmt=%H:%M:%S
[formatter_multiLineFormatter]
格式=- %(级别名)s -
时间:%(asctime)s
线程:%(线程名)s
文件:%(文件名)s(第%(行号)d行)
消息:
%(消息)s
datefmt=%Y-%m-%d %H:%M:%S假设以上的配置文件放在和模块相同的目录,代码中的调用如下。
导入操作系统
文件路径=OS。路径。加入(OS。路径。目录名(_ _ file _ _), logging.conf )
logging.config.fileConfig(文件路径)
return logging.getLogger()
日志重复输出的坑你有可能会看到你打的日志会重复显示多次,可能的原因有很多,但总结下来无非就一个,日志中使用了重复的处理程序。
第一坑导入日志记录
伐木。基本配置(级别=日志记录.调试)
fmt=%(级别名)s:%(消息)s
console_handler=日志记录StreamHandler()
console_handler.setFormatter(日志记录。格式化程序(fmt))
logging.getLogger().addHandler(控制台处理程序)
logging.info(hello!)
#信息:根:你好!
#信息:你好!上面这个例子出现了重复日志,因为在第3行调用基本配置()方法时系统会默认创建一个处理者,如果你再添加一个控制台处理者时就会出现重复日志。
第二坑导入日志记录
def get_logger():
fmt=%(级别名)s:%(消息)s
console_handler=日志记录StreamHandler()
console_handler.setFormatter(日志记录。格式化程序(fmt))
logger=logging.getLogger(App )
logger.setLevel(日志记录。信息)
logger.addHandler(控制台处理程序)
返回记录器
定义呼叫我():
logger=get_logger()
logger.info(hi )
给我打电话()
给我打电话()
#信息:嗨
#信息:嗨
#信息:嗨在这个例子里嗨居然打印了三次,如果再调用一次给我打电话()呢?我告诉你会打印6次为什么?因为你每次调用get_logger()方法时都会给它加一个新的处理者,你是自作自受。正常的做法应该是全局只配置记录器一次。
第三坑导入日志记录
def get_logger():
fmt=%(级别名)s: %(消息)s
console_handler=日志记录StreamHandler()
console_handler.setFormatter(日志记录。格式化程序(fmt))
logger=logging.getLogger(App )
logger.setLevel(日志记录。信息)
logger.addHandler(控制台处理程序)
返回记录器
def foo():
伐木。基本配置(format=[%(name)s]:%(message)s )
logging.warn(某些模块使用根记录器)
def main():
logger=get_logger()
logger.info(应用程序启动)
foo()
logger.info(应用程序关闭)
主()
#信息:应用程序启动。
# [root]:某些模块使用根记录器
#信息:应用程序关闭。
#[应用]:应用关闭。为嘛最后的应用程序关闭打印了两次?所以在栈溢出上很多人都问,我应该怎么样把根记录器关掉,根记录器太坑爹坑妈了。只要你在程序中使用过根日志记录器,那么默认你打印的所有日志都算它一份。上面的例子没有什么很好的办法,我建议你招到那个没有经过大脑就使用根记录器的人,乱棍打死他或者开除他。
如果你真的想禁用根日志记录器,有两个不是办法的办法:
logging.getLogger().处理程序=[] #删除所有的处理者
logging.getLogger().设置级别(日志记录。关键)#将它的级别设置到最高
小结计算机编程语言中的日志模块作为标准库的一部分,功能还是比较完善的。个人觉得上手简单,另外也支持比如过滤,文件锁等高级功能,能满足大多数项目需求。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。