提问人:LCMa 提问时间:11/17/2022 最后编辑:tripleeeLCMa 更新时间:2/1/2023 访问量:749
将控制台输出保存在 txt 文件中
Save console output in txt file as it happens
问:
我想将我的控制台输出保存在文本文件中,但我希望它保持原样,以便在程序崩溃时保存日志。 你有什么想法吗?
我不能只指定,因为我有很多不同的记录器正在打印到控制台中。file
logger
答:
我认为您确实可以使用记录器,只需添加一个文件处理程序,即可从日志记录模块中读取此内容
例如,您可以使用如下内容,它同时记录到终端和文件中:
import logging
from pathlib import Path
root_path = <YOUR PATH>
log_level = logging.DEBUG
# Print to the terminal
logging.root.setLevel(log_level)
formatter = logging.Formatter("%(asctime)s | %(levelname)s | %(message)s", "%Y-%m-%d %H:%M:%S")
stream = logging.StreamHandler()
stream.setLevel(log_level)
stream.setFormatter(formatter)
log = logging.getLogger("pythonConfig")
if not log.hasHandlers():
log.setLevel(log_level)
log.addHandler(stream)
# file handler:
file_handler = logging.FileHandler(Path(root_path / "process.log"), mode="w")
file_handler.setLevel(log_level)
file_handler.setFormatter(formatter)
log.addHandler(file_handler)
log.info("test")
如果您有多个记录器,您仍然可以使用此解决方案,因为记录器可以从其他记录器继承,只需将处理程序放在根记录器中并确保其他人从该记录器中获取处理程序即可。
作为替代方案,您可以使用 nohup 命令,即使终端关闭,它也会保持进程运行,并将输出返回到所需位置:
nohup python main.py > log_file.out &
评论
& >
sh
nohup python main.py >log_file.out 2>&1
cron
&
>
)
从字面上看,有很多方法可以做到这一点。但是,由于不同的原因(可维护性、易用性、重新发明轮子等),它们并不都适合。
如果您不介意使用操作系统内置,您可以:
使用 将标准输出和错误流转发到您选择的文件。
python3 -u ./myscript.py 2>&1 outputfile.txt
将标准输出和错误流转发到您选择的文件,并使用 将其显示到控制台。该选项指定输出是无缓冲的(即:放入管道中的东西立即输出)。
python3 -u ./myscript.py 2>&1 tee outputfile.txt
-u
如果你想从 Python 端执行此操作,你可以:
使用该模块将生成的日志输出到文件句柄,而不是标准输出。
logging
覆盖 sys( 和 ) 中定义的 stdout 和 stderr 流,以便它们指向您选择的打开的文件句柄。例如。
sys.stdout
sys.stderr
sys.stdout = open("log-stdout.txt", "w")
作为个人偏好,越简单越好。该模块是为日志记录而制作的,并提供了实现您想要的所有必要机制。所以。。我建议你坚持下去。这是模块文档的链接,其中还提供了许多示例,从简单使用到更复杂和高级的使用。logging
logging
评论
python foo.py 2>&1 | tee -a logfile.log