我设置了一个基本的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
也照常工作
答案 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
参数。
一个可能的缺点是,几个流行的数据科学库保留对其配置的记录器的引用,因此,当您重新配置日志时,它们自己的旧记录器和处理程序仍然存在并且看不到您的更改。在这种情况下,您还需要清理那些记录器的处理程序。