优秀的编程知识分享平台

网站首页 > 技术文章 正文

python内置模块logging,日志模块

nanyue 2024-08-29 20:54:42 技术文章 4 ℃

一、简介

概要:logging 是python 用于记录日志的标准模块

Logging 模块提供了两种日志记录方式:

  1. 一种方式是使用 Logging 提供的模块级别的函数
  2. 另一种方式是使用 Logging 日志系统的四大组件记录

二、使用

import logging

三、日志级别

日志级别等级排序:critical > error > warning > info > debug,级别越高打印的日志越少,默认级别 warning

级别

级别数值(int)

使用时机

DEBUG

10

详细信息

INFO

20

正常运行过程中产生的一些信息

WARNING

30

警告信息,虽然程序正常运行,但有可能发生错误

ERROR

40

运行出错,程序已经不能执行一些功能了

CRITICAL

50

严重错误,程序已经不能正常运行

  1. logging.debug('Python debug') 打印全部的日志
  2. logging.info('Python info') 正常运行过程中产生的一些信息
  3. logging.warning('Python warning') 警告信息
  4. logging.error('Python Error') 错误信息
  5. logging.critical('Python critical') 严重错误信息
  6. logging.basicConfig() 设置 root 的日志级别,和日志输出格式
/**
*level = logging.DEBUG 日志等级
*format='%(levelname)s:%(message)s' 消息格式
*datefmt='%m/%d/%Y %I:%M:%S %p' 日志时间格式
*filename='test.log' 记录日志到文件
*filemode='w' 文件模式
*/
logging.basicConfig(level,format,datefmt,filename,filemode)

# 显示消息时间
logging.basicConfig(format='%(asctime)s %(message)s')
logging.warning('is when this event was logged.')
logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
logging.warning('is when this event was logged.')

# 更改显示消息的格式
logging.basicConfig(format='%(levelname)s:%(message)s',level=logging.DEBUG)
logging.debug('Python message format Debug')
logging.info('Python message format Info')
logging.warning('Python message format Warning')
  1. format参数

属性

格式

描述

asctime

%(asctime)s

日志产生的时间,默认格式为msecs2003-07-0816:49:45,896

msecs

%(msecs)d

日志生成时间的亳秒部分

created

%(created)f

time.tme生成的日志创建时间戳

message

%(message)s

具体的日志信息

filename

%(filename)s

生成日志的程序名

name

%(name)s

日志调用者 (日志记录器的名称)

funcname

%(funcName)s

调用日志的函数名

levelname

%(levelname)s

