La manera más directa de resolver esto es probablemente usar python y el logging module que fue diseñado para este propósito. Cree una secuencia de comandos que lea desde stdin
y escriba en stdout
e implemente la rotación de registros que se describe a continuación.
El "registro" módulo provides la
class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0,
backupCount=0, encoding=None, delay=0)
que hace exactamente lo que usted está planteando.
Puede utilizar los valores maxBytes y backupCount para permitir que el archivo se transfiera a un tamaño predeterminado.
De docs.python.org
A veces desea que un archivo de registro crezca a un tamaño determinado, a continuación, abra un nuevo archivo y conectarse a eso. Es posible que desee conservar un cierto número de estos archivos, y cuando se hayan creado tantos archivos, gire los archivos para que el número de archivos y el tamaño de los archivos permanezcan delimitados. Para este patrón de uso, el paquete de registro proporciona una RotatingFileHandler:
import glob
import logging
import logging.handlers
LOG_FILENAME = 'logging_rotatingfile_example.out'
# Set up a specific logger with our desired output level
my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.DEBUG)
# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
LOG_FILENAME, maxBytes=20, backupCount=5)
my_logger.addHandler(handler)
# Log some messages
for i in range(20):
my_logger.debug('i = %d' % i)
# See what files are created
logfiles = glob.glob('%s*' % LOG_FILENAME)
for filename in logfiles:
print(filename)
El resultado debe ser de 6 archivos separados, cada uno con parte del historial de registro de la aplicación:
logging_rotatingfile_example.out
logging_rotatingfile_example.out.1
logging_rotatingfile_example.out.2
logging_rotatingfile_example.out.3
logging_rotatingfile_example.out.4
logging_rotatingfile_example.out.5
El archivo más reciente es siempre logging_rotatingfile_example.out, y cada vez que alcanza el límite de tamaño se renombra con el sufijo .1. Cada uno de los archivos de copia de seguridad existentes se renombra para incrementar el sufijo (.1 se convierte en .2, etc.) y el archivo .6 se borra.
Obviamente, este ejemplo establece la longitud del registro demasiado demasiado pequeña como un ejemplo extremo. Desea establecer maxBytes en un valor apropiado.
Bah ... Me olvidé del operador>() en Bash (y algunos otros proyectiles). Lo uso muy infrecuentemente. La tuya es la respuesta más concisa. – kevinarpe