发布于2019-08-17 14:55 阅读(1653) 评论(0) 点赞(0) 收藏(1)
▾ 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")
▾ 从字典中获取配置信息
import logging.config config = { 'version': 1, 'formatters': { 'simple': { 'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s', }, # 其他的 formatter }, 'handlers': { 'console': { 'class': 'logging.StreamHandler', 'level': 'DEBUG', 'formatter': 'simple' }, 'file': { 'class': 'logging.FileHandler', 'filename': 'logging.log', 'level': 'DEBUG', 'formatter': 'simple' }, # 其他的 handler }, 'loggers':{ 'StreamLogger': { 'handlers': ['console'], 'level': 'DEBUG', }, 'FileLogger': { # 既有 console Handler,还有 file Handler 'handlers': ['console', 'file'], 'level': 'DEBUG', }, # 其他的 Logger } } logging.config.dictConfig(config) StreamLogger = logging.getLogger("StreamLogger") FileLogger = logging.getLogger("FileLogger") # 省略日志输出
▾ 从配置文件中获取配置信息
▾ test.ini 文件
[loggers] keys=root,sampleLogger [handlers] keys=consoleHandler [formatters] keys=sampleFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_sampleLogger] level=DEBUG handlers=consoleHandler qualname=sampleLogger propagate=0 [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=sampleFormatter args=(sys.stdout,) [formatter_sampleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
▾ testinit.py 文件
import logging.config logging.config.fileConfig(fname='test.ini', disable_existing_loggers=False) logger = logging.getLogger("sampleLogger") # 省略日志输出
▾ test.yaml 文件
version: 1
formatters:
simple:
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
loggers:
simpleExample:
level: DEBUG
handlers: [console]
propagate: no
root:
level: DEBUG
handlers: [console]
▾ testyaml.py 文件
import logging.config # 需要安装 pyymal 库 import yaml with open('test.yaml', 'r') as f: config = yaml.safe_load(f.read()) logging.config.dictConfig(config) logger = logging.getLogger("sampleLogger") # 省略日志输出
▾ 中文乱码
• # 自定义 Logger 配置
handler = logging.FileHandler(filename="test.log", encoding="utf-8")
• # 使用默认的 Logger 配置
logging.basicConfig(handlers=[logging.FileHandler("test.log", encoding="utf-8")], level=logging.DEBUG)
▾ 临时禁用日志输出
logging.disable(logging.INFO)
logger.disabled = True
▾ 日志文件按照时间划分或者按照大小划分
▾ 按大小划分
# 每隔 1000 Byte 划分一个日志文件,备份文件为 3 个 file_handler = logging.handlers.RotatingFileHandler("test.log", mode="w", maxBytes=1000, backupCount=3, encoding="utf-8")
▾ 按时间划分
# 每隔 1小时 划分一个日志文件,interval 是时间间隔,备份文件为 10 个 handler2 = logging.handlers.TimedRotatingFileHandler("test.log", when="H", interval=1, backupCount=10)
作者:坚持才能胜利
链接:https://www.pythonheidong.com/blog/article/47541/eab8af389ab1d4527818/
来源:python黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 python黑洞网 All Rights Reserved 版权所有,并保留所有权利。 京ICP备18063182号-1
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!