内置模块-logging

loging模块是python提供的内置模块,用来做日志处理。

日志等级:

等级 释义 级别数值
CRITICAL(fatal) 致命错误,程序根本跑不起来 50
ERROR 运行错误,程序运行发生错误的地方时就会退出程序 40
WARNING 运行警告,程序运行发生警告的地方时会显示警告提示,但是程序会继续往下执行 30
INFO 运行提示,一般的系统信息,并非日志 20
DEBUG 调试信息,排查故障时使用的低级别系统信息 10

logging的执行是多线程的。

1. 基本函数

函数 说明
logging.debug(msg, *args, **kwargs) 创建一条严重级别为DEBUG的日志记录
logging.info(msg, *args, **kwargs) 创建一条严重级别为INFO的日志记录
logging.warning(msg, *args, **kwargs) 创建一条严重级别为WARNING的日志记录
logging.error(msg, *args, **kwargs) 创建一条严重级别为ERROR的日志记录
logging.critical(msg, *args, **kwargs) 创建一条严重级别为CRITICAL的日志记录
logging.log(level, *args, **kwargs) 创建一条严重级别为level的日志记录
logging.basicConfig(**kwargs) 对root logger进行一次性配置

不推荐使用basicConfig对日志等级进行自我创作,因为会影响代码的移植性,代码在别人那里容易起冲突。

2. 基本使用

logging模块的默认输出级别是warning。

import logging

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.') # 默认的日志输出级别是warning,
# 所以以上代码运行时结果是:
# WARNING:root:This is a warning log.
# ERROR:root:This is a error log.
# CRITICAL:root:This is a critical log.

basicConfig常见参数:

  • level:设置日志级别
  • filename:设置日志输出文件名
  • filemode:设置日志输出模式
  • format:设置日志格式
  • datefmt:设置时间格式("%Y-%m-%d %H:%M:%S")

level:设置输出级别:

import logging

logging.basicConfig(level=logging.DEBUG)
# 将日志的输出级别设置为debug

filename:设置日志文件

默认日志的输出是在终端,

可通过指定文件名的方式将日志记录到文件中,默认是追加模式。

import logging

logging.basicConfig(level=logging.DEBUG, filename='demo.log')
# 将日志输出结果记录到文件demo.log中。(不存在则创建)

filemode:设置写入模式

通过filemode参数设置写入方式

import logging

logging.basicConfig(level=logging.DEBUG, filename='demo.log', filemode='w')

format:设置日志格式

logging.basicConfig(
filename='demo.log',
level=logging.DEBUG,
format="%(asctime)s|%(levelname)s|%(message)s|%(filename)s:%(lineno)s",
)

datefmt:设置日期格式

logging.basicConfig(
filename='demo.log',
level=logging.DEBUG,
format="%(asctime)s|%(levelname)s|%(message)s|%(filename)s:%(lineno)s",
datefmt="%Y-%m-%d %H:%M:%S",
)

3. 高级应用

3.1 相关组件

名称 作用 比喻
Loggers 记录器,提供应用程序代码直接使用的接口 记录的笔
Handlers 处理器,将记录器产生的日志发送至目的地 记录的材质(纸张)
Filters 过滤器,提供更好的粒度控制,决定哪些日志会被输出 哪些需要写,哪些不需要写
Formatters 格式化器,设置日志内容的组成结构和消息字段 书写的格式

3.2 loggers

日志对象。

相当于创建一支笔。

import logging

# 创建一个Logger,名称是cn.cccb.applog
logger = logging.getLogger('cn.cccb.applog') # 设置为日志输出级别
logger.setLevel(logging.WARNING)

3.3 Handlers

Handler是用于将日志分发到不同的目的地。

可以是终端(默认)、文件、邮件、或者通过 socket、http等协议发送到任何地方。

相当于不同的输出媒介。

以下是常见的Handler:

  • StreamHandler:标准输出stout分发器
import logging

