GNU/Linux >> Znalost Linux >  >> Linux

úroveň protokolu printk a konzoly

printk() je pro jádro totéž, co printf() pro uživatelský prostor. Řádky zapsané pomocí printk() lze zobrazit pomocí příkazu dmesg. V závislosti na tom, jak důležitá je zpráva, kterou potřebujete vytisknout, si můžete vybrat mezi osmi zprávami na úrovni protokolu, definovanými v include/linux/kern_levels.h, spolu s jejich významem.

Syntaxe printk je:

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

Následuje seznam úrovní protokolu jádra. Každá z těchto úrovní odpovídá číslu v řetězci, jehož priorita je nepřímo úměrná hodnotě čísla. Například 0 má vyšší prioritu:

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

Vidíme, že každá úroveň protokolu odpovídá číslu a čím nižší číslo, tím vyšší je důležitost zprávy. Úrovně jsou užitečné při rozhodování, co by se mělo uživateli na konzoli zobrazovat a co ne.

Každá konzola má úroveň protokolu nazývanou úroveň protokolu konzoly a na konzoli se zobrazí jakákoli zpráva s číslem úrovně protokolu nižším, než je úroveň protokolu konzoly, a zaznamenají se další zprávy, které mají číslo úrovně protokolu vyšší nebo rovné úrovni protokolu konzoly. v protokolu jádra, do kterého lze nahlédnout pomocí příkazu „dmesg“.

Úroveň protokolu konzoly lze nalézt v souboru /proc/sys/kernel/printk.

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

První číslo ve výstupu je úroveň protokolu konzoly, druhé je výchozí úroveň protokolu, třetí je minimální úroveň protokolu a čtvrté je maximální úroveň protokolu.

Úroveň protokolu 4 odpovídá KERN_WARNING. Všechny zprávy s úrovněmi protokolu 3, 2, 1 a 0 se tedy zobrazí na obrazovce a také se zaprotokolují a zprávy s úrovněmi protokolu 4, 5, 6, 7 se pouze zaprotokolují a lze je zobrazit pomocí „dmesg“.

Úroveň protokolu konzoly lze změnit zápisem do položky proc:

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

Nyní je úroveň protokolu konzoly nastavena na 6, což je KERN_INFO. Logování můžeme otestovat pomocí následujícího modulu.

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

Printk volaná ve funkci init používá KERN_WARNING, což je úroveň protokolu a menší než 6, což je úroveň protokolu konzoly, a proto by měl být vidět na obrazovce.

Printk použitý ve funkci exit je KERN_INFO, což je úroveň protokolu 6, stejná jako úroveň protokolu konzoly, a proto by neměl být viditelný na obrazovce.

Poznámka :Činnost kódu můžeme otestovat pouze přihlášením do textového režimu, protože žádná ze zpráv se nezobrazuje na terminálu 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

Kompilace a vložení:

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

Můžeme vidět, jak se na obrazovce tiskne ahoj svět.

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

Zpráva Good bye world se zaznamená, ale nevytiskne se na obrazovce, ale lze ji vidět v protokolech. Takže pomocí printk a úrovní logování konzoly můžeme ovládat zprávy jádra viditelné pro uživatele.

Poslední myšlenky

Jádro používá funkci printk, která je syntakticky velmi podobná volání funkce printf ze standardních knihoven C, s přidáním volitelné úrovně protokolu. Povolené formáty jsou zdokumentovány ve zdrojovém kódu jádra pod Documentation/printk-formats.txt.

Dostupné úrovně protokolů v printk jsou uvedeny v následující tabulce:

Typ Symbol Popis
Nouzový stav KERN_EMERG Systém je nestabilní a hrozí jeho selhání
Upozornění KERN_ALERT Je nutná okamžitá akce
Kritické KERN_CRIT Kritické selhání softwaru nebo hardwaru
Chyba KERN_ERR Chybový stav
Upozornění KERN_WARNING Nic vážného, ​​ale může to znamenat problém
Upozornění KERN_NOTICE Nic vážného, ​​ale uživatel by to měl vzít na vědomí
Informace KERN_INFO Informace o systému
Ladění KERN_DEBUG Ladění zpráv

Pokud není zadána žádná úroveň protokolu, použije se výchozí zpráva protokolu nakonfigurovaná v konfiguraci jádra. Ve výchozím nastavení je to KERN_WARNING.


Linux
  1. Zkraťte a zmenšete soubory protokolu na serveru SQL Server

  2. CentOS / RHEL 6 :Jak změnit úroveň protokolu SNMP

  3. Jak přiblížit a oddálit terminálovou konzoli v linuxu

  1. Změna rozložení/mapování klávesnice na konzole (tty) i na X agnostickým způsobem X/konzole?

  2. Jak změnit úroveň protokolu Cron?

  3. Rozdíl mezi /var/log/messages, /var/log/syslog a /var/log/kern.log?

  1. Zvyšte úroveň své historie shellu s Loki a fzf

  2. Linux připojit výstup konzoly k souboru protokolu?

  3. Odhlaste uživatele a smažte účet