Custom Logging Handler

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

HeyHo :)

Ich wollte wohl einen eigenen LoggingHandler schreiben, damit ich logs direkt in Discord schreiben kann.
Benutzten wollte ich die eigene Klasse wie die Standart Handler auch (StreamHandler).

Die Python doku ist da sehr umfangreich und ich stoße auf mehrer halbwegs helfende Beispiele. Ich kann mir nicht vorstellen, dass es so schwer ist einen eigenen Handler zu schreiben...

Soweit bin ich erstmal gekommen:

Code: Alles auswählen


import logging

try:
    import requests
except ImportError as ex:
    print("Please Install requests")
    raise ImportError(ex)

class DiscordHandler(logging.StreamHandler):
    """
    A handler class which writes logging records, appropriately formatted,
    to a Discord Server using webhooks.
    """

    def __init__(self, webhook_url, agent):
        logging.Handler.__init__(self)
        self._url = webhook_url
        self._agent = agent
        self._header = self.create_header()


    def create_header(self):
        return {
            'User-Agent': self._agent,
            "Content-Type": "application/json"
        }
    
    def write_to_discord(self, message):
        request = requests.post(self._url,
                                headers=self._header,
                                data= {"content": message})

        if request.ok == False:
            raise request.Exception("Request not successful")                            

                                
    def emit(self, record):
        print(record)
        msg = self.format(record)
        self.write_to_discord("%s\n" % record)

    def handle(self, record):
        print("flush")
        pass
        
        
def test():
    url = "secret url"
    agent = "agent"

    level = logging.DEBUG
    log_format = logging.Formatter(
        "[%(filename)s]{%(funcName)s L %(lineno)d} --- %(message)s"
    )

    
    logger = logging.getLogger('spam_application')
    file_handler = DiscordHandler(url, agent)
    file_handler.setFormatter(log_format)
    file_handler.set_name("file")
    file_handler.setLevel(level)
    logger.addHandler(file_handler)
    
    logger.info("testing info")
    

    
test()

was habe ich falsch gemacht, oder was wäre hier der richtige weg?

Danke schonmal fuer die hilfe :)

MfG
Trayser
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

es wäre noch hilfreich zu wissen, was den nicht funktioniert, welche Fehlermeldungen du bekommst oder womit du nicht zufrieden bist.

Gruß, noisefloor
BlackJack

@TrayserCassa: Was komisch/falsch aussieht ist als erstes schon mal das Erben von `StreamHandler` aber das Aufrufen von `Handler.__init__()` in der `DiscordHandler.__init__()`. Das ist doch gar kein `StreamHandler`, warum erbst Du davon?

Bei der `handle()`-Methode überschreibst Du die `Handler.handle()`-Methode, die ja Code enthält der etwas tut, nämlich unter anderem `emit()` aufrufen. Das macht Deine Implementierung nicht‽ Warum die den Text 'flush' ausgibt ist mir auch nicht so ganz klar. Das würde in der `flush()`-Methode vielleicht Sinn machen. *Die* macht aber bei dem `DiscordHandler` keinen Sinn.

Ausnahmen die beim `emit()` auftreten sollten zum Aufruf der `handleError()`-Methode führen.
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

@BlackJack
Ich dachte ich kann den StramHandler einfach als Default nehmen und darauf aufbauen... Hab ich entfernt.

Mein Problem ist das ich die Handle Methode auch überschreiben möchte, diese allerdings nie aufgerufen wird.
Falls ich logger.info("some text") ausführe, dann wird doch in den Handlern eine Methode ausgeführt mit dem record als Parameter.. Ich weiß aber nicht welche ... handel(self, record) scheint es nicht zu sein ... |

was suche ich also:

Eine Möglichkeit einen Handler zu schreiben, der sich beim Observer (Dem Root logger) anmeldet und falls der logger info, etc aufruft, mein Handler auch die Methode ausführt, die die Nachricht beinhaltet.

MfG
Trayser
TrayserCassa
User
Beiträge: 97
Registriert: Donnerstag 2. Mai 2013, 19:11

Ok ich Idiot ...

Hab vergessen dem Logger ein Loglevel zu geben... Werde das mal anpassen :oops:

Entschuldigt bitte die Unannehmlichkeiten..

MfG
Trayser

PS: Falls jemand auf Zufall hier drauf stößt und den fertigen Code sucht:
https://github.com/TrayserCassa/DiscordHandler
Antworten