Watch at EaseHistorias. Respuestas. Perspectiva.

Tecnología · GUÍA PRÁCTICA

¿La rotación de Python perdió líneas? Verifique el cambio de inode y la unión

Use un solo propietario de rotación, compare el descriptor abierto con la ruta y compruebe cada registro numerado una sola vez.

Ilustración editorial original que compara dispositivo e inode de la ruta y del descriptor antes y después de rename-create.
Ilustración editorial original: tras el primer registro, el descriptor debe cambiar al inode de la ruta nueva. Watch at Ease

Que logrotate termine bien y exista un app.log nuevo no demuestra que Python dejó de escribir en el inode renombrado. WatchedFileHandler comprueba dispositivo e inode antes de cada emit en sistemas tipo Unix; verifique descriptor, ruta y registros.

Use un solo propietario de rotación: rename-create externo con WatchedFileHandler o un único manejador interno, nunca ambos. Numere los registros alrededor del límite y acepte solo una secuencia exacta sin huecos ni duplicados.

1. Elija un solo propietario

Si logrotate renombra app.log y crea otro, conecte solo WatchedFileHandler y no añada un manejador rotatorio interno.

En Windows o sistemas de archivos con otra semántica de inode, pruebe en el montaje y cuenta reales antes de aplicar este método.

2. Registre identidad del descriptor y la ruta

Antes de rotar, haga flush y registre dispositivo e inode con os.fstat y os.stat; ambos deben identificar el mismo objeto.

Registre también permisos y propietario: un problema de CPython muestra que la reapertura falla si desaparece el directorio destino.

3. Renombre, cree y emita una vez

Renombre app.log a app.log.1 y cree el nuevo archivo con permisos revisados antes de la siguiente escritura.

Emita un centinela numerado y haga flush; el descriptor debe coincidir con el inode de la ruta nueva y el rotado debe conservar el inode anterior.

4. Pruebe cada registro una vez

Escriba seq-001 a 003 antes y seq-004 a 006 después. Lea ambos archivos completos: la unión debe ser la esperada y cada valor aparecer una vez.

La prueba local con CPython 3.12.14 no tuvo faltantes ni duplicados y el descriptor posterior coincidió con la ruta nueva.

5. Rechace atajos que ocultan el límite

copytruncate no es una alternativa sin pérdidas; el manual advierte de una ventana entre copia y truncado.

No compare solo el total de líneas ni la existencia de la ruta nueva: un faltante y un duplicado pueden conservar el mismo total.

6. Registre los límites

La prueba demuestra solo la combinación observada de Python, sistema de archivos, cuenta y configuración; no cubre sistemas remotos, contenedores ni Windows.

Repita tras cambiar versión, manejador, política, montaje, permisos o cuenta, y supervise errores de reapertura.

Ilustración editorial original con tres registros en el archivo rotado y tres en el activo nuevo.
Ilustración editorial original: acepte solo una unión numerada sin faltantes ni duplicados. Watch at Ease