日志级別( DEBUG,INFO, WARNING, 'ERRORCRITICAL)

levene

%( leveling)s

日志级别对应的数值

lineno

%(lineno)d

日志所针对的代码行号(如果可用的话)

module

%( module)s

生成日志的模块名

pathname

%( pathname)s

生成日志的文件的完整路径

process

% (process)d

生成日志的进程D(如果可用)

processname

%(processname)s

进程名(如果可用)

thread

%(thread)d

生成日志的线程D(如果可用)

relativeCreated

%(relativeCreated)d

输出日志信息时的,自Logger创建以 来的毫秒数

threadname

%( threadname)s

线程名(如果可用)

四、四大组件

  1. 日志器- Logger:logging.getLogger(logger_name),返回Logger 对象
  • logger.setLevel(logging.ERROR) 设置处理器的日志级别
  • logger.addHandler(handler_name) 增加一个处理器
  • logger.removeHandler(handler_name) 删除一个处理器
  • logger.addHandler((filter) 给处理器统一设置过滤器
  • logger.removeFilter((filter) 移除过滤器
import logging

logger = logging.getLogger()

logger.setLevel(logging.DEBUG)

logger.info('Python info') #不会打印,因为logger.setLevel设置的是处理器日志级别
logger.warning('Python warning')
logger.error('Python Error')
logger.critical('Python critical')
  1. 处理器- Handler:处理器 将记录器产生的日志发送至指定的目的地,如:日志输出的位置,比如输出到本地文件,控制台,或者发送至Email
  • logging.StreamHandler(stream=None) 用于把日志信息输出控制台
import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
stream_handler = logging.StreamHandler()
logger.addHandler(stream_handler)

logger.debug('Python debug')
logger.info('Python info')
logger.warning('Python warning')
logger.error('Python Error')
logger.critical('Python critical')
  • logging.FileHandler(fineName=None) 用于把日志信息输出成文件
import logging

logger = logging.getLogger()
logger.setLevel(logging.WARNING)
file_handler= logging.FileHandler('test.log')
logger.addHandler(file_handler)

logger.debug('Python debug')
logger.info('Python info')
logger.warning('Python warning')
logger.error('Python Error')
logger.critical('Python critical')
  • logging.NullHandler(stream=None) 没有配置其他日志处理程序时使用,避免出现“无处理程序”的警告或错误,它会忽略所有传递给它的日志记录事件,因此不会将日志记录到任何地方
  • handler.setLevel(logging.WARN) 指定日志级别
  • handler.setFormatter(format) 设置日志格式
  • handler.addFilter((filter) 增加一个过滤器,可以增加多个
  • handler.removeFilter(filter) 删除一个过滤器
  1. 过滤器- Filter:过滤日志
  • logging.Filter(name='') name=日志器name
import logging

logger = logging.getLogger('logger')
logger.setLevel(logging.DEBUG)

filter = logging.Filter(name='logger')
filter1 = logging.Filter(name='logger1')

stream_handler = logging.StreamHandler()
logger.addHandler(stream_handler)
stream_handler.addFilter(filter)

file_handler = logging.FileHandler('test.log')
logger.addHandler(file_handler)
file_handler.addFilter(filter1) #test.log 中不会有日志信息

logger.debug('Python debug')
logger.info('Python info')
logger.warning('Python warning')
logger.error('Python Error')
logger.critical('Python critical')
  1. 格式器- Formatter:格式器:指定最终输出中日志记录的格式
  • logging.Formatter(fmt=None, datefmt=None) fmt日志格式同basicConfig中的format,datefmt日期格式打印日期时此参数生效
import logging

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)

stream_handler_format = logging.Formatter('%(levelname)s %(asctime)s %(message)s',datefmt='%Y/%m/%d %H:%M:%S')
stream_handler = logging.StreamHandler()
logger.addHandler(stream_handler)
stream_handler.setFormatter(stream_handler_format )

file_handler_format = logging.Formatter('%(levelname)s %(message)s',datefmt='%Y/%m/%d %H:%M:%S')
file_handler = logging.FileHandler('test.log') # file_handler_format中虽然设置了日期格式,日志格式中并没有打印日期,所以datefmt不会生效
logger.addHandler(file_handler)
file_handler.setFormatter(file_handler_format)

logger.debug('Python debug')
logger.info('Python info')
logger.warning('Python warning')
logger.error('Python Error')
logger.critical('Python critical')
  1. 自定义过滤函数
import logging

class Filter(logging.Filter):
    def __init__(self,name):
        super().__init__()
        self.name = name
    def filter(self, record):
        print('日志名称:',record.name)
        print('日志等级名称:', record.levelname)
        print('日志等级号:', record.levelno) #logging.DEBUG
        print('日志执行文件名:', record.filename)
        print('日志message:', record.msg)
        print('日志参数:', record.args)
        print('日志创建时间戳:', record.created)
        print('日志执行文件路径', record.pathname)
        print('日志进程ID', record.process)
        print('日志进程名字', record.processName)
        return True if self.name == 'streamHandle' else False #控制是否打印日志条件


logger = logging.getLogger('logger')
logger.setLevel(logging.DEBUG)

filter = logging.Filter(name='logger')
filter1 = logging.Filter(name='logger1')

stream_handler = logging.StreamHandler()
logger.addHandler(stream_handler)
stream_handler.addFilter(Filter('streamHandle'))

file_handler = logging.FileHandler('test.log')
logger.addHandler(file_handler)
file_handler.addFilter(Filter('fileHandler')) #test.log 中不会有日志信息

logger.debug('Python debug')
logger.info('Python info')
logger.warning('Python warning')
logger.error('Python Error')
logger.critical('Python critical')

五、配置日志

  1. logging.conf 配置文件
  • [loggers]:指定了所有日志器(logger)的名称
  • [handlers]:指定了所有处理器(handler)的名称
  • [formatters]:指定了所有格式化器(formatter)的名称
  • [logger_]:为每个日志器指定级别、处理器和其他属性
  • [handler_]:为每个处理器指定类、级别、格式化器等
  • [formatter_]:为每个格式化器指定格式和日期格式

[loggers]
keys=root,simpleHandler,fileHandler #loggers名称集合,logging.getLogger 中的name参数,默认root

[handlers]
keys=printSimpleHandler,printFileHandler #处理器名称集合

[formatters]
keys=simpleFormatter,fileFormatter #日志格式化名称集合

[logger_root] # loggers=root日志配置
level=DEBUG #日志等级
handlers=printSimpleHandler,printFileHandler #该日志下运行的处理器

[logger_simpleHandler] # loggers=simpleHandler日志配置
level=DEBUG #日志等级
handlers=printSimpleHandler #该日志下运行的处理器
qualname=simpleHandler
propagate=0 #日志记录器的传播设置。

[logger_fileHandler] # loggers=fileHandler日志配置
level=DEBUG #日志等级
handlers=printFileHandler #该日志下运行的处理器
qualname=fileHandler
propagate=0

[formatter_simpleFormatter] # formatters=simpleFormatter日志格式配置
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s #日志格式
datefmt=%Y/%m/%d %H:%M:%S #日期格式

[formatter_fileFormatter] # formatters=fileFormatter日志格式配置
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s #日志格式
datefmt=%Y-%m-%d %H:%M:%S #日期格式

[handler_printSimpleHandler] # handlers=printSimpleHandler处理器配置
class=StreamHandler #指定处理器,等同于logging.StreamHandler
level=DEBUG #指定日志级别
formatter=simpleFormatter #指定日志格式
args=(sys.stdout,) #处理器参数

[handler_printFileHandler] # handlers=printFileHandler处理器配置
class=FileHandler #指定处理器,等同于logging.FileHandler
level=DEBUG #指定日志级别
formatter=fileFormatter #指定日志格式
args=('test.log',) #处理器参数


  1. logging.config.fileConfig()
import logging.config
import logging

logging.config.fileConfig(fname='logging.conf')

root_logger = logging.getLogger()

simple_handle_logger = logging.getLogger('simpleHandler')

file_handler_logger = logging.getLogger('fileHandler')

def run_log(logger):
    logger.debug('debug message')
    logger.info('info message')
    logger.warning('warn message')
    logger.error('error message')
    logger.critical('critical message')

run_log(root_logger)
run_log(simple_handle_logger)
run_log(file_handler_logger)
  1. logging.config.dictConfig() 日志配置,与logging.config.fileConfig()区别在于,logging.config.fileConfig()读取的是文件,logging.config.dictConfig用的是字典,把logging.conf 配置文件以字典形式配置,logging.config.dictConfig即可

六、其他方法属性

  1. logging.LoggerAdapter(logger, extra=None):添加额外的上下文信息,返回logger对象
import logging

logger = logging.getLogger()


loggers = logging.LoggerAdapter(logger, {"spider": '2131'})
stream_handler_format  = logging.Formatter('%(levelname)s %(asctime)s %(message)s %(spider)s',datefmt='%Y/%m/%d %H:%M:%S')

stream_handler = logging.StreamHandler()
logger.addHandler(stream_handler)
stream_handler.setFormatter(stream_handler_format )

loggers.warning('Python warning')
loggers.error('Python Error')
loggers.critical('Python critical')

Tags:

最近发表
标签列表