龙空技术网

一篇文章搞定Python logger模块

埋头苦干的小码农 235

前言:

当前咱们对“pythonlogger”都比较关切,各位老铁们都想要分析一些“pythonlogger”的相关内容。那么小编也在网摘上收集了一些对于“pythonlogger””的相关知识,希望咱们能喜欢,看官们快快来了解一下吧!

logger模块

# logger对象配置import logginglogger = logging.getLogger()# 创建一个handler,用于写入日志文件fh = logging.FileHandler('test.log',encoding='utf-8')# 再创建一个handler,用于输出到控制台ch = logging.StreamHandler()formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')fh.setLevel(logging.DEBUG)fh.setFormatter(formatter)ch.setFormatter(formatter)logger.addHandler(fh) #logger对象可以添加多个fh和ch对象logger.addHandler(ch)logger.debug('logger debug message')logger.info('logger info message')logger.warning('logger warning message')logger.error('logger error message')logger.critical('logger critical message')

logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:logger.setLevel(logging.Debug)设置级别,也可以通过

  fh.setLevel(logging.Debug)单对文件流设置某个级别。

简单将错误信息简单打印到控制台方法

import logginglogging.debug('Debug状态')logging.info('输入状态')logging.warning('警告级别错误')logging.error('产生错误信息')logging.critical('产生严重错误')# 结果#WARNING:root:警告级别错误#ERROR:root:产生错误信息#CRITICAL:root:产生严重错误

由结果看出python的logging模块将日志打印到了标准输出中,并且只显示了大于等于WARNING(警告)级别的日志,这说明默认的日志级别设置为WARNING。

(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET)

默认的日志格式为日志级别:Logger名称:用户输出消息。

灵活配置日志级别,日志格式,输出位置

import logginglogging.basicConfig(level=logging.DEBUG,  # 设置日志显示级别                    format='%(asctime)s[line:%(lineno)d] %(levelname)s %(message)s',                    datefmt='%A, %d %B %Y %H:%M:%S',  # 指定日期时间格式                    filename='sos.log',  # 指定日志存储的文件及位置                    filemode='w',  # 文件打开方式                    )  # 指定handler使用的日志显示格式import logginglogging.debug('Debug状态')logging.info('输入状态')logging.warning('警告级别错误')logging.error('产生错误信息')logging.critical('产生严重错误')# 结果# Thursday, 25 January 2018 17:10:38[line:47] DEBUG Debug状态# Thursday, 25 January 2018 17:10:38[line:48] INFO 输入状态# Thursday, 25 January 2018 17:10:38[line:49] WARNING 警告级别错误# Thursday, 25 January 2018 17:10:38[line:50] ERROR 产生错误信息# Thursday, 25 January 2018 17:10:38[line:51] CRITICAL 产生严重错误

在logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有

  filename:用指定的文件名创建FiledHandler(后边会具体讲解handler的概念),这样日志会被存储在指定的文件中。

  filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。

  format:指定handler使用的日志显示格式。

  datefmt:指定日期时间格式。

  level:设置rootlogger(后边会具体讲解概念)的日志级别

  stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件,默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。

format参数中可能用到的格式化串

%(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用户输出的消息

若要对logging进行更多灵活的控制有必要了解一下Logger,Handler,Formatter,Filter的概念上述几个例子中我们了解到了:

logging.debug()、logging.info()、logging.warning()、logging.error()、logging.critical()(分别用以记录不同级别的日志信息)

logging.basicConfig()(用默认日志格式(Formatter)为日志系统建立一个默认的流处理器(StreamHandler),设置基础配置(如日志级别等)并加到root logger(根Logger)中)这几个logging模块级别的函数,另外还有一个模块级别的函数是logging.getLogger([name])(返回一个logger对象,如果没有指定名字将返回root logger)

具体例子

import logging# 创建一个logging对象logger = logging.getLogger()# 创建一个handler,用于写入日志文件fh = logging.FileHandler('sos.log', mode='w', encoding='utf-8')# 再创建一个handler用于输出到控制台ch = logging.StreamHandler()# 定义输出格式(可以定义多个输出格式例formatter1,formatter2)formatter = logging.Formatter('%(asctime)s %(levelname)s %(filename)s [line %(lineno)d]')# 定义日志输出层级logger.setLevel(logging.DEBUG)# 定义控制台输出层级logger.setLevel(logging.DEBUG)# 为文件操作符绑定格式(可以绑定多种格式例fh.setFormatter(formatter2))fh.setFormatter(formatter)# 为控制台操作符绑定格式(可以绑定多种格式例ch.setFormatter(formatter2))ch.setFormatter(formatter)# 给logger对象绑定文件操作符logger.addHandler(fh)# 给logger对象绑定文件操作符logger.addHandler(ch)# 错误信息logging.debug('Debug状态')logging.info('输入状态')logging.warning('警告级别错误')logging.error('产生错误信息')logging.critical('产生严重错误')
多种可用的Handlerlogging.StreamHandler 可以向类似与sys.stdout或者sys.stderr的任何文件对象(file object)输出信息logging.FileHandler 用于向一个文件输出日志信息logging.handlers.RotatingFileHandler 类似于上面的FileHandler,但是它可以管理文件大小。当文件达到一定大小之后,它会自动将当前日志文件改名,然后创建一个新的同名日志文件继续输出logging.handlers.TimedRotatingFileHandler 和RotatingFileHandler类似,不过,它没有通过判断文件大小来决定何时重新创建日志文件,而是间隔一定时间就自动创建新的日志文件logging.handlers.SocketHandler 使用TCP协议,将日志信息发送到网络。logging.handlers.DatagramHandler 使用UDP协议,将日志信息发送到网络。logging.handlers.SysLogHandler 日志输出到sysloglogging.handlers.NTEventLogHandler 远程输出日志到Windows NT/2000/XP的事件日志logging.handlers.SMTPHandler 远程输出日志到邮件地址logging.handlers.MemoryHandler 日志输出到内存中的制定bufferlogging.handlers.HTTPHandler 通过"GET"或"POST"远程输出到HTTP服务器目前工程环境下使用代码用例
import loggingfrom logging import handlersimport osdef make_dir(make_dir_path):    """如果文件夹不存在就创建"""    path = make_dir_path.strip()    if not os.path.exists(path):        os.makedirs(path)    return pathlevel_relations = {        'debug': logging.DEBUG,        'info': logging.INFO,        'warning': logging.WARNING,        'error': logging.ERROR,        'crit': logging.CRITICAL    }log = logging.getLogger('text.log')  # log文件名format_str = logging.Formatter('%(asctime)s - %(pathname)s - [line:%(lineno)d] - %(levelname)s > %(message)s')log.setLevel(level_relations.get("info"))sh = logging.StreamHandler()sh.setFormatter(format_str)log_file_folder = os.path.abspath(os.path.join(os.path.dirname(__file__))) + os.sep + "logs" + os.sepmake_dir(log_file_folder)log_file_str = log_file_folder + os.sep + "text.log"th = handlers.TimedRotatingFileHandler(filename=log_file_str, when='H', encoding='utf-8')th.setFormatter(format_str)log.addHandler(sh)log.addHandler(th)if __name__ == '__main__':    log.debug('debug')    log.info('info')    log.warning('警告')    log.error('报错')    log.critical('严重')

#Python##Python基础##Python 语言##科技新星创作营##Python入门推荐#

标签: #pythonlogger #python loggerlog #python引入log函数