Contexto

Se necesitaba recopilar logs distribuidos en una jerarquía de directorios y generar un directorio LOGS preparado para análisis.

Los ficheros podían estar:

  • comprimidos;
  • sin comprimir;
  • en carpetas de distintos módulos;
  • en subdirectorios arbitrarios.

Primer requisito: recursividad real

No era suficiente enumerar una lista conocida de carpetas.

El requisito evolucionó a:

recorrer todos los subdirectorios existentes a partir de una raíz.

Conceptualmente:

text
NTTData/
  ADM/
    node1/
      logs...
    node2/
      logs...
  APS/
    ...
  SDM/
    ...

La salida debía conservar:

text
LOGS/
  ADM/
    node1/
    node2/
  APS/
  SDM/

Decisión: preservar estructura relativa

Copiar todos los ficheros a un único directorio genera colisiones:

text
server.log
server.log
server.log

y elimina contexto.

La mejor estrategia es calcular:

text
relative_path = source_file relative_to input_root
destination = output_root / relative_path

Esto conserva la procedencia de cada fichero.

Idempotencia

El script debía poder ejecutarse varias veces sin rehacer trabajo ya completado.

La idempotencia es una propiedad muy importante en herramientas operativas.

Una estrategia posible:

text
si destino existe y coincide -> skip
si no existe -> procesar
si está comprimido -> extraer
si está normal -> copiar

Para un sistema más robusto se pueden utilizar:

  • tamaño;
  • timestamp;
  • checksum;
  • manifiesto de procesados.

Error OSError: [Errno 5] durante flush

Apareció un error de E/S durante una operación flush.

Ese tipo de fallo recuerda que no todos los errores de un script son lógicos.

Puede existir:

  • problema de filesystem;
  • almacenamiento remoto;
  • volumen montado;
  • disco;
  • permisos;
  • interrupciones de I/O.

Lo que aprendí

En scripts que trabajan con grandes volúmenes de fichero conviene separar:

text
errores de contenido
errores de permisos
errores de almacenamiento
errores de compresión
errores de lógica

y registrar el fichero exacto que estaba siendo procesado.

Diseño de un pipeline más robusto

Una arquitectura mejorada sería:

mermaid
flowchart LR
    A[Scan recursivo] --> B[Clasificar fichero]
    B -->|comprimido| C[Descomprimir]
    B -->|normal| D[Copiar]
    C --> E[Preservar ruta relativa]
    D --> E
    E --> F[Registrar resultado]
    F --> G[Manifest / reporte]

El manifiesto puede guardar:

text
source
destination
action
status
error
timestamp
size
checksum opcional

---