我是一个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项目中找到它,该项目几乎适用于任何常见的体系结构