2010-12-14 6 views
23

Parece que tengo algunos problemas al intentar implementar el inicio de sesión en mi proyecto de python.Archivo de configuración de registro de Python

Simplemente estoy tratando de imitar la siguiente configuración:

Python Logging to Multiple Destinations

Sin embargo en vez de hacer esto dentro del código, me gustaría tenerlo en un archivo de configuración.

A continuación es mi fichero de configuración:

[loggers] 
keys=root 

[logger_root] 
handlers=screen,file 

[formatters] 
keys=simple,complex 

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

[formatter_complex] 
format=%(asctime)s - %(name)s - %(levelname)s - %(module)s : %(lineno)d - %(message)s 

[handlers] 
keys=file,screen 

[handler_file] 
class=handlers.TimedRotatingFileHandler 
interval=midnight 
backupCount=5 
formatter=complex 
level=DEBUG 
args=('logs/testSuite.log',) 

[handler_screen] 
class=StreamHandler 
formatter=simple 
level=INFO 
args=(sys.stdout,) 

El problema es que mi salida de la pantalla se ve así:
2010-12-14 11: 39: 04,066 - root - ADVERTENCIA - 3
2010-12 -14 11: 39: 04,066 - root - ERROR - 4
2010-12-14 11: 39: 04,066 - root - Importante - 5

Mi archivo es de salida, pero se ve igual que antes (aunque con la información adicional incluida). Sin embargo, los niveles de depuración e información no se envían a ninguno.

estoy en Python 2.7

Aquí está mi ejemplo sencillo mostrando el fracaso:

import os 
import sys 
import logging 
import logging.config 

sys.path.append(os.path.realpath("shared/")) 
sys.path.append(os.path.realpath("tests/")) 

class Main(object): 

    @staticmethod 
    def main(): 
    logging.config.fileConfig("logging.conf") 
    logging.debug("1") 
    logging.info("2") 
    logging.warn("3") 
    logging.error("4") 
    logging.critical("5") 

if __name__ == "__main__": 
    Main.main() 

Respuesta

16

Se parece que ha establecido los niveles para sus manejadores, pero no para su registrador. El nivel del registrador filtra cada mensaje antes de que pueda llegar a sus controladores y el valor predeterminado es WARNING y superior (como puede ver). Establecer el nivel del registrador de raíz como NOTSET como lo ha hecho, así como establecerlo en DEBUG (o lo que sea el nivel más bajo que desea registrar) debería resolver su problema.

11

agregando la siguiente línea al registrador de la raíz se hizo cargo de mi problema:

level=NOTSET 
0
#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import logging 
import logging.handlers 
from logging.config import dictConfig 

logger = logging.getLogger(__name__) 

DEFAULT_LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': False, 
} 
def configure_logging(logfile_path): 
    """ 
    Initialize logging defaults for Project. 

    :param logfile_path: logfile used to the logfile 
    :type logfile_path: string 

    This function does: 

    - Assign INFO and DEBUG level to logger file handler and console handler 

    """ 
    dictConfig(DEFAULT_LOGGING) 

    default_formatter = logging.Formatter(
     "[%(asctime)s] [%(levelname)s] [%(name)s] [%(funcName)s():%(lineno)s] [PID:%(process)d TID:%(thread)d] %(message)s", 
     "%d/%m/%Y %H:%M:%S") 

    file_handler = logging.handlers.RotatingFileHandler(logfile_path, maxBytes=10485760,backupCount=300, encoding='utf-8') 
    file_handler.setLevel(logging.INFO) 

    console_handler = logging.StreamHandler() 
    console_handler.setLevel(logging.DEBUG) 

    file_handler.setFormatter(default_formatter) 
    console_handler.setFormatter(default_formatter) 

    logging.root.setLevel(logging.DEBUG) 
    logging.root.addHandler(file_handler) 
    logging.root.addHandler(console_handler) 



[31/10/2015 22:00:33] [DEBUG] [yourmodulename] [yourfunction_name():9] [PID:61314 TID:140735248744448] this is logger infomation from hello module 

Creo que debería agregar los disable_existing_loggers a falso.

Cuestiones relacionadas