1. Concepto de registro
El registro se utiliza para registrar la información cuando el sistema está funcionando, y el registro de un evento también se denomina Registro.
2. Función de registro
- depurador
- Comprender la situación de ejecución del programa del sistema, si es normal
- Análisis de fallas en la operación del programa del sistema y ubicación del problema
- Se utiliza para el análisis del comportamiento del usuario y las estadísticas de datos.
3. Nivel de registro
Nivel de registro: se refiere a la prioridad, importancia o gravedad de la información de registro
Niveles de registro comunes | describir |
DEPURAR | Nivel de depuración, imprime información de registro muy detallada, generalmente utilizada para la depuración de código |
INFORMACIÓN |
Nivel de información, imprime información de registro general, resalta el proceso en ejecución del programa |
ADVERTENCIA | Nivel de advertencia, información de registro de advertencia de impresión, que indica que habrá errores potenciales, generalmente no afecta el uso normal del software |
ERROR | Nivel de error, información de excepción de error de impresión, los errores de este nivel pueden causar que algunas funciones del sistema no se puedan usar normalmente |
CRÍTICO | Nivel de error grave, un error grave, que indica que es posible que el sistema no siga funcionando |
ilustrar:
El nivel de registro en la lista anterior aumenta de arriba a abajo, a saber: DEPURACIÓN < INFO < ADVERTENCIA < ERROR < CRÍTICO;
Cuando se especifica un nivel de registro para el programa, el programa registrará toda la información de registro cuyo nivel de registro sea mayor o igual que el nivel de registro especificado, en lugar de registrar solo la información de registro del nivel especificado;
En general, se recomienda usar solo los cuatro niveles de DEPURACIÓN, INFO, ADVERTENCIA y ERROR.
4. Uso básico de registros
import logging # 导入日志依赖包
logging.debug("这是一条调试信息")
logging.info("这是一条普通信息")
logging.warning("这是一条警告信息")
logging.error("这是一条错误信息")
logging.critical("这是一条严重错误信息")
(1) Establecer el nivel de registro
logging.basicConfig(level=logging.DEBUG)
level可选:
logging.DEBUG
logging.INFO
logging.WARNING
logging.ERROR
logging.CRITICAL
Nota: El nivel de registro predeterminado en el registro es ADVERTENCIA. Solo se pueden generar registros mayores o iguales a este nivel en el programa, y los registros menores a este nivel no se imprimirán.
(2) Establecer el formato de registro
El formato de registro predeterminado es: nivel de registro: Nombre del registrador: contenido del registro
Formato de registro personalizado:
logging.basicConfig(format="格式化信息")
常用的格式化信息
format = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'
Información de formato que puede ser utilizada por el parámetro de formato:
Marcador de posición | describir |
%(nombre)s |
nombre del registrador |
%(nº de nivel)s | nivel de registro en forma numérica |
%(nombre de nivel)s | nivel de registro como texto |
%(nombre de ruta)s | El nombre de ruta completo del módulo que llamó a la función de salida de registro, posiblemente sin |
%(nombre de archivo)s | El nombre de archivo del módulo que llamó a la función de salida de registro |
%(módulo)s | El nombre del módulo que llama a la función de salida de registro. |
%(nombre de función)s | El nombre de la función que llama a la función de salida de registro. |
% (lino) d | La línea de código donde se encuentra la declaración que llama a la función de salida de registro. |
%(creado)f | La hora actual, representada por un número de coma flotante estándar de UNIX que representa la hora |
%(relativocreado)d | Al generar información de registro, la cantidad de milisegundos desde que se creó el registrador |
%(tiempo asc)s | La hora actual como una cadena. El formato predeterminado es "2003-07-08 16:49:45,896" |
%(subproceso)d | identificador de hilo Tal vez no |
%(nombre del subproceso)s | nombre del hilo Tal vez no |
%(proceso)d | identificacion de proceso. Tal vez no |
%(mensaje)s | mensaje de salida del usuario |
(3) Información de registro de salida a un archivo
De forma predeterminada, el módulo de registro de Python imprime registros en la salida estándar (consola).
Salida de información de registro a un archivo:
logging.basicConfig(filename="输出的文件名.log")
Uso avanzado de registros
1. Cuatro componentes principales del módulo de registro
Nombre del componente | nombre de la clase | Descripcion funcional |
registrador | Registrador | Proporciona la entrada del registro de uso del programa |
procesador | Manipulador | Enviar registros de registro creados por el registrador a la salida de destino adecuada |
formateador | formateador | Determina el formato de salida final del registro. |
filtrar | Filtrar | Proporciona herramientas de control más detalladas para decidir qué registros generar y qué registros descartar. |
2. La relación entre componentes
Registrador: proporciona una entrada para registrar registros, como: log.info("")
Procesador: es el procesador que realmente envía el contenido del registrador a la consola o a un archivo o red; cada registrador se puede agregar Múltiples procesadores
Formateador: el procesador puede configurar diferentes formatos, necesita usar el formateador
Filtro: el procesador necesita filtrar la información de registro, necesita configurar el filtro
3. Clase de registrador
Las tareas del objeto de la clase Logger:
- Exponer métodos de registro a programas
- Según el nivel de registro o el objeto de filtro para decidir qué registros hacer un seguimiento
- Entregar mensajes de registro a todos los controladores de registro interesados
Cómo crear un objeto de clase Logger:
logger = logging.getLogger()
或者
logger = logging.getLogger(name)
El método logging.getLogger() tiene un nombre de parámetro opcional, que indica el nombre del registrador que se devolverá. Si no se proporciona este parámetro, se devolverá el objeto registrador raíz. Si se llama al método getLogger() varias veces con el mismo valor de parámetro de nombre, se devolverá una referencia al mismo objeto registrador.
Métodos comúnmente utilizados de Logger:
método | describir |
registrador.depurar() registrador.info() registrador.advertencia() registrador.error() registrador.crítico() |
registro de impresión |
registrador.setLevel() | Establece el nivel de gravedad mínimo de los mensajes de registro que procesará el registrador |
registrador.addHandler() | Agregue un objeto controlador al objeto registrador |
registrador.addFilter() | Agregar un objeto de filtro al objeto registrador |
4. Clase de controlador
Función: La función del objeto Handler es distribuir el mensaje a la ubicación especificada por el controlador, como: consola, archivo, red, correo, etc. El objeto Logger puede agregar múltiples objetos de controlador por sí mismo a través del método addHandler().
Cómo crear un objeto de clase Handler:
Manipulador | describir |
registro.StreamHandler | Envíe mensajes de registro a la salida de Stream, como std.out, std.err o cualquier objeto similar a un archivo |
logging.FileHandler | Envíe mensajes de registro a un archivo de disco, que crece infinitamente en tamaño de forma predeterminada |
logging.handlers.RotatingFileHandler | Envíe mensajes de registro a archivos de disco y admita que los archivos de registro se corten por tamaño |
logging.hanlders.TimedRotatingFileHandler | Envíe mensajes de registro a archivos de disco y admita que los archivos de registro se corten por tiempo |
logging.handlers.HTTPHandler | Enviar mensajes de registro a un servidor HTTP como GET o POST |
logging.handlers.SMTPHandler | Enviar mensajes de registro a una dirección de correo electrónico específica |
Métodos comúnmente utilizados de Handler:
método | describir |
controlador.setLevel() | 设置handler将会处理的日志消息的最低严重级别 |
handler.setFormatter() | 为handler设置一个格式器对象 |
handler.addFilter() | 为handler添加一个过滤器对象 |
5、Formatter类
作用:Formatter对象用于配置日志信息的格式。
如何创建Formatter类对象:
formatter = logging.Formatter(fmt=None, datefmt=None, style='%')
fmt:指定消息格式化字符串,如果不指定该参数则默认使用message的原始值
datefmt:指定日期格式字符串,如果不指定该参数则默认使用"%Y-%m-%d %H:%M:%S"
style:Python 3.2新增的参数,可取值为 '%', '{'和 '$',如果不指定该参数则默认使用'%'
6、日志高级用法综合案例分析
目标:将日志信息同时输出到控制台和文件中
import logging.handlers # 导入此包才能使用handler类创建对象
# 获取logger
logger = logging.getLogger()
# 设置级别
logger.setLevel(logging.INFO)
# 获取控制台 处理器
sh = logging.StreamHandler()
# 根据时间切割文件 处理器
th = logging.handlers.TimedRotatingFileHandler(filename="文件名.log",
when="S",
interval=1,
backupCount=3,
encoding="utf-8")
# 添加格式器
fmt = "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d] - %(message)s"
fm = logging.Formatter(fmt)
# 将格式器 添加到处理器中
sh.setFormatter(fm)
th.setFormatter(fm)
# 将 控制台处理器添加到 logger
logger.addHandler(sh)
logger.addHandler(th)
# 打印信息
logger.info("info")
logger.debug("debug")
logger.error("error")
logger.warning("warning")
logging.handlers.TimedRotatingFileHandler()参数说明:
filename:文件名
when:间间隔的类型可选S(秒)、M(分钟)、H(小时)、D(天)、midnight(一夜)、W{0-6}(周几)
interval: 时间间隔
backupCount:能留几个日志文件,超过数量就会丢弃掉老的日志文件