GNU/Linux >> Tutoriales Linux >  >> Linux

nivel de registro de printk y consola

printk() es para el núcleo lo que printf() es para el espacio de usuario. Las líneas escritas por printk() se pueden mostrar a través del comando dmesg. Según la importancia del mensaje que necesite imprimir, puede elegir entre ocho mensajes de nivel de registro, definidos en include/linux/kern_levels.h, junto con su significado.

La sintaxis de printk es:

printk ("log level" "message", <arguments>); 

La siguiente es una lista de los niveles de registro del kernel. Cada uno de estos niveles corresponde a un número en una cadena, cuya prioridad es inversamente proporcional al valor del número. Por ejemplo, 0 es de mayor prioridad:

#define KERN_EMERG "<0>" /* system is unusable*/
#define KERN_ALERT "<1>" /* action must be taken immediately*/
#define KERN_CRIT "<2>" /* critical conditions*/
#define KERN_ERR "<3>" /* error conditions*/
#define KERN_WARNING "<4>" /* warning conditions*/
#define KERN_NOTICE "<5>" /* normal but significant condition*/
#define KERN_INFO "<6>" /* informational*/
#define KERN_DEBUG "<7>" /* debug-level messages*/

Podemos ver que cada nivel de registro corresponde a un número y cuanto menor es el número mayor es la importancia del mensaje. Los niveles son útiles para decidir qué se debe mostrar al usuario en la consola y qué no.

Cada consola tiene un nivel de registro llamado nivel de registro de la consola y cualquier mensaje con un número de nivel de registro menor que el nivel de registro de la consola se muestra en la consola, y otros mensajes que tienen un número de nivel de registro mayor o igual al nivel de registro de la consola se registran en el registro del kernel que se puede consultar con el comando "dmesg".

El nivel de registro de la consola se puede encontrar en el archivo /proc/sys/kernel/printk.

$ cat /proc/sys/kernel/printk
4 4 1 7

El primer número en la salida es el nivel de registro de la consola, el segundo es el nivel de registro predeterminado, el tercero es el nivel de registro mínimo y el cuarto es el nivel de registro máximo.

El nivel de registro 4 corresponde a KERN_WARNING. Por lo tanto, todos los mensajes con niveles de registro 3,2,1 y 0 se mostrarán en la pantalla y se registrarán, y los mensajes con niveles de registro 4,5,6,7 solo se registrarán y se podrán ver usando "dmesg".

El nivel de registro de la consola se puede cambiar escribiendo en la entrada de proceso:

$ echo "6" > /proc/sys/kernel/printk
$ cat /proc/sys/kernel/printk
6 4 1 7

Ahora el nivel de registro de la consola está establecido en 6, que es KERN_INFO. Podemos probar el registro usando el siguiente módulo.

# vi hello.c:
#include<linux/kernel.h> 
#include<linux/module.h> 
#include<linux/init.h> 

static int hello_init(void) 
{
 printk(KERN_WARNING "Hello, world \n ");
 return 0; 
} 

static void hello_exit(void)
{
 printk(KERN_INFO "Goodbye, world \n"); 
}

module_init(hello_init);
module_exit(hello_exit);

El printk invocado en la función init usa KERN_WARNING que es el nivel de registro y menos de 6 que es el nivel de registro de la consola y por lo tanto debería verse en la pantalla.

El printk utilizado en la función de salida es KERN_INFO, que es el nivel de registro 6, igual que el nivel de registro de la consola y, por lo tanto, no debería estar visible en la pantalla.

Nota :Podemos probar el funcionamiento del código solo iniciando sesión en un modo de texto ya que ninguno de los mensajes se muestra en una terminal de GUI.

Makefile:

ifneq ($(KERNELRELEASE),) 
   obj-m := hello.o
else 

KERNELDIR ?= /lib/modules/$(shell uname -r)/build 

PWD := $(shell pwd)

default: 
 make -C $(KERNELDIR) M=$(PWD) modules  
clean:
 $(MAKE) -C $(KERNELDIR) M=$(PWD) clean
endif

Compilar e insertar:

$ make 
$ insmod hello.ko 
[5377.966743] Hello world

Podemos ver el hola mundo impreso en la pantalla.

$ rmmmod hello
$ dmesg| tail -2 
[5424.190552] Good bye world 

El mensaje de despedida del mundo se registra, pero no se imprime en la pantalla, pero se puede ver en los registros. Por lo tanto, usando printk y los niveles de registro de la consola, podemos controlar los mensajes del kernel visibles para el usuario.

Reflexiones finales

El kernel usa la función printk, que es muy similar sintácticamente a la llamada a la función printf de las bibliotecas estándar de C, con la adición de un nivel de registro opcional. Los formatos permitidos están documentados en el código fuente del núcleo en Documentación/printk-formats.txt.

Los niveles de registro disponibles en printk se presentan en la siguiente tabla:

Tipo Símbolo Descripción
Emergencia KERN_EMERG El sistema es inestable y está a punto de colapsar
Alerta KERN_ALERT Se necesita acción inmediata
Crítico KERN_CRIT Fallo crítico de software o hardware
Error KERN_ERR Condición de error
Advertencia KERN_ADVERTENCIA Nada grave, pero podría indicar un problema
Aviso KERN_NOTICE Nada grave, pero el usuario debe tomar nota
Información KERN_INFO Información del sistema
Depuración KERN_DEBUG Mensajes de depuración

Si no se especifica ningún nivel de registro, se utiliza el mensaje de registro predeterminado tal como se configuró en la configuración del kernel. De forma predeterminada, este es KERN_WARNING.


Linux
  1. ¿Cómo cambiar el nivel de registro de Cron?

  2. ¿Diferencia entre /var/log/messages, /var/log/syslog y /var/log/kern.log?

  3. Truncar y reducir archivos de registro en SQL Server

  4. CentOS / RHEL 6:Cómo cambiar el nivel de registro de SNMP

  5. Cerrar sesión de un usuario y eliminar la cuenta

Cómo cambiar el tipo y tamaño de fuente de la consola de Linux

Instalar y configurar Logrotate en CentOS 8

Cómo instalar y configurar el analizador de registros LightSquid

Instalar y revisar GoAccess Apache Log Analyzer [Guía]

Inicie sesión con una clave privada SSH en Linux y macOS

Obtener los caracteres  y â en la consola Linux PuTTY