首页 > 解决方案 > 记录某些内容时如何调用 Python 函数

问题描述

我正在使用日志库,并且我想在记录任何事件时调用一个函数。像这样的东西:

import logging

#logging config here

async def on_log(message, level): #call this whenever something is logged
    print(level, ":", message)

logging.debug("Hello world")

编辑:on_log是协程

Edit2:我尝试实施您的建议之一,但我不能 100% 确定如何将其添加到我当前的日志记录配置中。

from logging import *
import datetime
import sys

class MyLogger(Handler):
    def emit(*args):
        for item in args:
            print(item)

time = datetime.datetime.today()
logtime = f"{time.year}-{time.month}-{time.day}__{time.hour}h-{time.minute}m-{time.second}s"

file_handler = FileHandler(filename=f'./logs/{logtime}.log')  # File output
stdout_handler = StreamHandler(sys.stdout)  # Console output

basicConfig(
    format=f'[%(asctime)s][%(levelname)s] %(message)s',
    datefmt='%H:%M:%S',
    level=DEBUG,
    handlers=[file_handler, stdout_handler, MyLogger]
)

我收到此错误: AttributeError: type object 'MyLogger' has no attribute 'formatter'

标签: pythonlogging

解决方案


这是最小的工作代码

import logging

# --- classes ---

class MyLogger():

    #level = logging.NOTSET
    level = logging.DEBUG

    def handle(*args):
        print('--- args ---')
        for item in args:
            print(item)
        print('---')

# --- main ---

logger = logging.getLogger('test')
logger.setLevel(logging.DEBUG) 
#logger.setLevel(logging.INFO) 

my_logger = MyLogger()
#my_logger.level = logging.DEBUG

logger.addHandler(my_logger)

# --- test ---

logger.debug("DEBUG: Hello world")
logger.info("INFO: Hello world")

它不能是函数,而是带有方法handle和变量的类,level因为每个处理程序都有自己的级别。这样一些处理程序可以始终执行,其他仅用于调试消息。


编辑:

同样使用已经有变量的类Handlerlevel ,你只需要重写方法handle。但是最好重写过滤后emit执行的方法。handle

您可以在创建实例时设置级别。

import logging

# --- classes ---

class MyLogger(logging.Handler):
    
    #def handle(*args):
    def emit(*args):
        print('--- args ---')
        for item in args:
            print(item)
        print('---')
        
# --- main ---

logger = logging.getLogger('test')
logger.setLevel(logging.DEBUG) 
#logger.setLevel(logging.INFO) 

my_logger = MyLogger(logging.DEBUG)

logger.addHandler(my_logger)

# --- test ---

logger.debug("DEBUG: Hello world")
logger.info("INFO: Hello world")

推荐阅读