GNU/Linux >> Tutoriels Linux >  >> Linux

printk et niveau de journalisation de la console

printk() est au noyau ce que printf() est à l'espace utilisateur. Les lignes écrites par printk() peuvent être affichées via la commande dmesg. Selon l'importance du message que vous devez imprimer, vous pouvez choisir entre huit messages de niveau journal, définis dans include/linux/kern_levels.h, ainsi que leur signification.

La syntaxe de printk est :

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

Voici une liste des niveaux de journalisation du noyau. Chacun de ces niveaux correspond à un nombre dans une chaîne, dont la priorité est inversement proportionnelle à la valeur du nombre. Par exemple, 0 correspond à la priorité la plus élevée :

#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*/

Nous pouvons voir que chaque niveau de journalisation correspond à un nombre et plus le nombre est faible, plus l'importance du message est élevée. Les niveaux sont utiles pour décider ce qui doit être affiché à l'utilisateur sur la console et ce qui ne doit pas l'être.

Chaque console a un niveau de journal appelé niveau de journal de la console et tout message avec un numéro de niveau de journal inférieur au niveau de journal de la console s'affiche sur la console, et les autres messages qui ont un numéro de niveau de journal supérieur ou égal au niveau de journal de la console sont enregistrés dans le journal du noyau qui peut être consulté à l'aide de la commande "dmesg".

Le niveau de journalisation de la console peut être trouvé en consultant le fichier /proc/sys/kernel/printk.

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

Le premier nombre dans la sortie est le niveau de journalisation de la console, le second est le niveau de journalisation par défaut, le troisième est le niveau de journalisation minimum et le quatrième est le niveau de journalisation maximum.

Le niveau de journalisation 4 correspond à KERN_WARNING. Ainsi, tous les messages avec les niveaux de journalisation 3, 2, 1 et 0 seront affichés à l'écran ainsi que journalisés et les messages avec les niveaux de journalisation 4, 5, 6, 7 seront uniquement journalisés et pourront être visualisés à l'aide de "dmesg".

Le niveau de journalisation de la console peut être modifié en écrivant dans l'entrée proc :

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

Maintenant, le niveau de journalisation de la console est défini sur 6, qui est KERN_INFO. Nous pouvons tester la journalisation en utilisant le module suivant.

# 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);

Le printk appelé dans la fonction init utilise KERN_WARNING qui est le niveau de journalisation et inférieur à 6 qui est le niveau de journalisation de la console et doit donc être vu à l'écran.

Le printk utilisé dans la fonction de sortie est KERN_INFO qui est le niveau de journalisation 6, identique au niveau de journalisation de la console, et ne devrait donc pas être visible à l'écran.

Remarque :On ne peut tester le fonctionnement du code qu'en se connectant en mode texte car aucun des messages ne s'affiche sur un terminal d'interface graphique.

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

Compiler et insérer :

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

Nous pouvons voir le hello world s'imprimer sur l'écran.

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

Le message d'adieu au monde est enregistré mais n'est pas imprimé à l'écran mais peut être vu dans les journaux. Ainsi, en utilisant printk et les niveaux de journalisation de la console, nous pouvons contrôler les messages du noyau visibles pour l'utilisateur.

Réflexions finales

Le noyau utilise la fonction printk , qui est très similaire syntaxiquement à l'appel de fonction printf des bibliothèques C standard, avec l'ajout d'un niveau de journalisation facultatif. Les formats autorisés sont documentés dans les sources du noyau sous Documentation/printk-formats.txt.

Les niveaux de journalisation disponibles dans printk sont présentés dans le tableau suivant :

Type Symbole Description
Urgence KERN_EMERG Le système est instable et sur le point de planter
Alerte KERN_ALERT Une action immédiate est nécessaire
Critique KERN_CRIT Défaillance logicielle ou matérielle critique
Erreur KERN_ERR Condition d'erreur
Avertissement KERN_WARNING Rien de grave, mais pourrait indiquer un problème
Avis KERN_NOTICE Rien de grave, mais l'utilisateur doit en prendre note
Informations KERN_INFO Informations système
Débogage KERN_DEBUG Messages de débogage

Si aucun niveau de journal n'est spécifié, le message de journal par défaut tel que configuré dans la configuration du noyau est utilisé. Par défaut, il s'agit de KERN_WARNING.


Linux
  1. Changer la disposition/le mappage du clavier sur la console (tty) et X d'une manière indépendante de X/console ?

  2. Comment changer le niveau de journalisation Cron ?

  3. Différence entre /var/log/messages, /var/log/syslog et /var/log/kern.log ?

  4. CentOS / RHEL 6 :Comment changer le niveau de log SNMP

  5. Linux ajoute la sortie de la console à un fichier journal ?

Comment changer le type et la taille de la police de la console Linux

Installer et configurer Logrotate sur CentOS 8

Comment installer et configurer l'analyseur de journaux LightSquid

Installer et réviser GoAccess Apache Log Analyzer [Guide]

Connectez-vous avec une clé privée SSH sous Linux et macOS

Obtenir les caractères  et â dans la console Linux PuTTY