Python logging将日志输出到Kafka

2023-10-27

Python logging用于输出Python程序运行的日志。现实中往往一个项目会部署在多台机器之上,这种情况下,为了方便对各主机运行日志进行收集,往往会使用消息队列。通过消息队列将各台机器上的日志收集并写入日志文件。本文使用Python logging结合Kafka作为范例,将日志输出到Kafka消息队列。

Python的logging模块对于日志的处理在Handler中。因此,我们可以通过继承logging.Handler模块并重写emit函数来实现自定义处理日志。

class KafkaLoggingHandler(logging.Handler):

    def __init__(self, **kwargs):
        logging.Handler.__init__(self)

        self.kafka_client = SimpleClient(hosts=HOSTS)
        self.key = kwargs.get("key", None)
        self.kafka_topic_name = TOPICS

        if not self.key:
            self.producer = SimpleProducer(self.kafka_client, **kwargs)
        else:
            self.producer = KeyedProducer(self.kafka_client, **kwargs)

    def emit(self, record):
        # 忽略kafka的日志,以免导致无限递归。
        if 'kafka' in record.name:
            return

        try:
            # 格式化日志并指定编码为utf-8
            msg = self.format(record)
            if isinstance(msg, unicode):
                msg = msg.encode("utf-8")

            # kafka生产者,发送消息到broker。
            if not self.key:
                self.producer.send_messages(self.kafka_topic_name, msg)
            else:
                self.producer.send_messages(self.kafka_topic_name, self.key,
                                            msg)
        except (KeyboardInterrupt, SystemExit):
            raise
        except Exception:
            self.handleError(record)

在完成自定义Handler之后,我们需要在logging中指定Handler。

# 获取handler实例
handler = KafkaLoggingHandler()

logger = logging.getLogger()
# 添加handler
logger.addHandler(hdlr=handler)
# 输出日志
logger.info(msg='balabala.......')

这样就实现了将Python日志输出到Kafka。Kafka消费者端不再赘述,由用户自行定义。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python logging将日志输出到Kafka 的相关文章

