[pyar] error de encoding al loguear con parametros

Javier Marcon javiermarcon en gmail.com
Mie Oct 22 23:38:33 ART 2014


Hola, yo tengo una función (*1) que loguea en un archivo todos los
mensajes que le mando, pudiendo dividir el mensaje en varios parámetros
(*2), especificándole el nivel y funciona correctamente la mayoría de
las veces. El tema es que a veces da un error de que no puede
decodificar un carácter del mensaje (*3) y por eso hice una función
llamada codificar que hace un str(valor).decode() si el parámetro hereda
de basestring. El tema es que con el método modificado para que me use
esa función (*4), al querer hacerlo me tira otro error (*5). Como puedo
hacer para que me ejecute la funcion en cada parámetro que recibe en
*pargs ?

Gracias,

Javier.

(*1):
import logging
    def mensaje(self, nivel, *pargs, **kwargs):
        try:
            getattr(logging, nivel)(extra=
                    {'data': self.data}, *pargs, **kwargs)
        except AttributeError:
            print "no existe el nivel '%s' para loguear" % nivel
            self.__class__.logger.error(extra={'data': self.data},
                                    *pargs, **kwargs)


(*2):

la = Loguear("primer lista")
la.mensaje("info","linea a loguear")
la.mensaje("warn","El %s %s en un %s", "perro", "caminaba", "la corniza")
lb = Loguear("segunda lista")
lb.mensaje("debug","linea a loguear.")
lb.mensaje("warn","El %s %s en un %s", "gato", "maullaba", "solo grito")


(*3):
Traceback (most recent call last):
  File "C:\Python27\lib\logging\__init__.py", line 874, in emit
    stream.write(fs % msg.encode("UTF-8"))
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xf3 in position 316:
invalid continuation byte
Logged from file loguear.py, line 24

(*4):
import logging
def mensaje(self, nivel, *pargs, **kwargs):
        try:
            argum = []
            for arg in pargs:
                argum.append(codificar(arg))
           
            getattr(logging, nivel)(extra=
                    {'data': self.data}, argum, **kwargs)
        except AttributeError:
            print "no existe el nivel '%s' para loguear" % nivel
            logging.error(extra={'data': self.data},
                                    *pargs, **kwargs)


(*5):
  File "C:\Users\Administrador\proyecto\loguear.py", line 29
    {'data': self.data}, argum, **kwargs)
SyntaxError: non-keyword arg after keyword arg



More information about the pyar mailing list