2010-07-23 18 views
11

Tengo un sitio web con django y uso un módulo de registro estándar para rastrear la actividad web.Problema con el registro de Python RotatingFileHandler en el sitio web de Django

El registro se realiza a través de RotatingFileHandler que está configurado con 10 archivos de registro, 1000000 bytes cada uno. El sistema de registro funciona, pero esto son los archivos de registro que recibo:

-rw-r--r-- 1 apache  apache   83 Jul 23 13:30 hr.log 
-rw-r--r-- 1 apache  apache  446276 Jul 23 13:03 hr.log.1 
-rw-r--r-- 1 apache  apache  999910 Jul 23 06:00 hr.log.10 
-rw-r--r-- 1 apache  apache   415 Jul 23 16:24 hr.log.2 
-rw-r--r-- 1 apache  apache  479636 Jul 23 16:03 hr.log.3 
-rw-r--r-- 1 apache  apache   710 Jul 23 15:30 hr.log.4 
-rw-r--r-- 1 apache  apache  892179 Jul 23 15:03 hr.log.5 
-rw-r--r-- 1 apache  apache   166 Jul 23 14:30 hr.log.6 
-rw-r--r-- 1 apache  apache  890769 Jul 23 14:03 hr.log.7 
-rw-r--r-- 1 apache  apache  999977 Jul 23 12:30 hr.log.8 
-rw-r--r-- 1 apache  apache  999961 Jul 23 08:01 hr.log.9 

Como se puede ver que es un desastre. Último registro ha sido escrito para presentar hr.log.2 (jul 23 de 16:24) en lugar de hr.log, y logging documentation establece que:

[...] Por ejemplo, con un backupCount de 5 y un nombre de archivo base de app.log, obtendrías app.log, app.log.1, app.log.2, hasta app.log.5. El archivo que se está escribiendo siempre es app.log. Cuando se completa este archivo, se cierra y se renombra a app.log.1, y si existen los archivos app.log.1, app.log.2, etc., se renombran a app.log.2, app. log.3 etc. respectivamente.

¿Qué estoy haciendo mal?


Mi archivo de configuración de registro es:

logger.conf:

[loggers] 
keys=root 

[handlers] 
keys=fileHandler 

[formatters] 
keys=simple 

#-------------------------------------------------------------------- 
# Formatters 
[formatter_simple] 
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s 

#-------------------------------------------------------------------- 
# Handlers 
[handler_fileHandler] 
class=handlers.RotatingFileHandler 
level=DEBUG 
formatter=simple 
args=("/data/django/hr/hr.log",'a',1000000,10) 

#-------------------------------------------------------------------- 
# Loggers 
[logger_root] 
level=DEBUG 
handlers=fileHandler 

y mi módulo de Python para configurar el sistema de registro es:

logger.py

import os, logging 

# Load config file 
logger_config_file = \ 
    os.path.join(os.path.abspath(os.path.dirname(__file__)), 'logger.conf') 
logging.config.fileConfig(logger_config_file) 

# Create logger 
logger = logging.getLogger('hr_Logger') 

# Log start message 
logger.info("Logging system started") 

luego, en la parte superior de mi views.py tengo:

import logging 
from hr import logger 

log = logging.getLogger('hr.views') 
log.info('Load hr.views') 

[...] 
+1

probé una configuración a nivel local con su código y funciona bien. No puedo dejar de notar que las marcas de tiempo son en su mayoría: 30 y: 03. Especialmente desde las 14:03 parece que los archivos de registro se rotaron fuera de la aplicación. Una idea: ¿está seguro de que este es el único registro configurado? Se parece un poco a que tiene algún otro código de registro que mantiene un descriptor de archivo abierto. Mientras que el otro identificador apuntaba a hr.log cuando la aplicación comenzó, se rotó a hr.2 desde entonces. –

+0

Entonces ... ¿no está diciendo que el sistema de registro está roto, solo que las marcas de tiempo han sido cambiadas? ¿Los archivos de registro están girados en el orden correcto? Acabo de comprobar las marcas de tiempo en mis registros rotatorios a través del mismo método y están en el orden correcto. No tengo ningún procesamiento de registro que esté procesando los registros. Parece que puede tener una tarea periódica que tal vez toque los archivos? – Kekoa

+0

@Kekoa Como dices, el sistema de registro no está roto, es solo que no funciona como se esperaba. Desafortunadamente, ya no estoy trabajando en el proyecto y no puedo probar ninguna sugerencia posible. Gracias. – ssoler

Respuesta

7

He encontrado este comportamiento cuando se están ejecutando múltiples procesos con tu código.

Desafortunadamente, no existe una opción perfecta.

Algunas ideas, puede incorporar son:

  • uso WatchedFileHandler (nuevo en 2.6) y girar con programas externos como logrotate
  • uso syslog u otro registro de la agregación de servidor
  • uso pitón agregación de registro sentry - Esto es especialmente útil con django, ya que puede registrar no solo mensajes de registro, sino excepciones con pila completa y 404s.
Cuestiones relacionadas