随机推荐

  • 【问题解决】Centos7 yum命令异常报错Could not retrieve mirrorlist http://mirrorlist.centos.org

    问题出现 在把虚拟机的ip改为静态ip之后 yum install就会出现这样子的问题 root etcd yum install y wget 已加载插件 fastestmirror Determining fastest mirrors
  • 01rapidJson学习之rapidJson的初始化

    01rapidJson学习之rapidJson的初始化 1 rapidJson的初始化 由于我们经常通过初始化添加值到string字符串中 所以这里封装成一个简单函数 rapidJson有3种初始化方式 1 改造初始化 2 set方法初始化
  • unity安卓so包与其他第三方so包冲突问题 Unable to find main / No implementation found for

    最近公司项目需要 在安卓端使用了视频直播的第三方包和unity的第三方包 问题来了 引用了视频直播的包之后 unity的嵌入程序启动会报错 Process e unitry3d PID 30302 java lang Unsatisfied
  • Linux用户与群组管理

    用户账户与群组概念 Linux操作系统是多用户多任务的操作系统 系统依据账户来区分属于每个用户的文件 进程 任务 并给每个用户提供特定的工作环境 例如 用户的工作目录 shell版本以及图形化的环境配置等 Linux系统下的用户分为三种 1
  • Centos7 离线安装kafka

    Centos7 离线安装kafka 1 准备 1 提前下载kafka与jdk rpm包 2 开始 1 将rpm包导入到服务器 2 执行 rpm ivh kafka 1 1 1 20200608 x86 64 rpm 下载 https dow
  • 华为OD机试-喊7游戏

    题目描述 喊7 是一个传统的聚会游戏 N个人围成一圈 按顺时针从1 7编号 编号为1的人从1开始喊数 下一个人喊得数字是上一个人喊得数字 1 但是当将要喊出数字7的倍数或者含有7的话 不能喊出 而是要喊过 假定N个人都没有失误 当喊道数字k
  • IDEA 编译时 报 “常量字符串过长” 解决办法

    在编译项目时 出现错误为 常量字符串过长 java constant string too long 解决 File gt gt Settings gt gt Build Execution Deployment gt gt Compile
  • @font-face 加载字体引用字体之后不起作用

    如题 最近在学习css的时候遇到如下情况 使用 font face加载多种字体不起作用 反思 是我搞错了 字体加载可能就是要一条一条的写 文件结构目录 代码如下
  • Android 报错:Call requires API level 26/设置SDK最小的版本

    报错如下图所示 我尝试了升级Android Studio 到新版本 报错仍然存在 原因是某些控件仅仅支持一些较高SDK的版本 所以修改模块的gradle文件的SDK的最小版本 改完之后报错消失 备注 SDK Software Develop
  • in和=无法查出为NULL的值

    select from base persons x where x pname in null select from base persons x where x pname null 以上两句查询结果为空 虽然表里有相应的值 Id N
  • PAT 1152 Google Recruitment

    原题链接 1152 Google Recruitment 20分 题意 从任一给定的长度为 L 的数字中 找出最早出现的 K 位连续数字所组成的素数 关键词 字符串 判断质数 输入格式 输入在第一行给出 2 个正整数 分别是 L 和 K 接
  • python机器学习之数据的预处理(五种方式数据处理案例详解)

    数据的预处理 数据下载地址 gt 点这里下载 到入文件时可以直接复制地址然后用r 包裹起来 例如 data pd read cav r C work data csv 或者也可以以直接将 换成 也可以导入 1 归一化 在sklearn当中
  • Nginx四层代理和7层反向代理

    Nginx四层代理和7层反向代理 文章目录 Nginx四层代理和7层反向代理 Nginx四层代理配置 Nginx四层代理配置步骤 配置好两台Nginx七层代理服务器 在四层代理的Nginx服务器上做相关配置 测试结果 Nginx四层代理配置
  • vscode设置选项卡换行

    ctrl shift p打开命令输入窗口 输入preference 选择打开工作区设置 输入wrap tabs 勾选wrap tabs 可以多行显示了
  • Vue应用方法、实例属性、实例方法$refs、vm.$nextTick等

    应用方法 实例属性 实例方法 Vue 中对部分特殊的属性和功能方法进行特殊指代定义 用于提供独立的执行和 获取方式 应用方法 mount 所提供 DOM 元素的 innerHTML 将被替换为应用根组件的模板渲 染结果 unmount 卸载
  • java prepare_java中prepareStatement与createStatement的区别

    首先来看两段代码 第一个使用createStatement 1 public void delete intid 2 try 3 Connection c DBUtil getConnection 4 Statement s c creat
  • Nginx之location匹配规则

    什么是location nginx就是通过拦截到的请求去对配置好的location块 location block 进行请求代理的 被代理的URL去对location后边的字符串 或正则 根据一定的规则进行匹配 然后执行对应location
  • 你是否曾质疑过DB-Engine的数据库排名?

    在谈论数据库的最新趋势时 我们习惯了参考DB Engine上所提供的排名信息 每当新的报告出来时 我们也时常看到各个媒体网站争先发布关于最新排名的分析内容 如标题所言 你是否曾质疑过DB Engine所给出的这份排名 如下是2018年3月份
  • php后台接收blob文件流,php – 我们如何访问服务器中的文件blob?

    在上传大于maxChunkSize的文件时 我们如何在服务器中单独访问每个上传的文件blob 我的问题是我需要使用后端api将上传的文件在单独的blob中转发到不同的服务器 到目前为止 看看wiki 对于1 mb的块 我在js中添加了以下内
  • Python logging将日志输出到Kafka

    Python logging用于输出Python程序运行的日志 现实中往往一个项目会部署在多台机器之上 这种情况下 为了方便对各主机运行日志进行收集 往往会使用消息队列 通过消息队列将各台机器上的日志收集并写入日志文件 本文使用Python