为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

千万里不及你 2022-07-19 10:36:35
我正在创建集中式日志记录。这基本上看起来像下面的脚本。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 logitlogit.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 scriptHublogdir = str(pathlib.Path(__file__).parent.absolute())#Creates the log file based on a given name from the scriptdef 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 的名称。
查看完整描述

2 回答

?
胡子哥哥

TA贡献1825条经验 获得超6个赞

这个问题不是很清楚,但你可以使用inspect.stack().


loggy.py

import inspect


def log(s):

    caller = inspect.stack()[1]

    print(f"{caller.filename} line {caller.lineno} says: {s}")

thing.py

import loggy


loggy.log("Hey!")

/v/f/n/8/T/tmp.ZiRzgsqi $ python3 thing.py

thing.py line 3 says: Hey!

/v/f/n/8/T/tmp.ZiRzgsqi $


查看完整回答
反对 回复 2022-07-19
?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

好的,重写后的问题:


我已经看到它以与您相反的方式完成 - 获取一个记录器,然后设置它(模块中有两行,而不是一个)。记录器是每个模块的东西,并且总是在那里。


在您的情况下,您每次都重新获取记录器并重新制作处理程序。


这样你就不能利用美丽的可能性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 scriptHub

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


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

def 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 日志记录的教程是更好的开始。


即使在阅读了文档和教程之后,我也开始使用自己的日志记录实践,因为我根本没有得到它。当我看到它在我正在使用的库中使用时,我才切换到上面的方法。:)


查看完整回答
反对 回复 2022-07-19
  • 2 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信