日志的使用的三种方式方式
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,) datefmt默认是%Y-%m-%d %H:%M:%S样式的 style参数默认为 百分符%,这表示%()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)


