Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 打印正确的';funcName';当日志编写器包装在函数中时_Python_Logging - Fatal编程技术网

Python 打印正确的';funcName';当日志编写器包装在函数中时

Python 打印正确的';funcName';当日志编写器包装在函数中时,python,logging,Python,Logging,我目前正在编写一个包含多个类和函数的大型算法。 在这个过程中,我将信息写入JSON日志文件。 由于我在日志消息中添加了大量附加信息,因此我决定将日志写入自动化,方法是将其包装到一个函数中——这导致对日志“funcName”的“假”标识(如下所述) 有人能帮我允许记录器正确识别功能吗? 或者,在日志打印到日志文件之前,是否可以编辑日志中的“funcName” 问题代码描述: 假设df['Test']='X'和df['Method']='dev' logging.ini包含如下所述的日志配置:

我目前正在编写一个包含多个类和函数的大型算法。 在这个过程中,我将信息写入JSON日志文件。 由于我在日志消息中添加了大量附加信息,因此我决定将日志写入自动化,方法是将其包装到一个函数中——这导致对日志“funcName”的“假”标识(如下所述)

有人能帮我允许记录器正确识别功能吗? 或者,在日志打印到日志文件之前,是否可以编辑日志中的“funcName”

问题代码描述:

  • 假设
    df['Test']='X'
    df['Method']='dev'
  • logging.ini包含如下所述的日志配置:
示例代码:

import logging
logging.config.fileConfig('logging.ini', disable_existing_loggers=False)
logger = logging.getLogger(__name__)


def LoggerWriter(df, text):
    logger.info('Test: {}; Method: {}; Description: {}'.format(df['Test'], df['Method'], text))


class DoStuff(self):
    def DoSomething(df):
        LoggerWriter(df, 'Start Function')
        ~Stuff are done here
        LoggerWriter(df, 'Finish Function')
我在日志文件中得到的输出是(注意“funcName”):

虽然我希望'funcName'输出是“DoSomething”而不是“LoggerWriter”,如下所示:

{"asctime": "2021-05-30 14:58:31,796", "name": "DoStuff", "funcName": "DoSomething", "levelname": "INFO", "message": "Test: X; Method: dev; Description: Start Function."}
{"asctime": "2021-05-30 14:58:42,800", "name": "DoStuff", "funcName": "DoSomething", "levelname": "INFO", "message": "Test: X; Method: dev; Description: Finish Function."}

谢谢大家的帮助!:)

经过大量的研究和反复试验,我发现:

  • inspect模块允许我识别任何函数的调用跟踪(取自)
  • 此外,我还创建了一个日志过滤器类,其中包含一个过滤器函数,用于编辑“funcName”的日志记录(顺便说一句,这就是如何将任何过滤器添加到记录器中)。应使用addFilter函数将新的筛选器类添加到记录器中。 这个解决方案是从
我希望这将有助于将来的某人:)

{"asctime": "2021-05-30 14:58:31,796", "name": "DoStuff", "funcName": "LoggerWriter", "levelname": "INFO", "message": "Test: X; Method: dev; Description: Start Function."}
{"asctime": "2021-05-30 14:58:42,800", "name": "DoStuff", "funcName": "LoggerWriter", "levelname": "INFO", "message": "Test: X; Method: dev; Description: Finish Function."}
{"asctime": "2021-05-30 14:58:31,796", "name": "DoStuff", "funcName": "DoSomething", "levelname": "INFO", "message": "Test: X; Method: dev; Description: Start Function."}
{"asctime": "2021-05-30 14:58:42,800", "name": "DoStuff", "funcName": "DoSomething", "levelname": "INFO", "message": "Test: X; Method: dev; Description: Finish Function."}
import inspect
import logging
logging.config.fileConfig('logging.ini', disable_existing_loggers=False)
logger = logging.getLogger(__name__)

class FunctionNameFilter(logging.Filter):
    def filter(self, record):
        function_name = inspect.currentframe()
        function_name = inspect.getouterframes(function_name, 2)
        record.funcName = function_name[6][3]
        return True

logger.addFilter(FunctionNameFilter())