日志在本地工作,但不在远程上工作

时间:2019-05-06 14:15:11

标签: python logging

我设置了一个基本的python记录器,该记录器可写入日志文件和stdout。当我在本地运行python程序时,带有logging.info的日志消息会在文件和控制台中按预期显示。但是,当我通过ssh -n user@server python main.py远程运行​​同一程序时,控制台和文件都不会显示任何logging.info消息。

这是用于设置记录器的代码:

def setup_logging(model_type, dataset):
    file_name = dataset + "_" + model_type + time.strftime("_%Y%m%d_%H%M")
    logging.basicConfig(
        level=logging.INFO,
        format="[%(levelname)-5.5s %(asctime)s] %(message)s",
        datefmt='%H:%M:%S',
        handlers=[
            logging.FileHandler("log/{0}.log".format(file_name)),
            logging.StreamHandler()
        ])

我已经尝试了以下操作:

  • logging.warning发送消息:这些消息按预期显示在root记录器上。但是,即使没有设置记录器并回到默认的logging.info消息也不会显示。

  • 文件和文件夹权限似乎还不错,并且在磁盘上创建了一个空文件。

  • 使用print也照常工作

1 个答案:

答案 0 :(得分:1)

如果您查看basicConfig函数中的source code,您将看到该函数仅在root记录器上没有处理程序时才适用:

_acquireLock()
try:
    force = kwargs.pop('force', False)
    if force:
        for h in root.handlers[:]:
            root.removeHandler(h)
            h.close()
    if len(root.handlers) == 0:
        handlers = kwargs.pop("handlers", None)
        if handlers is None:
...

我认为,您使用的库之一用于配置导入日志记录。从上面的示例中可以看到,解决方案之一是使用force=True参数。

一个可能的缺点是,几个流行的数据科学库保留对其配置的记录器的引用,因此,当您重新配置日志时,它们自己的旧记录器和处理程序仍然存在并且看不到您的更改。在这种情况下,您还需要清理那些记录器的处理程序。