? logging模块
? 简介
• Python内置标准模块
• 输出运行日志
• 设置输出日志等级、日志保存路径、日志文件回滚
? 与print相比有以下优点
• print把所有信息都输出到标准输出中,严重影响开发者从标准输出中查看其他数据
• Logging则可以由开发者决定将信息输出到什么地方,以及怎么输出
? 使用
? 基本使用
import logging logging.basicConfig(level = logging.INFO,format = ‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘) logger = logging.getLogger(__name__) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish")
? Logging中可以选择很多消息级别
• CRITICAL > ERROR > WARNING > INFO > DEBUG
• debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上
• info : 打印info,warning,error,critical级别的日志,确认一切按预期运行
• warning : 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作
• error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能
• critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行
? logging.basicConfig函数各参数
• filename 指定日志文件名
• filemode 和file函数意义相同,指定日志文件的打开模式,’w’或者’a’
? format 指定输出的格式和内容,format可以输出很多有用的信息
• %(levelno)s:打印日志级别的数值
• %(levelname)s:打印日志级别的名称
• %(pathname)s:打印当前执行程序的路径,其实就是sys.argv[0]
• %(filename)s:打印当前执行程序名
• %(funcName)s:打印日志的当前函数
• %(lineno)d:打印日志的当前行号
• %(asctime)s:打印日志的时间
• %(thread)d:打印线程ID
• %(threadName)s:打印线程名称
• %(process)d:打印进程ID
• %(message)s:打印日志信息
• datefmt:指定时间格式,同time.strftime()
• level:设置日志级别,默认为logging.WARNNING
• stream:指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略
? 将日志写入文件
? 设置logging,创建一个FileHandler,并对输出消息的格式进行设置,将其添加到logger,然后将日志写入到指定的文件中
import logging logger = logging.getLogger(__name__) logger.setLevel(level = logging.INFO) handler = logging.FileHandler("log.txt") handler.setLevel(logging.INFO) formatter = logging.Formatter(‘%(asctime)s - %(name)s - %(levelname)s - %(message)s‘) handler.setFormatter(formatter) logger.addHandler(handler) logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish")
? 将日志同时输出到屏幕
console = logging.StreamHandler() console.setLevel(logging.WARNING) formatter = logging.Formatter(‘%(asctime)s - %(message)s‘) console.setFormatter(formatter) logger.addHandler(console)
? 可以发现,logging有一个日志处理的主对象,其他处理方式都是通过addHandler添加进去,logging中包含的handler主要有如下几种
• StreamHandler:logging.StreamHandler;日志输出到流,可以是sys.stderr,sys.stdout或者文件
• FileHandler:logging.FileHandler;日志输出到文件
• BaseRotatingHandler:logging.handlers.BaseRotatingHandler;基本的日志回滚方式
• RotatingHandler:logging.handlers.RotatingHandler;日志回滚方式,支持日志文件最大数量和日志文件回滚
• TimeRotatingHandler:logging.handlers.TimeRotatingHandler;日志回滚方式,在一定时间区域内回滚日志文件
• SocketHandler:logging.handlers.SocketHandler;远程输出日志到TCP/IP sockets
• DatagramHandler:logging.handlers.DatagramHandler;远程输出日志到UDP sockets
• SMTPHandler:logging.handlers.SMTPHandler;远程输出日志到邮件地址
• SysLogHandler:logging.handlers.SysLogHandler;日志输出到syslog
• NTEventLogHandler:logging.handlers.NTEventLogHandler;远程输出日志到Windows NT/2000/XP的事件日志
• MemoryHandler:logging.handlers.MemoryHandler;日志输出到内存中的指定buffer
• HTTPHandler:logging.handlers.HTTPHandler;通过"GET"或者"POST"远程输出到HTTP服务器
? 使用示例
import logging log_format = "%(levelname)s | %(asctime)s | %(pathname)s | funcName:%(funcName)s | lineno:%(lineno)s | message:%(message)s" logging.basicConfig(level = logging.ERROR,format = log_format) logger = logging.getLogger(__name__) logger.setLevel(level = logging.DEBUG) def add_file_handler(logger, filename): handler = logging.FileHandler(filename) handler.setLevel(logging.WARNING) logger.addHandler(handler) return logger def add_stream_handler(logger): console = logging.StreamHandler() console.setLevel(logging.WARNING) logger.addHandler(console) if __name__ == ‘__main__‘: logger.info("Start print log") logger.debug("Do something") logger.warning("Something maybe fail.") logger.info("Finish")
原文:https://www.cnblogs.com/cityking5410/p/logging.html