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