调用另一个模块时显示原始模块的名称

我正在创建集中式日志记录。这基本上看起来像下面的脚本。


logit 模块将根据调用它的脚本名称创建一个文件。在这种情况下 apiCaller。


最初我在调用 logit 时手动定义了这个,但是我正在寻找 logit 以确定日志本身的来源。


这里有 3 个模块在起作用:


main.py:


def runAnalytic(script):

    importlib.import_module("monitoringScripts."+script["package"]+"."+script["module"], package=None)


packageModule = [{"package":"awesome","module":"apiCaller"}]


with concurrent.futures.ThreadPoolExecutor() as executor:

    results = executor.map(runAnalytic, packageModule)

apiCaller.py(上面的模块)


from adminTools.logger import logit

logit.create(results[i]["items"][r]["userId"],"apiCaller") #How i currently pass the script name, i want to get rid of this.

logit.py 处理我所有其他脚本的所有日志要求(集中式日志记录)


import sys, logging, logging.handlers, pathlib

#Path for all log files for scriptHub

logdir = str(pathlib.Path(__file__).parent.absolute())


#Creates the log file based on a given name from the script

def create(logMessage,scriptName, level="DEBUG"):

    #create filename

    log_filename = logdir+"/sysLogs/"+scriptName+".logs"

    #Creates the logging object

    my_logger = logging.getLogger(scriptName)

    my_logger.setLevel(logging.DEBUG)

    #Formats the log:

    formatter = logging.Formatter('%(asctime)s - %(message)s - %(name)s')

    #Gives the log file a limit for 100mb if it goes bigger than this, it will create another file, but keep the old one

    handler = logging.handlers.RotatingFileHandler(log_filename, maxBytes=100000000, backupCount=1)

    handler.setFormatter(formatter)

    #Handlers need to be cleared to stop duplicated logs.

    if (my_logger.hasHandlers()):

        my_logger.handlers.clear()

    my_logger.addHandler(handler)

    #creates the log message

    my_logger.debug(logMessage)


所以,我不确定这是否会帮助或阻碍你们所有人哈哈


本质上,我不想为 logit 提供脚本名称,而是希望 logit 从调用它的模块中获取它。例如,在这种情况下,“apiCaller”将是传递给 logit 的名称。


千万里不及你
浏览 115回答 2
2回答

胡子哥哥

这个问题不是很清楚,但你可以使用inspect.stack().loggy.pyimport inspectdef log(s):    caller = inspect.stack()[1]    print(f"{caller.filename} line {caller.lineno} says: {s}")thing.pyimport loggyloggy.log("Hey!")/v/f/n/8/T/tmp.ZiRzgsqi $ python3 thing.pything.py line 3 says: Hey!/v/f/n/8/T/tmp.ZiRzgsqi $

慕无忌1623718

好的,重写后的问题:我已经看到它以与您相反的方式完成 - 获取一个记录器,然后设置它(模块中有两行,而不是一个)。记录器是每个模块的东西,并且总是在那里。在您的情况下,您每次都重新获取记录器并重新制作处理程序。这样你就不能利用美丽的可能性logging模块提供!所以基本上,另一种方法是:在您执行的每个脚本中logger = logging.getLogger(__name__),通常在顶部附近的某个地方,在导入下方。+你只需打电话logit.setupLogger(logger)。(在你的情况下,在下一行。如果是脚本,我将它保存在 main 函数中 - 这样,如果我将脚本作为模块导入,我将调用我需要的任何日志记录设置,imported_module.logger这样它就不会向错误的日志文件。:D)重写logit.py:import sys, logging, logging.handlers, pathlib#Path for all log files for scriptHublogdir = str(pathlib.Path(__file__).parent.absolute())#Creates the log file based on a given name from the scriptdef create(my_logger, level=logging.DEBUG):    #create filename    log_filename = logdir+"/sysLogs/"+logger.name+".logs"    my_logger.setLevel(level)    #Formats the log:    formatter = logging.Formatter('%(asctime)s - %(message)s - %(name)s')    #Gives the log file a limit for 100mb if it goes bigger than this, it will create another file, but keep the old one    handler = logging.handlers.RotatingFileHandler(log_filename, maxBytes=100000000, backupCount=1)    handler.setFormatter(formatter)    #Handlers need to be cleared to stop duplicated logs.    if (my_logger.hasHandlers()):        my_logger.handlers.clear()    my_logger.addHandler(handler)这样,您只需在 中设置记录器的内部 - 包括文件处理程序 - logit,您可以使用标准的logging东西:您可以在模块中使用任何级别的日志记录:logger.info("like")logger.warning("this")您在上面的代码中编写每条日志消息 - 使代码充满日志消息!- 请记住调试消息应该包含调试所需的一切,这有时包括大量信息 + 请记住调试消息可能存在于信息消息旁边,只是具有不同的详细信息(例如,“从 X 获取信息”是信息,“已发送请求” some/address/here' 并收到 '''这里的数据块'''" 是调试)。当您需要降低级别时 - 例如,您调试了您的消息并且厌倦了看到 so.much.info (或者只是从开发人员到生产人员) - 您只需更改logit.setupLogger(logger)到logit.setupLogger(logger, logging.INFO)您需要的任何级别。日志记录似乎是一个好主意,但是logging当您学习如何使用它时,模块非常强大。:)这是来自 Python 文档的 How-To,但它包含很多信息,因此更简单的有关 python 日志记录的教程是更好的开始。即使在阅读了文档和教程之后,我也开始使用自己的日志记录实践,因为我根本没有得到它。当我看到它在我正在使用的库中使用时,我才切换到上面的方法。:)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python