首页 > 编程语言 >python内置模块——logging

python内置模块——logging

时间:2023-05-11 23:34:09浏览次数:52  
标签:内置 logging log python filename 设置 日志 logger

内置模块-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 格式化器,设置日志内容的组成结构和消息字段 书写的格式

image-20230510233959394

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 形参,可以指定配置文件的编码。

标签:内置,logging,log,python,filename,设置,日志,logger
From: https://www.cnblogs.com/zibuyu2015831/p/17392568.html

相关文章

  • Python学习之二:不同数据库相同表是否相同的比较方法
    摘要昨天学习了使用python进行数据库主键异常的查看.当时想我们有跨数据库的数据同步场景.对应的我可以对不同数据库的相同表的核心字段进行对比.这样的话能够极大的提高工作效率.我之前写过很长时间的shell.昨天跟着同事开始学python.感觉的确用python能够节约大量的时间.......
  • python读取txt文本匹配excel内容
    别人的需求,一个小脚本、代码如下:importopenpyxl#打开Excel文件path=r'D:\Paper\data_late.xlsx'workbook=openpyxl.load_workbook(path)#获取第一个工作表worksheet=workbook.active#获取字符串列的值,并将其转换为列表strings=[cell.valueforcelli......
  • python中的内置异常
    1关于异常代码中遇到错误时会引发异常,python中有许多内置的异常类来表示某种具体异常,当然也可以自定义异常类,当异常未被捕获或处理时,代码会在引发异常处终止,并将异常信息显示在回溯信息中(tarceback)如下上面可在traceback中看到一些关于异常的具体信息,由于改异常未被捕获或处......
  • Python try...catch All In One
    Pythontry...catchAllInOnePython异常处理try...exceptwhileTrue:try:x=int(input("Pleaseenteranumber:"))breakexceptValueError:print("Oops!Thatwasnovalidnumber.Tryagain...")excep......
  • Python复制文件的9种方法
    以下是演示“如何在Python中复制文件”的九种方法。1.shutilcopyfile()方法2.shutilcopy()方法3.shutilcopyfileobj()方法4.shutilcopy2()方法5.ospopen方法6.os系统()方法7.Thread()方法8.子进程调用()方法9.子进程check_output()方法1.......
  • 第二节:编程语言与Python介绍
    一引子基于上一节所学,有了计算机硬件,再在硬件之上安装好操作系统,我们就有了一个应用程序的运行平台,我们接下来的任务就是学习如何使用某款编程语言来开发应用程序。本章的主题是先带大家了解下编程语言,然后重点介绍Python这门编程语言二编程语言分类:2.1机器语言机器语言......
  • Why are Python strings immutable? 字符串是否可以改变
    实践1、pythons="abc"s+="34" #OK print(s)s[0]="k" # TypeError:'str'objectdoesnotsupportitemassignment   golang  s:="abc"  s+="456"  fmt.Println(s)  s[0]="......
  • python环境的安装与设置和oneforall的安装与使用
    下载python:https://www.python.org/downloads/windows/安装python如果不需要修改路径,下面两个√打开后,点击上面的installnow也可以可以选择修改安装路径下载OneForALL:在github上边下载安装OneForALL复制你安装OneForALL的路径,比如我的是C:Windows\OneForAll-master回到桌面,按win......
  • 使用Open3D进行PCD拟合平面的Python代码示例
    使用Open3D进行PCD拟合平面的Python代码示例 importopen3daso3dimportnumpyasnp#读取点云数据pcd=o3d.io.read_point_cloud("2023042501.pcd")#创建PCD图pcd_graph=o3d.geometry.PointCloudGraph(pcd)#选择要拟合的平面plane_cent......
  • Python协程asyncio
    在Python使用multiprocessing进行多线程和多进程操作 这篇文章中介绍了使用多线程的方式对一些I/O操作(文件读写、网络请求,这些操作不用等待其结束,在此期间可以做其他事情)进行加速。而本篇文章介绍的协程可以理解成“微线程”,不开辟其他线程,只在一个线程中执行,并且执行函数时......