Python模块之Logging(五)——在配置文件中为Logger配置多个handler

本文介绍了一种使用Python标准库logging进行日志配置的方法,通过配置文件实现日志记录的灵活性,包括不同输出目的地的选择(如控制台和文件),以及日志格式的定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用样例

读取配置文件:

logging.config.fileConfig("log.conf")    # 采用配置文件  

创建logger:

logger = logging.getLogger("simpleExample")  

log.conf文件:

[loggers] #loggers列表
keys=root,main

[handlers] #handlers列表
keys=consoleHandler,fileHandler

[formatters] #formatters列表
keys=fmt

[logger_root] #root logger
level=DEBUG
handlers=consoleHandler,fileHandler #将root logger的日志信息输出到文件和控制台

[logger_main] #main logger
level=DEBUG
qualname=main
handlers=fileHandler

[handler_consoleHandler] #控制台handler
class=StreamHandler
level=DEBUG
formatter=fmt
args=(sys.stdout,)

[handler_fileHandler] #循环日志文件
class=logging.handlers.RotatingFileHandler
level=DEBUG
formatter=fmt
args=('tst.log','a',20000,5,) #参数是RotatingFileHandler的__init__()的参数

[formatter_fmt] #格式
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

上述文件中,用逗号将handler隔开就可以将日志输出到多个目的地:

handlers=consoleHandler,fileHandler #将root logger的日志信息输出到文件和控制台
import logging # 导入Pythonlogging模块,用于记录日志 from logging.handlers import RotatingFileHandler, SocketHandler # 从logging.handlers中导入RotatingFileHandler和SocketHandler,用于文件日志和Socket日志处理 import socket # 导入socket模块,用于网络通信 import threading # 导入threading模块,用于多线程编程 # 创建一个日志记录器 logger = logging.getLogger('my_logger') # 使用getLogger方法创建一个名为'my_logger'的日志记录器 logger.setLevel(logging.DEBUG) # 设置日志记录器的日志级别为DEBUG,表示将记录所有级别的日志 # 配置文件日志处理器(可选,用于同时将日志写入文件) file_handler = RotatingFileHandler('my_log.log', maxBytes=1024*1024, backupCount=5) # 创建一个RotatingFileHandler,用于将日志写入文件。文件名为'my_log.log',最大大小为1MB,最多保留5个备份文件 file_handler.setLevel(logging.DEBUG) # 设置文件处理器的日志级别为DEBUG file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 创建一个Formatter,用于格式化日志消息 file_handler.setFormatter(file_formatter) # 将Formatter设置给文件处理器 logger.addHandler(file_handler) # 将文件处理器添加到日志记录器中 def configure_logger_with_socket(port): """ 配置实时日志处理器(SocketHandler) :param port: TCP服务器接收日志消息的端口号 :return: 配置好的日志记录器对象 """ tcp_server_address = ('localhost', port) # 定义TCP服务器的地址和端口号 # 创建SocketHandler并连接到TCP服务器 try: socket_handler = SocketHandler(tcp_server_address) # 创建一个SocketHandler,用于将日志发送到TCP服务器 socket_handler.setLevel(logging.DEBUG) # 设置Socket处理器的日志级别为DEBUG # 将实时日志处理器添加到日志记录器中 logger.addHandler(socket_handler) # 将Socket处理器添加到日志记录器中 # 返回日志记录器对象(方便调用者使用) return logger # 返回配置好的日志记录器对象 except (socket.error, OSError) as e: # 捕获socket连接错误和操作系统错误 print(f"Failed to connect to TCP server at {tcp_server_address}: {e}") # 打印错误信息 # 如果连接失败,可以选择返回原logger对象或重新抛出异常 return logger # 返回原logger对象(或者可以选择raise e重新抛出异常) # 简单的TCP服务器,用于接收日志消息(仅用于示例,生产环境请使用更健壮的服务器) def start_tcp_server(port): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建一个TCP/IP套接字 server_socket.bind(('localhost', port)) # 将套接字绑定到地址和端口号 server_socket.listen(1) # 开始监听传入连接 print(f"TCP server is listening on port {port}...") # 打印监听信息 while True: # 无限循环,等待客户端连接 client_socket, client_address = server_socket.accept() # 接受客户端连接 with client_socket: # 使用with语句确保连接被正确关闭 print(f"Accepted connection from {client_address}") # 打印客户端地址信息 while True: # 无限循环,接收客户端发送的数据 data = client_socket.recv(1024) # 接收数据,最多1024字节 if not data: # 如果没有接收到数据,表示客户端已关闭连接 break # 跳出循环,关闭连接 print(f"Received log message: {data.decode('utf-8')}") # 打印接收到的日志消息(解码为utf-8) # 在一个单独的线程中启动TCP服务器 server_thread = threading.Thread(target=start_tcp_server, args=(139,)) # 创建一个线程,目标函数为start_tcp_server,参数为端口号139 server_thread.start() # 启动线程 # 使用指定的端口号配置日志记录器 logger = configure_logger_with_socket(139) # 调用configure_logger_with_socket函数,配置日志记录器,使用端口号139 # 记录日志 logger.debug('This is a debug message with real-time logging') # 记录DEBUG级别的日志消息 logger.info('This is an info message with real-time logging') # 记录INFO级别的日志消息 logger.warning('This is a warning message with real-time logging') # 记录WARNING级别的日志消息 logger.error('This is an error message with real-time logging') # 记录ERROR级别的日志消息 logger.critical('This is a critical message with real-time logging') # 记录CRITICAL级别的日志消息 解决29行形参 'port' 未填的问题 给出可执行的Python代码
06-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值