sh = logging.StreamHandler(stream=None)
  • FileHandler:将日志保存到磁盘文件的处理器
import logging

fh = logging.FileHandler(filename,mode='a',encoding=None,delay=False)
  • BaseRotatingHandler
  • RotatingFileHandler:滚动的多日志输出,按照时间or其他方式去生成多个日志
  • TimedRotatingFileHandler

以下Handler使用得较少

  • SocketHandler
  • DataaramHandler
  • SmtpHandler
  • SyslogHandler
  • NteventlogHandler
  • HttpHandler
  • WatchedFileHandler
  • QuteleHandler
  • NullHandler

每一个handler都有一个setFormatter()方法,

用于设置当前Handler对象使用Formatter,以指定日志的输出格式。

3.4 Formatters格式

Formatter对象用来设置日志信息的结构和内容。

其构造方法是:

import logging

# 创建formatter,并设置formatter的格式
formatter = logging.Formatter("%(asctime)s|%(levelname)8s|%(filename)10s%(lineno)s|%(message)s")
属性 格式 描述
asctime %(asctime)s 日志产生的时间,默认格式为:2003-07-08 16:49:45,896
msecs %(msecs)d 日志生成时间的亳秒部分
created %(created)f time.time()生成的日志创建时间戳
message %(message)s 具体的日志信息
filename %(filename)s 生成日志的程序名
name %(name)s 日志调用者
funcname %(funcname)s 调用日志的函数名
levelname %(levelname)s 日志级別(DEBUG,INFO, WARNING, ERROR,CRITICAL)
levene %(leveling)s 日志级别对应的数值
lineno %(lineno)d 日志所针对的代码行号(如果可用的话)
module %(module)s 生成日志的模块名
pathname %(pathname)s 生成日志的文件的完整路径
process %(process)d 生成日志的进程ID(如果可用)
processname %(processname)s 进程名(如果可用)
thread %(thread)d 生成日志的线程ID(如果可用)
threadname %(threadname)s 线程名(如果可用)

3.5 案例

# 创建一个Logger,名称是cn.cccb.applog
logger = logging.getLogger('cn.cccb.applog') # 设置为日志输出级别
logger.setLevel(logging.DEBUG) # 创建终端Handler,并设置输出级别
consoleHandler = logging.StreamHandler()
consoleHandler.setLevel(logging.DEBUG) # 创建文件Handler,并设置输出级别
fileHandler = logging.FileHandler(filename='addDemo.log')
fileHandler.setLevel(logging.INFO) # 创建formatter,并设置formatter的格式
formatter = logging.Formatter("%(asctime)s|%(levelname)8s|%(filename)10s%(lineno)s|%(message)s")
#里面的8,10实现了占位对齐 # 给每个处理器设置格式
consoleHandler.setFormatter(formatter)
fileHandler.setFormatter(formatter) # 给logger设置handler
logger.addHandler(consoleHandler)
logger.addHandler(fileHandler) #定义一个过滤器,过滤logger的名称,以cn.cccb开头的才会被处理。
# flt = logging.Filter("cn.cccb") # 关联过滤器
# logger.addFilter(flt) # 可以是给logger设置过滤器
# fileHandler.addFilter(flt) # 可以是给handler设置过滤器 name = 'zibuyu'
age = 18 # 打印日志的代码
# logging.debug() #不能使用这个了!!!会使用WARNING的版本,不会用之前的记录器
logger.debug("姓名 %s, 年龄%d" % (name, age))
logger.debug("姓名 {}, 年龄{}".format(name, age))
logger.debug(f"姓名{name}, 年龄{age}")

上面的案例中,logger、handler和formatter都可以设置日志的输出级别,它们之间的关系是逐层过滤。

4. 通过配置文件

logging.conf:

