关于日志记录的及时性问题【solved】

为什么在linux服务器上使用nohup python3 xxx.py > xxx.log 2>&1 &代码保存的日志信息中,代码涉及的打印内容不会即时保存在文件中,而是统一大批量保存?

在使用 nohup 运行程序并重定向输出到文件时,涉及到缓冲问题。Python(以及许多其他编程语言的标准库)会对标准输出进行缓冲。这意味着输出不会直接写到目标文件中,而是存储在内存中的一个缓冲区里,直到满足某些条件后才实际写入文件。这种处理方式可以减少对磁盘的写入操作次数,从而提高程序的效率。

缓冲类型

Python 的标准输出(stdout)根据运行环境默认可以是以下几种缓冲类型之一:

全缓冲:数据会积累在缓冲区中,直到缓冲满了,才会写入文件。
行缓冲:每当输出数据包含换行符时,缓冲区会被刷新(即,写入文件中)。
无缓冲:数据直接写入目的地,不经过缓冲区。
当使用 python3 运行脚本且输出被重定向到文件时(如使用 nohup 和重定向),Python 通常会使用全缓冲。因此,数据会在缓冲区积累,直到缓冲区满了或者程序关闭(或flush操作被调用),那时数据才会被写入到日志文件。

解决方法

如果你希望日志信息能即时写入文件,有以下几个解决方案:

1. 手动刷新输出:

在代码中可以使用 sys.stdout.flush() 来强制立即刷新标凈输出的缓冲区。

import sys
print("Some log message")
sys.stdout.flush()

2.使用无缓冲或行缓冲:

你可以通过设置 Python 的运行参数来改变默认的缓冲行为。使用 -u 参数可以使 Python 的 stdout 和 stderr 流无缓冲。

nohup python3 -u xxx.py  > xxx.log 2>&1 &

3.修改 PYTHONUNBUFFERED 环境变量:

在运行脚本前,设置环境变量 PYTHONUNBUFFERED 也可以让 Python 运行在无缓冲模式下。

export PYTHONUNBUFFERED=1
nohup python3 xxx.py > xxx.log 2>&1 &

nohup env PYTHONUNBUFFERED=1 python3 xxx.py >xxx.log 2>&1 &
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Env1sage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值