在Python中logging和旋转stdout和stderr

我是一个Linux新手,我正在运行以下Linux命令:

nohup python my_script.py > my.out 2> my.err 

一切都按预期工作。 我的python(2.7)打印语句的所有输出都被logging在名为my.out的文件中。

唯一的问题是运行该文件几天后,my.out变得非常大。 有没有一种方法(在Linux shell级别),我可以创build一个新的“my.out”,每天一次,在文件名中加上一个时间戳?

你应该在脚本中使用logging模块:

 import logging.handlers LOG_FILE_NAME = '/var/log/my_script.log' LOGGING_LEVEL = logging.INFO formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s') handler = logging.handlers.RotatingFileHandler(LOG_FILE_NAME, mode='a', maxBytes=5000000, backupCount=5) handler.setFormatter(formatter) log = logging.getLogger("my_script") log.addHandler(handler) log.setLevel(LOGGING_LEVEL) 

在这个例子中,我们配置一个5MB的日志文件轮换,保留5个文件。 因此,每当您的日志文件达到5MB时,该脚本将创建一个新的日志文件并存档旧文件(最多5个文件)。

以下是在日志文件中记录数据的代码示例:

 def do_something(): # do stuff here log.info("Something has been done") 

一旦你完成了,只需运行你的Python脚本:

 python my_script.py 

一切都将被记录在你想要的文件中,自动记录旋转。

如果您更喜欢基于时间的旋转,请参阅TimedRotatingFileHandler

https://docs.python.org/2/library/logging.handlers.html#timedrotatingfilehandler

是的,使用命令日期在文件名称内添加一个日期,如:

 nohup python my_script.py > my_`date +"%d_%m_%y"`.out 2> my.err 

4例子我用下面的命令完成了下一个例子:

 echo "hello" > name_`date +"%m_%y"` 

并且该文件的名称是name_06_17

你可以看到关于date命令输入的更多信息:

 man date 

这将允许您创建不同的文件,每月一个。

希望会有所帮助!

你想要的是Apache的同伴们用rotatelogs做的事情 。 提取:

rotatelogs是一个与Apache的管道日志文件功能结合使用的简单程序。 它支持基于日志的时间间隔或最大大小的旋转。

概要

rotatelogs [-l] [-L链接名] [-p程序] [-f] [-t] [-v] [-e] [-c] [-n文件数量] logfile rotationtime | filesize(B | K | M | G)[抵消]

rotationtime以秒为单位的日志文件轮换之间的时间。 旋转发生在这个间隔的开始。 例如,如果轮换时间是3600,则日志文件将在每小时的开始处旋转; 如果轮换时间是86400,则日志文件将在午夜每晚旋转。

对于你的用例,你可以这样做:

 nohup python my_script.py 2> my.err | rotatelogs -l my.out.%Y.%m.%d 86400 

每天有一个文件在当地时间0时00分更改文件。

您可以在Apache HTTPD项目中找到它,该项目几乎适用于任何常见的体系结构