# 配置记录器名称:提供应用程序代码直接使用的接口
# 注意:root必须存在!!!
[loggers]
keys=root,applog # 配置处理器名称,将记录器产生的日志发送至目的地
[handlers]
keys=fileHandler,consoleHandler # 配置格式化器,设置日志内容的组成结构和消息字段
[formatters]
keys=simpleFormatter # 设置记录器root的级别与种类
# 节点名称必须是logger_+上面配置的记录器名称
[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 # 通过文件配置创建logger
logging.config.fileConfig('logging.conf') # 使用字典进行配置
# logging.config.dictConfig({"loggers":"root,applog"}) rootLogger = logging.getLogger()
rootLogger.debug("This is root Logger, debug") logger = logging.getLogger('applog')
logger.debug("This is applog, debug") try:
a = 'qwe'
int(a) # 故意出错。
except Exception as e:
logger.exception(e)

注意:配置文件的默认编码是gbk。

在python 3.10 版本,fileConfig新增了 encoding 形参,可以指定配置文件的编码。

5. Django配置

使用django进行开发时,对于日志的配置,写入系统的配置文件中即可。

继而就可以在任何文件中直接调用。

import logging

logger = logging.getLogger('django')

配置信息:

# 日志
LOGGING = {
'version': 1, # 日志模块的版本,目前官方提供的版本是1,为避免以后因官方升级而出现的版本问题,所以这里固定为1
'disable_existing_loggers': False, # 是否禁用其他的已经存在的日志功能。实际开发中常常设置为False。
'formatters': { # 日志格式设置,verbose或者simple都是自定义的。
'verbose': { # 详细格式,开发人员不在场情况下的日志记录。
# 格式定义:https://docs.python.org/3/library/logging.html#logrecord-attributes
# levelname 日志等级
# asctime 发生时间
# module 文件名
# process 进程ID
# thread 线程ID
# message 异常信息
'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message}',
'style': '{', # 设置变量格式分隔符
},
'simple': { # 简单格式,开发人员在场情况下的终端输出
'format': '{levelname} {message}',
'style': '{',
},
},
'filters': { # 过滤器,调用django内置的过滤器
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
'console': {
'level': 'DEBUG', # 设置日志等级
'filters': ['require_debug_true'], # 设置过滤器
'class': 'logging.StreamHandler', # 设置当前handler的核心类,StreamHandler:把日志信息输出到终端下
'formatter': 'simple' # 设置日志格式
},
'file': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
# 日志文件存放位置,日志保存目录logs必须手动创建
'filename': BASE_DIR.parent / "logs/demo.log",
# 单个日志文件的最大值,这里我们设置300M
'maxBytes': 300 * 1024 * 1024,
# 备份日志文件的数量,设置最大日志数量为10
'backupCount': 10,
# 日志格式:详细格式
'formatter': 'verbose'
},
},
'loggers': { # 日志处理的命名空间
'django': { # logger取名为django。
'handlers': ['console', 'file'], # 当基于django命名空间写入日志时,调用console与file日志处理流程。
'propagate': True, # 是否在django命名空间对应的日志处理流程结束以后,冒泡通知其他的日志功能。True表示允许
},
}
}

