python 中日志异步发送到远程服务器

本文介绍了如何在Python中将日志异步发送到远程服务器,包括使用StreamHandler和FileHandler处理本地日志,添加HTTPHandler实现远程日志发送,并探讨了通过多线程、线程池和aiohttp库实现异步发送的方法,以解决日志发送过程中的阻塞问题。

python中使用日志最常用的方式就是在控制台和文件中输出日志了,logging模块也很好的提供的相应的类,使用起来也非常方便,但是有时我们可能会有一些需求,如还需要将日志发送到远端,或者直接写入数据库,这种需求该如何实现呢?

一、StreamHandler和FileHandler

首先我们先来写一套简单输出到cmd和文件中的代码

# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   File Name:     loger
   Description :
   Author :       yangyanxing
   date:          2020/9/23
-------------------------------------------------
"""
​
import logging
import sys
import os
​
# 初始化logger
logger = logging.getLogger("yyx")
logger.setLevel(logging.DEBUG)
# 设置日志格式
fmt = logging.Formatter('[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
​
# 添加cmd handler
cmd_handler = logging.StreamHandler(sys.stdout)
cmd_handler.setLevel(logging.DEBUG)
cmd_handler.setFormatter(fmt)
​
​
# 添加文件的handler
logpath = os.path.join(os.getcwd(), 'debug.log')
file_handler = logging.FileHandler(logpath)
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(fmt)
​
# 将cmd和file handler添加到logger中
logger.addHandler(cmd_handler)
logger.addHandler(file_handler)
​
logger.debug("今天天气不错")

```

首先初始化一个logger, 并且设置它的日志级别是DEBUG,然后添初始化了 cmd_handler和 file_handler, 最后将它们添加到logger中, 运行脚本,会在cmd中打印出 [2020-09-23 10:45:56] [DEBUG] 今天天气不错 且会写入到当前目录下的debug.log文件中.

二、添加HTTPHandler

如果想要在记录时将日志发送到远程服务器上,可以添加一个 HTTPHandler , 在python标准库logging.handler中,已经为我们定义好了很多handler,有些我们可以直接用,本地使用tornado写一个接收日志的接口,将接收到的参数全都打印出来

# 添加一个httphandler
import logging.handlers
http_handler = logging.handlers.HTTPHandler(r"127.0.0.1:1987", '/api/log/get')
http_handler.setLevel(logging.DEBUG)
http_handler.setFormatter(fmt)
logger.addHandler(http_handler)

结果在服务端我们收到了很多信息

{
    'name': [b 'yyx'],
    'msg': [b '\xe4\xbb\x8a\xe5\xa4\xa9\xe5\xa4\xa9\xe6\xb0\x94\xe4\xb8\x8d\xe9\x94\x99'],
    'args': [b '()'],
    'levelname': [b 'DEBUG'],
    'levelno': [b '10'],
    'pathname': [b 'I:/workplace/yangyanxing/test/loger.py'],
    'filename': [b 'loger.py'],
    'module': [b 'loger'],
    'exc_info': [b 'None'],
    'exc_text': [b 'None'],
    'stack_info': [b 'None'],
    'lineno': [b '41'],
    'funcName': [b '<module>'],
    'created': [b '1600831054.8881223'],
    'msecs': [b '888.1223201751709'],
    'relativeCreated': [b '22.99976348876953'],
    'thread': [b '14876'],
    'threadName': [b 'MainThread'],
    'processName': [b 'MainProcess'],
    'process': [b '8648'],
    'message': [b '\xe4\xbb\x8a\xe5\xa4\xa9\xe5\xa4\xa9\xe6\xb0\x94\xe4\xb8\x8d\xe9\x94\x99'],
    'asctime': [b '2020-09-23 11:17:34']
}
​

可以说是信息非常之多,但是却并不是我们想要的样子,我们只是想要类似于 [2020-09-23 10:45:56] [DEBUG] 今天天气不错 这样的日志.

logging.handlers.HTTPHandler 只是简单的将日志所有信息发送给服务端,至于服务端要怎么组织内容是由服务端来完成. 所以我们可以有两种方法,一种是改服务端代码,根据传过来的日志信息重新组织一下日志内容, 第二种是我们重新写一个类,让它在发送的时候将重新格式化日志内容发送到服务端.

我们采用第二种方法,因为这种方法比较灵活, 服务端只是用于记录,发送什么内容应该是由客户端来决定。

我们需要重新定义一个类,我们可以参考logging.handlers.HTTPHandler 这个类,重新写一个httpHandler类

每个日志类都需要重写emit方法,记录日志时真正要执行是也就是这个emit方法

class
### 实现省市区镇四级联动的效果 为了在 Vue 项目中使用 `element-china-area-data` 和 Element Plus 的 `<el-cascader>` 组件来实现省市区镇四级联动功能,可以按照以下方式配置。 #### 数据准备 首先需要引入 `element-china-area-data` 提供的 JSON 数据文件。该数据包含了中国地区的省市县乡四级区域划分信息[^1]。可以通过 npm 或 yarn 安装此依赖包: ```bash npm install element-china-area-data --save ``` 安装完成后,在代码中导入并解析这些数据作为级联选择器的数据源。 #### 配置组件 以下是完整的示例代码,展示如何设置 `<el-cascader>` 来支持四级联动效果: ```vue <template> <div> <el-cascader v-model="selectedArea" :options="areaData" placeholder="请选择地区" clearable @change="handleCascaderChange" /> </div> </template> <script> import { ref, onMounted } from 'vue'; // 导入 area data import areaData from 'element-china-area-data'; export default { setup() { const selectedArea = ref([]); // 初始化区域数据 const areaData = ref(areaData); // 处理级联选择变化事件 const handleCascaderChange = (value) => { console.log('当前选中的值:', value); }; onMounted(() => { console.log('已加载区域数据', areaData.value); }); return { selectedArea, areaData, handleCascaderChange, }; }, }; </script> <style scoped> /* 自定义样式 */ .el-cascader { width: 100%; } </style> ``` 上述代码实现了以下几个要点: 1. **绑定选项数据**:通过 `:options="areaData"` 将预处理好的区域数据传递给 `<el-cascader>`。 2. **双向绑定模型值**:利用 `v-model="selectedArea"` 动态跟踪用户的输入状态。 3. **监听变更事件**:当用户完成选择时触发回调函数 `@change="handleCascaderChange"` 并打印所选结果[^2]。 #### 进一步优化 如果希望进一步提升性能或者减少初始渲染时间,则可考虑启用懒加载模式(Lazy Load)。这允许仅在必要时才从服务器获取子节点的信息而不是一次性加载全部数据。具体做法如下所示: 修改后的模板部分增加属性 `props="{ lazy: true, lazyLoad }"` 及其对应的逻辑方法即可满足需求。 --- ### 总结 以上方案展示了基于 `element-plus` 和 `element-china-area-data` 构建省市区镇四级联动的选择器的具体流程以及注意事项。它不仅简单易懂而且具备良好的扩展性和灵活性能够适应多种实际应用场景的需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值