【问题标题】:Python Logging ErrorPython 日志记录错误
【发布时间】:2017-09-12 02:52:26
【问题描述】:

所以我是第一次使用 python 日志记录模块,我收到一个错误,我找不到任何信息。

在我的文件开头,我有以下内容:

logging.basicConfig(level=logging.INFO, filename='logs', filemode='a+', format='[%(asctime)-15s] %(levelname)-8s %(message)s')

引发错误的行:

logging.info(f'Downloading: {file_name}\t{local_file_path}\t{os.path.abspath(local_file_path)}')

--- Logging error ---
Traceback (most recent call last):
  File "C:\Python36\lib\logging\__init__.py", line 996, in emit
    self.flush()
  File "C:\Python36\lib\logging\__init__.py", line 976, in flush
    self.stream.flush()
OSError: [Errno 22] Invalid argument
Call stack:
  File "Main.py", line 81, in <module>
    main()
  File "C:\Python36\lib\site-packages\click\core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "C:\Python36\lib\site-packages\click\core.py", line 697, in main
    rv = self.invoke(ctx)
  File "C:\Python36\lib\site-packages\click\core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "C:\Python36\lib\site-packages\click\core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "Main.py", line 32, in main
    work_tv(ftp, ext)
  File "Main.py", line 76, in work_tv
    logging.info(f'Downloading: {file_name}\t{local_file_path}\t{os.path.abspath(local_file_path)}')
Message: 'Downloading: Preacher S02E13\t./Preacher/Season 2/Preacher S02E13.mkv\tZ:\\TV\\Preacher\\Season 2\\Preacher S02E13.mkv'
Arguments: ()

我不明白这个错误。前 8 次成功运行,没有出现任何问题。但是最后两个,它抛出了这个相同的错误。谁能给我解释一下。

【问题讨论】:

  • 不要直接使用logging,应该使用logger from logging:logger = logging.getLogger(name),然后使用logger.info('blahblah')。
  • 您的日志记录代码看起来不错。这不是异常的来源。 Windows 抛出 Errno 22 有许多神秘的原因。请参阅 stackoverflow.com/questions/23688492/…social.msdn.microsoft.com/Forums/en-US/…。你能扩展你的例子吗?重现该问题的完整脚本会很好。我怀疑这是 Windows 问题,您运行的是什么版本的 Windows?
  • @MattHardcastle 我正在运行 Windows 10 64 位 Home 和 Python 3.6.2 64 位。我实施了@MenglongLi 建议的更改,到目前为止没有错误,但还为时过早。今天没有下载。没有什么我可以真正扩展的。我不使用任何其他的日志记录方法,只是info
  • 我更新了答案。

标签: python logging


【解决方案1】:

它在self.stream.flush() 上失败的事实意味着正在写入的文件(大概是logs)已经关闭或由于其他原因不可写入。

更新:如果您需要处理此问题,请将处理程序子类化并覆盖 emit() 方法以执行您需要从错误中恢复的操作。

【讨论】:

  • 由于脚本 24/7 连续运行,我想文件正在关闭。每当它为记录器关闭时,我将如何打开它?
  • @Spedwards,你解决了这个问题吗?我有一个类似的问题,将 24/7 进程记录到 SMB 共享失败,直到进程重新启动,如果文件服务器被修补等。
  • 如果您希望事件静默删除,还可以考虑将 logging.raiseExceptions 设置为 False(更多信息:docs.python.org/3/howto/logging.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 2012-03-26
相关资源
最近更新 更多