我是Linux新手,我正在运行以下Linux命令:
nohup python my_script.py > my.out 2> my.err
一切都按预期工作;我的python(2.7)打印语句的所有输出都记录在名为my.out的文件中。
唯一的问题是,运行文件几天后,my.out变得非常大。有没有办法(在Linux shell级别)我可以创建一个新的“my.out”,比如每天说一次,文件名中有一个时间戳?
答案 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中找到它