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()
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!