我有一个关于进程日志记录的问题:
- 我有 3 个脚本,a.py、b.py 和 c.sh
- a.py 调用 b.py,b.py 调用 c.sh
目标是连续记录 std out/err(写入文件和控制台)
我目前正在尝试像这样启动初始脚本:
python -u a.py 2>&1 | tee logfile.txt
现在的问题是,只有在 b.py 完全完成其执行后,c.sh 的输出才会被打印/记录,但我宁愿希望它处于活动状态(c.sh 中的所有行不会相继出现,它们都会出现整个过程完成后一起)。
有没有更好的记录方法,或者我是否可以通过 tee 以某种方式实现此目的?
答案1
我个人认为,在命令行脚本或应用程序中必须做的第一件事就是设置日志系统。只需几行可重复使用的行,您就可以登录所有 python 应用程序,甚至使用不同的调试级别:)。
我不会将日志记录基于将 stdout 写入带有 tee 的文件,只需记录到 stdout 和您的日志记录通道。我假设您可以修改 python 脚本,下面的所有内容都适用于这种情况。 (向下滚动查看“使用 T 恤答案”:)。
在Python中,您可以使用Logging模块(查看Python官方文档中的Logging HOWTO:https://docs.python.org/2/howto/logging.html)但不幸的是不同的进程不能写入同一个文件(同一进程的不同进程可以)。
因此,在您描述的这种情况下,我认为基本情况将使用日志库或系统日志库记录到系统日志(https://docs.python.org/2/library/syslog.html)。
您可以在所有应用程序上登录到 syslog 的 local0.* 设施,并让 syslog (在我的例子中为 rsyslog)写入该文件:
local0.* /var/log/myapp.log
该系统最好的一点是,您甚至可以登录到不同计算机上的远程系统日志服务器,而不仅仅是在执行应用程序的计算机上。
PS:不要忘记设置 /etc/logrotate.d/myapp 策略来轮换您的应用程序日志文件!
发球台选项
如果您仍然需要使用,您是否尝试在第二个和第三个进程中tee
使用该标志?-a
如中所述http://docstore.mik.ua/orelly/unix/upt/ch13_10.htm:
tee ( 13.9 ) 命令将其标准输入写入文件并将相同的文本写入其标准输出。您可能想要收集多个命令的输出,并将它们依次发送到同一个文件中。最明显的方法是使用 -a 选项
$ 一些命令 | T 恤 T 恤文件
$ 另一个命令 | tee -teefile
$ 第三个命令 | tee -teefile