Python日志记录字符串不是格式化程序

时间:2019-01-08 10:40:13

标签: python logging formatting string-formatting

我正在尝试使用python日志记录为每个类创建一个记录器。

本质问题是我的输出如果根本不进行格式化,它只会打印出格式字符串。

这是我用来创建记录器的脚本:

def obtener_logger_experimental(nombre, file=None, root=False, format=None, level=logging.DEBUG):
    if not isinstance(nombre, str):
        raise TypeError("El nombre del logger debe de ser un string")
    if format is None:
        # format = '%(levelname)s: %(asctime)-15s %(name)s\t%(message)s'
        # format = '%(asctime)-15s %(message)s'
        format = "%(asctime)s %(levelname)-8s %(name)s [%(filename)s:%(lineno)d - %(funcName)2s()]\t%(message)s"
    else:
        if not isinstance(format, str):
            raise TypeError("El format del logger debe de ser un string")
    formatter = logging.Formatter(fmt=format)
    logging.basicConfig(level=level, format=format)
    if root:
        logger = logging.getLogger(nombre)
    else:
        logger = logging.Logger(name=nombre, level=level)
    logger.setLevel(level)
    handler_root = False
    if root:
        if hasattr(logger, 'root'):
            if hasattr(logger.root, 'handlers'):
                for handler in logger.root.handlers:
                    # Ñapa, pero funciona.
                    handler.setFormatter(formatter)
                    handler.setLevel(level)
                    handler_root = True
    else:
        # No sé si esto funciona.
        logger.propagate = False
    if file is not None:
        try:
            if not verificar_permiso_escritura(fichero=file, soloficheros=True):
                raise FileExistsError("El fichero de log no existe o no hay permisos para crearlo / editarlo: " + file)
        except Exception as e:
            raise FileExistsError("Error verificando los permisos del fichero " + file + " Excepcion: " + str(e))
        handler = logging.handlers.TimedRotatingFileHandler(filename=file, when="midnight", interval=1, backupCount=30)
        handler.setLevel(level)
        #Error was here
        #handler.setFormatter(fmt=format)
        handler.setFormatter(fmt=formatter)
        logger.addHandler(handler)
    else:
        # Si queremos loggear a stdout y no hemos encontrado el handler root (o no lo queremos) crear un handler propio.
        if not handler_root:
            handler = logging.StreamHandler()
            handler.setLevel(level)
            # Error was here
            # handler.setFormatter(fmt=format)
            handler.setFormatter(fmt=formatter)
            logger.addHandler(handler)
    return logger

但是,脚本遵循的方式(根目录,自定义StreamHandler或Filehandler)无关紧要,无论我尝试输出哪个日志,这都是我在控制台/文件中得到的输出:

%(asctime)s %(levelname)-8s %(name)s [%(filename)s:%(lineno)d - %(funcName)2s()]    %(message)s

1 个答案:

答案 0 :(得分:0)

没关系,这是一个错字。

handler.setFormatter(fmt=format) 

应该已经:

handler.setFormatter(fmt=formatter)