[pyar] Problema con logging.RotatingFileHandler

Joaquín Sorianello listas en joac.com.ar
Dom Abr 21 16:38:12 ART 2013


2013/4/21 Andrés Gattinoni <andresgattinoni en gmail.com>:
> Hola listeros, cómo andan?
>
> Ya van un par de veces que uso el módulo logging con la clase
> RotatingFileHandler y no logro hacer que la rotación funcione. A alguno le
> pasó? Tienen idea de por qué puede ser?
>
> Les pongo las porciones del código donde inicializo logging:
>
> def _get_file_handler(config, action):
>
> if 'logging.max_mbytes' in config:
>
> max_bytes = config['logging.max_mbytes'] * 1024 * 1024
>
> backup_count = config['logging.backup_count'] \
>
> if 'logging.backup_count' in config else 5
>
> handler = RotatingFileHandler(config['logging.file'],
>
> mode='a',
>
> encoding='utf-8',
>
> maxBytes=max_bytes,
>
> backupCount=backup_count)
>
> else:
>
> handler = FileHandler(config['logging.file'],
>
> mode='a',
>
> encoding='utf-8')
>
> formatter = logging.Formatter('%%(asctime)s %s.%%(module)s.%%(levelname)s '
>
> '[%s] (%%(process)d): %%(message)s' %
>
> (config['logging.tag'], action))
>
> handler.setFormatter(formatter)
>
> return handler
>
> def setup_logger(action, quiet=False):
>
> config = settings.get_config()
>
> logger = logging.getLogger('emr')
>
> if 'logging.file' in config:
>
> handler = _get_file_handler(config, action)
>
> else:
>
> handler = _get_syslog_handler(config, action)
>
> if 'logging.level' in config:
>
> logger.setLevel(_translate_level(config['logging.level']))
>
> logger.addHandler(handler)
>
> if not quiet:
>
> logger.addHandler(_get_stdout_handler(config))
>
>
> He comprobado que efectivamente la clase RotatingFileHandler se instancia.
> Todo lo demás funciona perfecto, el logging anda, pero los archivos nunca
> rotan. Probé con distintos valores para maxBytes y nada.
>
>
> Qué puede ser?

Hola, despues de mandar el otro mail me quede pensando un poco...
Estas seguro que:

max_bytes = config['logging.max_mbytes'] * 1024 * 1024

Termina siendo un int? por ejemplo:

>>> config = {'max_mbytes':'25'}
>>> max_bytes = config['max_mbytes'] * 2
>>> max_bytes <= 50
False
>>> max_bytes
'2525'

la comparación la puse de ejemplo, para emular el comportamiento de esta linea:

http://hg.python.org/releasing/2.7.3/file/7bb96963d067/Lib/logging/handlers.py#l158
(linea 158)

Podes usar int() en conjunto con el metodo de string **isdigit()**
para ver si es numerico, y poder convertirlo a int de forma segura.

Saludos!
--
Joaquín Sorianello
A.K.A. Joac
@_joac



More information about the pyar mailing list