Python 日志记录在本地工作,但不在远程工作

Python 日志记录在本地工作,但不在远程工作,python,logging,Python,Logging,我设置了一个基本的python记录器,它可以写入日志文件和标准输出。当我在本地运行python程序时,带有logging.info的日志消息会按预期显示在文件和控制台中。但是,当我通过ssh-n远程运行相同的程序时user@serverpython main.py控制台和文件都不显示任何logging.info消息 这是用于设置记录器的代码: def设置\记录模型\类型,数据集: 文件名=数据集+模型+类型+时间。strftime\u%Y%m%d\u%H%m logging.basicConfi

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

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

def设置\记录模型\类型,数据集: 文件名=数据集+模型+类型+时间。strftime\u%Y%m%d\u%H%m logging.basicConfig 级别=logging.INFO, 格式=[%levelname-5.5s%asctimes]%消息, datefmt='%H:%M:%S', 处理者=[ logging.FileHandlerlog/{0}.log.format文件名, logging.StreamHandler ] 我已经尝试过以下方法:

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

文件和文件夹权限似乎正常,在磁盘上创建了一个空文件

使用印刷品也能正常工作

如果查看basicConfig函数的名称,您将看到该函数仅在根记录器上没有处理程序时应用:

_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参数


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

force选项似乎只在python 3.8中添加,因此很遗憾,我无法尝试运行3.7,但我不确定为什么只有在远程执行代码时才会出现此问题?编辑:你确实是对的。我随后重新加载了记录器,现在它也在远程工作。@smonsays,代码远程工作方式不同的可能原因是环境。这是我的第一个猜测,因为我在实践中多次看到这一点。我很高兴这有帮助。