日志的使用的三种方式方式
1、编程式使用日志
2、logging格式的配置文件
3、字典方式的配置
日志级别
级别 | 级别数值 | 使用实际 |
---|---|---|
DEBUG | 10 | 详情信息,常用于调试 |
INFO | 20 | 程序正常运行过程中产生的一些信息 |
WARNING | 30 | 警告,虽然程序还在正常运行工作,但有可能发生错误(默认) |
ERROR | 40 | 由于更严重的问题,程序已不能执行一些功能 |
CRITICAL | 50 | 严重错误,程序已不能正常运行 |
import logging # 默认输出是 warning 级别 #使用baseConfig()指定日志输出级别 日志输出方式 logging.basicConfig(filename="demo.log",filemode="w",level=logging.DEBUG) logging.debug("this is a debug log") logging.info("this is a info log") logging.warning("this is a warning log") logging.error("this is a error log") logging.critical("this is a critical log")
向日志输出变量
import logging # 默认输出是 warning 级别 logging.basicConfig(level=logging.DEBUG) name="张三" age=18 logging.debug("姓名:%s 年龄:%d",name ,age) logging.debug("姓名:%s 年龄:%d"%(name,age)) logging.debug("姓名:{} 年龄:{}".format(name,age)) logging.debug(f"姓名:{name} 年龄:{age}")
输出格式和添加一些公共信息
import logging # 输出格式和添加一些公共信息logging.basicConfig(format) logging.basicConfig(format="%(asctime)s|%(levelname)s|%(filename)s:%(lineno)s|%(message)s", datefmt="%Y/%m/%d %H:%M:%S",level=logging.DEBUG) name="张三" age=18 logging.debug("姓名:%s 年龄:%d",name ,age) logging.warning(f"姓名:{name} 年龄:{age}")
logging的高级应用
logging模块采用模块化设计,主要包含四种组建
Loggers:记录器,提供应用程序代码能直接使用的接口;
Handles:处理器,将记录器产生的日志发送至目的地;
Filter:过滤器,提供更好的粒度控制,决定哪些日志会被输出;
Formatter:格式化器,设置日志内容的组成结构和消息字段。
loggers 记录器
1.提供应用程序的调用接口
logger=logging.getLogger(__name__) logger是单列
2.决定日志记录的级别
logger.setLevel()
3.将日志内容传递到相关联的handlers中
logger.addHandler()和logger.removeHandler()
Handlers处理器
将日志分发到不同的目的地。可以是文件、标准输出、邮件、或者通过socket、http等协议发送到任何地方。
StreamHandler 标准输出stdout(如显示器)分发器 创建方法:sh=logging.StreamHandler(stream-None) FileHandler 将日志保存到磁盘文件处理器 创建方法:fh=logging.FileHandler(filename,mode="a",encoding=None,delay=False) -------------------------------------------------------------- setFormatter():设置当前handler对象使用的消息格式
常用的Handlers处理器 StreamHandler FileHandler BaseRotatingHandler RotatingFileHandler TimeRotatingFileHandler
Formatters
Formatter对象用来最终设置日志信息的顺讯、结构和内容
构造方法: ft=logging.Formatter.__init__(fmt=None,datefmt=None,style=" %") datefmt默认是%Y-%m-%d %H:%M:%S样式的 style参数默认为 百分符%,这表示%(<dictionary key>)s格式的字符串
格式字符串 | 作用 |
---|---|
%(name)s | 日志记录器的名称(记录通道) |
%(levelno)s | 日志记录级别的数字DEBUG=10、INFO=20、WARNING=30、ERROR=40、CRITICAL=50 |
%(levelname)s | 日志记录级别的文本“DEBUG”、“INFO”、“WARNING”、“ERROR”、“CRITICAL” |
%(pathname)s | 日志调用的源文件的完整路径名 |
%(filename)s | 日志调用的源文件的文件名部分 |
%(module)s | 日志调用的源文件的文件名的名称部分 |
%(lineno)d | 日志调用的源行号 |
%(funcName)s | 日志调用的函数名 |
%(created)f | 打印日志的时间time.time() 的返回值 |
%(asctime)s | 打印日志的时间datetime.datetime.now() 的返回值 |
%(msecs)d | 打印日志的毫秒部分 |
%(relativeCreated)d | 打印日志的时间,毫秒为单位是相对于加载 logging 模块的时间(通常在应用程序启动时) |
%(thread)d | 线程ID |
%(threadName)s | 线程名,一般是主线程 MainThread |
%(process)d | 进程ID |
%(message)s | 日志信息 |
使用配置文件的方式
#./logging.conf #记录器:提供应用程序代码直接使用的接口 #设置记录器名称,root必须存在!!! [loggers] keys=root,applog #处理器,将记录器产生的日志发送至目的地 #设置处理器类型 [handlers] keys=fileHandler,consoleHandler #格式化器,设置日志内容的组成结构和消息字段 #设置格式化器的种类 [formatters] keys=simpleFormatter #设置记录器root的级别与种类 [logger_root] level=DEBUG handlers=consoleHandler #设置记录器applog的级别与种类 [logger_applog] level=DEBUG handlers=fileHandler,consoleHandler #起个对外的名字 qualname=applog #继承关系 propagate=0 #设置 [handler_consoleHandler] class=StreamHandler args=(sys.stdout,) level=DEBUG formatter=simpleFormatter [handler_fileHandler] class=handlers.TimedRotatingFileHandler #在午夜1点(3600s)开启下一个log文件,第四个参数0表示保留历史文件 args=('applog.log','midnight',3600,0) level=DEBUG formatter=simpleFormatter [formatter_simpleFormatter] format=%(asctime)s|%(levelname)8s|%(filename)s[:%(lineno)d]|%(message)s #设置时间输出格式 datefmt=%Y-%m-%d %H:%M:%S
import logging import logging.config logging.config.fileConfig('logging.conf') #使用字典就能从任意格式文件进行配置,字典是一种接口格式 # logging.config.dictConfig({"loggers":"root,applog"}) rootLogger = logging.getLogger('applog') rootLogger.debug("This is root Logger, debug") logger = logging.getLogger('cn.cccb.applog') logger.debug("This is applog, debug") try: int(a) except Exception as e: logger.exception(e)