溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

python中handler的作用是什么

發(fā)布時(shí)間:2021-04-26 16:51:21 來(lái)源:億速云 閱讀:2628 作者:Leah 欄目:編程語(yǔ)言

這篇文章給大家介紹python中handler的作用是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

python可以做什么

Python是一種編程語(yǔ)言,內(nèi)置了許多有效的工具,Python幾乎無(wú)所不能,該語(yǔ)言通俗易懂、容易入門(mén)、功能強(qiáng)大,在許多領(lǐng)域中都有廣泛的應(yīng)用,例如最熱門(mén)的大數(shù)據(jù)分析,人工智能,Web開(kāi)發(fā)等。

1、說(shuō)明

handler,包含在logging模塊中的三個(gè)handler之一。Handler 能覆蓋我們?cè)谑褂弥械拇蟛糠智闆r, 包括將日志記錄到文件中、將日志上傳指定服務(wù)器等等。

2、handler的子類(lèi)

(1)StreamHandler

將日志消息發(fā)送到一個(gè) File like的流對(duì)象實(shí)例中。

(2)FileHandler

將日志記錄到磁盤(pán)文件中。

(3)BaseRotatingHandler(FileHandler)

在項(xiàng)目中,為了避免日志文件過(guò)大,需要切割日志文件,BaseRotatingHandler 就是切割日志文件處理類(lèi)的基類(lèi)。

3、實(shí)例

import json
from kafka import KafkaProducer
from kafka.errors import KafkaError
import logging
import datetime
 
 
class KafkaLoggingHandler(logging.Handler):
    """
    自定義logging.Handler模塊,自定義將日志輸出到指定位置(這里是輸出到kafka)
    """
    def __init__(self, config=None, topic=None, name=""):
        super(KafkaLoggingHandler, self).__init__()
 
        if isinstance(config, dict) is False:
            raise ValueError("lack of kafka config parameters...")
        if isinstance(topic, str) is False:
            raise ValueError("lack of kafka topic parameters...")
        self.name = name
        self.config = config
        self.producer = KafkaProducer(**self.config)
        self.topic = topic
 
        # 實(shí)例化自定義的日志過(guò)濾器
        filter = KafkaLogFilter()
        self.addFilter(filter)
 
        # 實(shí)例化自定義的日志格式化對(duì)象
        json_format = JsonForMatter()
        self.setFormatter(json_format)
 
    @staticmethod
    def on_send_success(record_metadata):
        # 如果消息成功寫(xiě)入Kafka,broker將返回RecordMetadata對(duì)象(包含topic,partition和offset
        print("Success: [{}] send success".format(record_metadata))
 
    @staticmethod
    def on_send_error(excp):
        # 如果失敗broker將返回error。這時(shí)producer收到error會(huì)嘗試重試發(fā)送消息幾次,直到producer返回error
        print("INFO " + "send info failed, cause: {}".format(excp))
 
    def emit(self, record):
        """
        重寫(xiě)logging.Handler的emit方法
        :param record: 傳入的日志信息
        :return:
        """
        # 對(duì)日志信息進(jìn)行格式化
        value = self.format(record)
        # 轉(zhuǎn)成json格式,注意ensure_ascii參數(shù)設(shè)置為False,否則中文亂碼
        value = json.dumps(value, ensure_ascii=False).encode("utf-8")
        future = self.producer.send(topic=self.topic, value=value)
        try:
            record_metadata = future.get(timeout=10)
            self.on_send_success(record_metadata)
        except KafkaError as e:
            self.on_send_error(e)

關(guān)于python中handler的作用是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI