Actualmente estoy trabajando en la versión 1.0.0 del módulo pyftpdlib. Esta nueva versión introducirá algunos cambios incompatibles hacia atrás en que ciertas API ya no aceptarán bytes sino unicode. Mientras estoy en ello, como parte de esta brecha, estaba contemplando la posibilidad de deshacerme de mis funciones de registro, que actualmente usan la declaración de impresión , y usar el módulo de registro en su lugar.Ventajas de registrar frente a impresión() + mejores prácticas de registro
A partir de ahora pyftpdlib delegados de la tala de 3 funciones:
def log(s):
"""Log messages intended for the end user."""
print s
def logline(s):
"""Log commands and responses passing through the command channel."""
print s
def logerror(s):
"""Log traceback outputs occurring in case of errors."""
print >> sys.stderr, s
El usuario dispuesto a personalizar los registros (por ejemplo, escribir en un archivo) se supone que simplemente sobrescribir estas 3 funciones como en:
>>> from pyftpdlib import ftpserver
>>>
>>> def log2file(s):
... open('ftpd.log', 'a').write(s)
...
>>> ftpserver.log = ftpserver.logline = ftpserver.logerror = log2file
Ahora me pregunto: ¿qué ventajas implicaría deshacerse de este enfoque y utilizar el módulo de registro en su lugar? Desde la perspectiva de un proveedor de módulos, ¿cómo exactamente se supone que debo exponer las funcionalidades de registro en mi módulo? supone que tengo que hacer esto:
import logging
logger = logging.getLogger("pyftpdlib")
... y el estado en mi doc que "registrador" es el objetivo que se supone que se utilizará en caso de que el usuario desea personalizar cómo se comportan los registros? ¿Es legítimo para establecer deliberadamente una salida de formato predefinido como en:
FORMAT = '[%(asctime)] %(message)s'
logging.basicConfig(format=FORMAT)
logger = logging.getLogger('pyftpdlib')
...?
¿Puede pensar en un módulo de terceros que pueda tomar indicaciones desde donde la funcionalidad de registro está expuesta y consolidada como parte de la API pública?
Gracias de antemano.
¿Eso significa que no se producirá ninguna salida por defecto? En ese caso, no estoy contento con eso. –
Esto no producirá ninguna salida por defecto. Además, 'logging.NullHandler' solo está disponible en Python 2.7 (y> 3.2 creo), lo que puede ser un problema. Si solo usa 'logger = logging.getLogger ('pyftpdlib')' obtendrá mensajes de manera predeterminada y puede simplemente señalar a sus usuarios a la documentación 'logging.setLevel' y' logging.setFormatter' para demostrar cómo configurar la salida mensajes para tu biblioteca. Además, puede usar la configuración de archivo ['logging.config.fileConfig'] (http://docs.python.org/dev/library/logging.config.html#logging.config.fileConfig) para permitir a los usuarios configurar el logger – Chris
Además, para responder a una de sus preguntas originales, los beneficios de usar registros en lugar de imprimir declaraciones se mencionan brevemente en [PEP 282] (http://www.python.org/dev/peps/pep-0282/): * Si un mecanismo de registro único está consagrado en la biblioteca estándar, 1) es más probable que se realice el registro 'bien', y 2) múltiples bibliotecas podrán integrarse en aplicaciones más grandes que se pueden registrar de forma razonablemente coherente. * – Chris