python内置模块——logging的更多相关文章

  1. Python内置模块-logging

    一.初识logging模块 import logging logging.debug("debug message") #级别最低,只有在诊断问题时才有兴趣的详细信息. loggi ...

  2. Python 入门之 内置模块 --logging模块

    Python 入门之 内置模块 --logging模块 1.logging -- 日志 (1)日志的作用: <1> 记录用户信息 <2> 记录个人流水 <3> 记录 ...

  3. Python学习笔记【第八篇】:Python内置模块

    什么时模块 Python中的模块其实就是XXX.py 文件 模块分类 Python内置模块(标准库) 自定义模块 第三方模块 使用方法 import 模块名 form 模块名 import 方法名 说 ...

  4. python 内置模块续(二)

    目录 python 内置模块补充 1.hashlib模块 简易使用: 高级使用: 进阶使用: 加盐处理: 校验文件一致性 2.logging日志模块 日志等级 常用处理 "四大天王" ...

  5. Python之logging模块

    一.引言 之前在写一些小程序的时候想把日志内容打到文件中,所以就自己写了一个logger.py的程序,如下: #!/usr/bin/python # -*- coding=utf-8 -*- impo ...

  6. python内置模块(4)

    这一部分是python内置模块系列的最后一部分,介绍了一些小巧有用的内置模块. 目录: 1.random 2.shelve 3.getpass 4.zipfile 5.tarfile 6.bisect ...

  7. python模块 ---logging模块

    摘要by crazyhacking: 与log4cxx一样,分为三个部分,logger, handler,formatter. 详细内容参考:1官网http://docs.python.org/2/h ...

  8. python的logging模块

    python提供了一个日志处理的模块,那就是logging 导入logging模块使用以下命令: import logging logging模块的用法: 1.简单的将日志打印到屏幕上 import ...

  9. python 多进程 logging:ConcurrentLogHandler

    python 多进程 logging:ConcurrentLogHandler python的logging模块RotatingFileHandler仅仅是线程安全的,如果多进程多线程使用,推荐 Co ...

  10. python的logging模块之读取yaml配置文件。

    python的logging模块是用来记录应用程序的日志的.关于logging模块的介绍,我这里不赘述,请参见其他资料.这里主要讲讲如何来读取yaml配置文件进行定制化的日志输出. python要读取 ...

随机推荐

  1. laravel artisan 常用命令

    命令 说明 php artisan key:generate 生成 App Key php artisan make:controller 生成控制器 php artisan make:model 生 ...

  2. Web攻防--xxe实体注入

    web攻防--xxe实体注入 漏洞简介 XML 外部实体注入(也称为 XXE)是一种 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理.它通常允许攻击者查看应用程序服务器文件系统上的文件 ...

  3. 从壹开始前后端开发【.Net6+Vue3】

    项目名称:KeepGoing(继续前进) 1.1介绍 工作后,学习的脚步一直停停走走,希望可以以此项目为基础,可以不断的迫使自己不断的学习以及成长 将以Girvs框架为基础,从壹开始二次开发一个前后端 ...

  4. 番外1.ssh连接管理器

    目录 本篇前瞻 项目背景 ssh连接管理器 优点 使用方式 配置 使用方法 快速开始 注意点 使用样例 本篇后记 本篇前瞻 学习完go语言基础的专栏,我们究竟写出怎么样的实用工具呢?我在github上 ...

  5. 【路由器】OpenWrt 配置使用

    目录 Web 界面 汉化 root 密码 ssh 升级 LuCI 美化 锐捷认证 MentoHUST MiniEAP 防火墙 开放端口 端口转发 IPv6 USB 安装 USB 驱动 自动挂载 Ext ...

  6. 零代码基础,一分钟教你快速搭建微信ChatGPT机器人!

    本教程收集于:ChatGPT聊天机器人搭建全攻略汇总:精心整理 Github登录账号后,先Forck下仓库:https://github.com/zhayujie/chatgpt-on-wechat ...

  7. ATtiny88初体验(五):ADC

    ATtiny88初体验(五):ADC ADC模块介绍 ATtiny88单片机包含一个10bit分辨率的ADC模块,拥有8个通道,最大采样率15kSPS,转换时间14us.ATtiny88的ADC参考电 ...

  8. Salesforce LWC学习(四十五) lwc支持Console App控制Tab了

    本篇参考:https://help.salesforce.com/s/articleView?id=release-notes.rn_lwc_workspaceAPI.htm&release= ...

  9. java循环自动生成简单图片

    import java.awt.*; import java.awt.font.FontRenderContext; import java.awt.geom.Rectangle2D; import ...

  10. 3步体验在DAYU200开发板上完成OpenHarmony对接华为云IoT

    本文分享自华为云社区<DAYU200+OpenHarmony 3.1.1对接华为云IOT[华为云IoT+鸿蒙]>,作者:DS小龙哥. 一.前言 OpenHarmony 3.1.1 是一个开 ...