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 $
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 日志记录的教程是更好的开始。
即使在阅读了文档和教程之后,我也开始使用自己的日志记录实践,因为我根本没有得到它。当我看到它在我正在使用的库中使用时,我才切换到上面的方法。:)
添加回答
举报