Amigos, ¿hay una solución * nix que haría que el archivo de registro actúe como un búfer circular? Por ejemplo, me gustaría que los archivos de registro almacenen un máximo de 1 Gb de datos y descarten las entradas más antiguas una vez que se alcanza el límite.
¿Es posible en absoluto? Creo que para lograr que un archivo de registro se convierta en algún tipo de dispositivo especial ...
PD: Estoy al tanto de las herramientas de rotación misceláneas, pero esto no es lo que necesito. La rotación requiere mucha IO, ocurre generalmente una vez al día mientras necesito una solución de "tiempo de ejecución".
tail -f somefile
haría eso. Acabo de probar con registros rotados ytail -f
no funciona con ellos.Respuestas:
Linux tiene un buffer de anillo de kernel. Puedes usar
dmesg
para mostrarlo .O aquí hay un módulo de kernel de Linux que parece hacer lo que quieres.
fuente
Lo más parecido que se me ocurre es RRDTools, pero probablemente no sea lo que está buscando. Otra solución sería monitorear el archivo de registro (digamos cada segundo o en Linux con inotify), por ejemplo, escribe un script como:
con inotify:
fuente
Puede utilizar multilog de daemontools de djb. Canaliza su salida de registro en él. Sí, es rotación de registros, pero las rotaciones son simplemente:
Lo cual, en casi cualquier sistema de archivos de Linux moderno es una operación súper rápida. Puede especificar cuántos archivos de registro desea, qué tamaño desea. crea archivos de 10 x 1024 mb y tendrás tu búfer de anillo de 1 gb.
Tenga en cuenta que, debido a la rotación automática, es una fuente por instancia de multilog. Pero puede solucionarlo escribiendo un contenedor simple con netcat o a mano.
fuente
Puede hacer una tubería FIFO y luego leerla usando un script que se inserta en una base de datos. Cuando el contador llegue a 1,000, reinicie el número de identificación que se está insertando en la base de datos. No funcionaría por tamaño, por supuesto, pero lo usaste como un ejemplo, así que supongo que esta es una pregunta teórica.
fuente
Interesante pregunta; normalmente no se ve eso como un diseño. Tengo un programa que usa una técnica ligeramente similar para registrar el historial, pero usa un formato binario. El 'archivo de registro' tiene cuatro partes, todas en un formato neutral para la máquina:
Cuando se asigna un nuevo registro, si hay espacio en la lista libre, sobrescribe una entrada allí (no necesariamente usándolo todo, en cuyo caso el fragmento permanece en la lista libre). Cuando no hay espacio en la lista libre, se asigna nuevo espacio al final. Cuando un registro antiguo gira, su espacio se mueve a la lista libre y se fusiona con cualquier registro libre adyacente. Está diseñado para manejar declaraciones SQL para que los registros se puedan distribuir en muchas líneas. Este código funciona en un número específico de registros. No limita el tamaño del archivo per se (aunque no sería difícil hacerlo).
El código principal del historial del código está en dos archivos, history.c e history.h, disponibles en la fuente del programa SQLCMD (mi versión, no la de Microsoft; la mía existía una década o más antes que la de Microsoft), que se puede descargar desde el archivo de software del grupo internacional de usuarios Informix . También hay un programa de volcado de archivos de historial (histdump.c) y un probador de historial (histtest.ec; afirma que es ESQL / C, pero en sí mismo es realmente un código C; una de las funciones de soporte que llama utiliza algunos Informix ESQL / C funciones de biblioteca). Póngase en contacto conmigo si desea experimentar sin utilizar Informix ESQL / C; consulte mi perfil. Hay algunos cambios triviales para que compile histtest fuera de su entorno de diseño, además de que necesita un archivo MAKE.
fuente
Estoy de acuerdo con el comentario de pehrs a su pregunta. La rotación de registros no es tan difícil. Puede configurar logrotate u otro script para verificar periódicamente su archivo de registro, incluso con la frecuencia que cada minuto si lo desea. Cuando detecta que su archivo alcanza 1 GB de tamaño, simplemente realiza un cambio de nombre, que casi no requiere E / S. Durante el cambio de nombre, el proceso continúa escribiendo el archivo de registro. El rotador de registros puede enviar un HUP a su demonio syslog (su demonio está registrando a través de syslog, ¿verdad? Si no, debería admitir la señal HUP si está bien escrito ...) para que vuelva a abrir la ruta original del archivo . En este punto, comenzará a escribir en un nuevo archivo en la ruta original y puede eliminar la versión rotada.
fuente