【问题标题】:Where should I execute logging.basicConfig()?我应该在哪里执行 logging.basicConfig()?
【发布时间】:2019-11-26 23:58:58
【问题描述】:

我正在使用一个可以加载 python 解释器并运行任何 python 脚本的应用程序。我正在此应用程序中创建进程,这些进程运行脚本来控制外部硬件。硬件在特定地址和端口上通过 TCP/IP 以文本形式侦听命令,并通过同一端口发送响应。

我有 SocketInterface.py 处理编码/解码字节并处理所有套接字内容,以便其他模块可以调用SocketInterface.send().receive() 等。这样的模块之一是命令行-ish gui 只是在循环中运行 send()receive(),从文本框中读取命令并在另一个文本框中显示响应。

我正在研究的另一个模块将涉及一些包装函数,这些函数会自动以正确的格式构造命令,发送它,然后等待从硬件接收适当的响应。我想将日志记录纳入其中。我发送的命令和收到的响应的 INFO 级别语句,某些 TCP/IP 内容的 DEBUG 级别语句等。

最终,我希望我会有多个“脚本”,每个工作流一个,但我希望它们都写入同一个日志,比如说在一天内。

来自我的命令包装模块:

    def __init__(self):
        self.si = SocketInterface()
        self.logger = logging.getLogger(__name__)

        try:
            os.mkdir('logs')
        except FileExistsError:
            pass

        logging.basicConfig(
            filename='logs/{}.log'.format(time.strftime('%Y-%m-%d')),
            filemode='a', level=logging.DEBUG,
            format='%(asctime)s::%(name)s::%(levelname)s::%(message)s'
        )

使用 basicConfig() 的工作方式,这段代码可以执行任意多次(尽管我可能希望避免让os.mkdir() 尝试运行很多次。我只是不知道在哪里放置此代码以确保它确实确实执行,而不是将其粘贴到任何地方。

有没有比在我编写的每个脚本中将它放在main() 的开头更简洁的解决方案?

【问题讨论】:

    标签: python python-logging


    【解决方案1】:

    您可以在您的 __main__ 文件中的导入之后将其放入。一旦解释器命中它,它将立即执行。然后,您可以在每个文件的开头获取您的记录器。如果您将文件作为模块导入,它将在导入时运行,如果您直接运行它,它仍将首先运行。这是因为解释器运行每个文件以查找指令并按顺序执行它们。因此它将导入、运行配置、获取记录器,然后运行您的主程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-06
      • 2012-03-22
      • 2023-03-11
      • 1970-01-01
      • 2020-09-30
      相关资源
      最近更新 更多