【发布时间】:2020-09-03 17:58:41
【问题描述】:
我正在学习 Python 中的logging 模块。
但是,如果我这样记录
logging.basicConfig(filename='mylog.log',format='%(asctime)s - %(levelname)s - %(message)s', level=logging.DEBUG)
while 1:
logging.debug("something")
time.sleep(1)
并用 control-C 事件中断进程(或进程被杀死),我无法从日志文件中得到任何信息。
无论发生什么,我都可以保存最多的日志吗?
————
编辑
问题似乎变得更复杂了:
我在我的脚本中导入了 scipy、numpy、pyaudio,我得到了:
forrtl: error (200): program aborting due to control-C event
而不是KeyboardInterrupt
我读过这个问题:Ctrl-C crashes Python after importing scipy.stats
并将这些行添加到我的脚本中:
import _thread
import win32api
def handler(dwCtrlType, hook_sigint=_thread.interrupt_main):
if dwCtrlType == 0: # CTRL_C_EVENT
hook_sigint()
return 1 # don't chain to the next handler
return 0 # chain to the next handler
然后:
try:
main()
except KeyboardInterrupt:
print("exit manually")
exit()
现在,如果我使用 ctrl+C,脚本会在没有任何信息的情况下停止。 print("exit manually") 没有出现。当然,没有日志。
已解决
一个愚蠢的错误!
我在工作目录为System32 时运行脚本并希望在脚本路径中找到日志。
我这样改变路线后,一切都很好。
logging.basicConfig(filename=os.path.dirname(sys.argv[0])+os.sep+'mylog.log',format='%(asctime)s - %(levelname)s - %(message)s', level=logging.DEBUG)
【问题讨论】:
-
在不知道如何配置记录器的情况下,很难判断是否应该得到任何输出?正如 BrianO 所指出的,
logging.debug默认情况下不记录。你提到了一个日志文件,但默认的日志输出是sys.stderr,而不是一个文件。 -
使用 control-C 中断进程和终止进程之间也有很大区别。我不知道 Windows(您似乎正在使用它),但在例如*nix,有多种方法可以杀死进程(即可以向可能停止该进程的进程发送各种信号)。您需要更清楚您是在谈论 control-C(可以使用
except KeyboardInterrupt拦截)还是其他中断。 -
@Evert,我发现了我的愚蠢错误。感谢您的帮助!