在Python中记录和旋转stdout和stderr

时间:2017-06-29 13:53:00

标签: python linux python-2.7

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

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

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

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

3 个答案:

答案 0 :(得分:2)

您应该在脚本中使用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

答案 1 :(得分:1)

是的,使用命令日期在文件名中添加日期,如:

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

4示例我使用以下命令完成了下一个示例:

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

,文件名为name_06_17

您可以看到有关日期命令输入的更多信息:

man date

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

希望有所帮助!

答案 2 :(得分:1)

你想要的是Apache研究员用rotatelogs做的事情。提取物:

  

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

     

概要

     

rotatelogs [-l] [-L linkname] [-p program] [-f] [-t] [-v] [-e] [-c] [-n number-of-files] logfile rotationtime | filesize(B | K | M | G)[offset]
...
  rotationtime       日志文件轮换之间的时间(以秒为单位)。旋转发生在此间隔的开始处。例如,如果旋转时间为3600,则日志文件将在每小时开始时旋转;如果旋转时间是86400,则日志文件将在午夜每晚旋转。

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

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

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

您可以在几乎所有常见架构的Apache HTTPD project中找到它