Python:如何在txt文件中的控制台中写入错误?

新手上路,请多包涵

我有一个 python 脚本,它每 10 分钟向我发送一封电子邮件,其中包含控制台中编写的所有内容。我在我的 ubuntu 18.04 vps 中使用 crontab 运行它。有时它不发送邮件所以我假设当错误发生时执行停止但我怎样才能将错误写入 txt 文件以便我可以分析错误?

原文由 strangethingspy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 414
2 个回答

记录模块

为了演示 logging 模块的方法,这将是通用方法

import logging

# Create a logging instance
logger = logging.getLogger('my_application')
logger.setLevel(logging.INFO) # you can set this to be DEBUG, INFO, ERROR

# Assign a file-handler to that instance
fh = logging.FileHandler("file_dir.txt")
fh.setLevel(logging.INFO) # again, you can set this differently

# Format your logs (optional)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter) # This will set the format to the file handler

# Add the handler to your logging instance
logger.addHandler(fh)

try:
    raise ValueError("Some error occurred")
except ValueError as e:
    logger.exception(e) # Will send the errors to the file

如果我 cat file_dir.txt

 2019-03-14 14:52:50,676 - my_application - ERROR - Some error occurred
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
ValueError: Some error occurred

打印到文件

正如我在评论中指出的那样,您 也可以 使用 print 来完成此操作(我不确定您是否会为此鼓掌)

 # Set your stdout pointer to a file handler
with open('my_errors.txt', 'a') as fh:
    try:
        raise ValueError("Some error occurred")
    except ValueError as e:
        print(e, file=fh)

cat my_errors.txt

 Some error occurred

请注意 logging.exception 在这种情况下 包括 回溯,这是该模块的众多巨大好处之一

编辑

为了完整起见, traceback 模块利用与 print 类似的方法,您可以在其中提供文件句柄:

 import traceback
import sys

with open('error.txt', 'a') as fh:
    try:
        raise ValueError("Some error occurred")
    except ValueError as e:
        e_type, e_val, e_tb = sys.exc_info()
        traceback.print_exception(e_type, e_val, e_tb, file=fh)

这将包括您想要的所有信息 logging

原文由 C.Nivs 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以按照评论中的建议使用 logging 模块(可能更好,但超出我的知识范围),或者使用 tryexcept like 捕获错误:

 try:
    pass
    #run the code you currently have
except Exception as e: # catch ALLLLLL errors!!!
    print(e) # or more likely you'd want something like "email_to_me(e)"

尽管通常不赞成捕获 所有 异常,因为如果您的程序由于 任何 原因而失败,它将在 except 子句中被吞噬,因此更好的方法是找出您遇到的特定错误 IndexError 然后只捕获这个特定的错误,如:

 try:
    pass
    #run the code you currently have
except IndexError as e: # catch only indexing errors!!!
    print(e) # or more likely you'd want something like "email_to_me(e)"

原文由 Reedinationer 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题