Python logging 日志模块及代码示例

Python在日程编程占据的位置愈来愈多,那么有效的日志信息是帮助我们提高代码质量以及诊断能力的有力工具,下面是对Python logging模块的说明。

Python的logging模块提供了多种Handler,用于处理日志记录。以下是常见的几种Handler及其作用:

StreamHandler:将日志记录输出到标准输出流(sys.stdout)或标准错误流(sys.stderr)。它通常用于将日志记录输出到控制台。

import logging

logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

***FileHandler:将日志记录写入到指定的文件中。可以指定多个FileHandler,以将日志记录写入到多个文件中。

import logging

logger = logging.getLogger(__name__)
handler = logging.FileHandler('example.log')
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

RotatingFileHandler:将日志记录写入到指定的文件中,并在文件大小达到指定大小时,将当前文件备份并创建一个新的日志文件。这种Handler可以用来限制日志文件的大小,以便避免日志文件过大占用过多磁盘空间。

import logging

logger = logging.getLogger(__name__)
handler = logging.handlers.RotatingFileHandler('example.log', maxBytes=10000, backupCount=5)
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

TimedRotatingFileHandler:将日志记录写入到指定的文件中,并在指定的时间间隔到达时,将当前文件备份并创建一个新的日志文件。这种Handler可以用来按照时间间隔归档日志文件。

import logging
from logging.handlers import TimedRotatingFileHandler

# 创建一个logger
logger = logging.getLogger('timed_logger')
logger.setLevel(logging.DEBUG)

# 创建一个handler,设置每小时滚动一次日志文件
handler = TimedRotatingFileHandler('my_log', when='H', interval=1, backupCount=24)
handler.setLevel(logging.DEBUG)

# 定义handler的输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

# 给logger添加handler
logger.addHandler(handler)

# 记录一条日志
logger.info('This is a test log message.')

SocketHandler:将日志记录发送到指定的套接字服务器。这种Handler通常用于远程日志记录,可以将日志记录发送到远程服务器进行处理。

import logging

logger = logging.getLogger(__name__)
handler = logging.handlers.SocketHandler('localhost', logging.handlers.DEFAULT_TCP_LOGGING_PORT)
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

DatagramHandler:将日志记录发送到指定的UDP服务器。这种Handler通常用于远程日志记录,可以将日志记录发送到远程服务器进行处理。

import logging

logger = logging.getLogger(__name__)
handler = logging.handlers.DatagramHandler('localhost', logging.handlers.DEFAULT_UDP_LOGGING_PORT)
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

SysLogHandler:将日志记录发送到系统日志(syslog)。这种Handler通常用于在Unix/Linux系统上记录日志。

import logging

logger = logging.getLogger(__name__)
handler = logging.handlers.SysLogHandler(address = ('localhost', logging.handlers.SYSLOG_UDP_PORT))
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

NTEventHandler:将日志记录发送到Windows事件日志。这种Handler通常用于在Windows系统上记录日志。

import logging
from win32eventlog import OpenEventLog, RegisterEventSource, ClearEventLog
from win32eventlog import GENERIC_ADD_EVENT, GENERIC_READ, GENERIC_WRITE
from win32con import EVENTLOG_INFORMATION_TYPE, EVENTLOG_WARNING_TYPE, EVENTLOG_ERROR_TYPE

# 创建NTEventHandler对象,参数是记录事件的日志名称
handler = logging.handlers.NTEventHandler()

# 创建一个logger对象,将刚才创建的handler对象添加到logger对象中
logger = logging.getLogger('EventLogExample')
logger.addHandler(handler)

# 设置logger对象的级别为DEBUG
logger.setLevel(logging.DEBUG)

# 写一条日志信息
logger.info('This is a test log message.')

*WatchedFileHandler。用于处理被监控的文件变化。

import logging
from logging.handlers import WatchedFileHandler

# 创建一个logger对象
logger = logging.getLogger('watched_file_example')
logger.setLevel(logging.DEBUG)

# 创建一个WatchedFileHandler对象,指定日志文件名和最大文件大小
handler = WatchedFileHandler('my_log.log', maxBytes=1000000)  # 1 MB

# 定义日志输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

# 将handler添加到logger对象中
logger.addHandler(handler)

# 写入日志信息
logger.info('This is a test log message.')

MemoryHandler 。将日志记录存入内存中的指定缓存,当缓存达到指定大小后,将缓存中的日志记录写入到指定的文件中。

import logging

logger = logging.getLogger(__name__)
handler = logging.handlers.MemoryHandler()
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

HTTPHandler 。将日志记录发送到指定的HTTP服务器。

import logging

logger = logging.getLogger(__name__)
handler = logging.handlers.HTTPHandler(host='localhost:8080', url='/log', method='POST')
handler.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug('This is a debug message')
logger.info('This is an info message')
logger.warning('This is a warning message')
logger.error('This is an error message')
logger.critical('This is a critical message')

QueueHandler: Python 的 logging 模块提供的一个处理器,它用于将日志记录消息放入一个队列中,而不是直接写入日志文件或发送到控制台。这使得日志记录可以在另一个进程或线程中进行处理,例如通过网络发送到另一个系统。

import logging
import queue

# 创建一个logger对象
logger = logging.getLogger('queue_handler_example')
logger.setLevel(logging.DEBUG)

# 创建一个QueueHandler对象,将日志消息放入队列中
q_handler = logging.handlers.QueueHandler(queue.Queue())

# 定义日志输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
q_handler.setFormatter(formatter)

# 将QueueHandler添加到logger对象中
logger.addHandler(q_handler)

# 写入日志信息
logger.info('This is a test log message.')

# 从队列中获取并打印日志消息
while not q_handler.queue.empty():
    record = q_handler.queue.get()
    print(record.getMessage())

QueueListener: Python 的 logging 模块提供的一个监听器,它用于从队列中获取日志记录消息并处理它们。这使得您可以在另一个进程或线程中处理日志消息,例如通过网络发送到另一个系统。

import logging
import queue

# 创建一个logger对象
logger = logging.getLogger('queue_listener_example')
logger.setLevel(logging.DEBUG)

# 创建一个QueueHandler对象,将日志消息放入队列中
q_handler = logging.handlers.QueueHandler(queue.Queue())

# 定义日志输出格式
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
q_handler.setFormatter(formatter)

# 将QueueHandler添加到logger对象中
logger.addHandler(q_handler)

# 写入日志信息
logger.info('This is a test log message.')

# 创建一个QueueListener对象,监听队列中的日志消息
listener = logging.handlers.QueueListener(queue.Queue(), lambda record: print(record.getMessage()))

# 开始监听队列中的日志消息
listener.start()

# 等待监听器处理完所有日志消息
listener.join()
  • 24
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老虎爱代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值