GNU/Linux >> Belajar Linux >  >> Linux

printk dan tingkat log konsol

printk() adalah untuk kernel apa printf() adalah untuk userspace. Baris yang ditulis oleh printk() dapat ditampilkan melalui perintah dmesg. Bergantung pada seberapa penting pesan yang perlu Anda cetak, Anda dapat memilih di antara delapan pesan tingkat log, yang ditentukan dalam include/linux/kern_levels.h, beserta artinya.

Sintaks printk adalah:

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

Berikut ini adalah daftar level log kernel. Masing-masing level ini sesuai dengan angka dalam string, yang prioritasnya berbanding terbalik dengan nilai angka tersebut. Misalnya, 0 adalah prioritas yang lebih tinggi:

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

Kita dapat melihat setiap level log sesuai dengan angka dan semakin rendah angka semakin tinggi pentingnya pesan. Level berguna dalam memutuskan apa yang harus ditampilkan kepada pengguna di konsol dan apa yang tidak boleh ditampilkan.

Setiap konsol memiliki level log yang disebut level log konsol dan pesan apa pun dengan nomor level log lebih rendah dari level log konsol akan ditampilkan di konsol, dan pesan lain yang memiliki nomor level log lebih tinggi atau sama dengan level log konsol dicatat di log kernel yang dapat dilihat menggunakan perintah “dmesg”.

Level log konsol dapat ditemukan dengan melihat file /proc/sys/kernel/printk.

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

Angka pertama dalam output adalah level log konsol, yang kedua adalah level log default, yang ketiga adalah level log minimum dan yang keempat adalah level log maksimum.

Log level 4 sesuai dengan KERN_WARNING. Jadi semua pesan dengan log level 3,2,1 dan 0 akan ditampilkan di layar serta dicatat dan pesan dengan log level 4,5,6,7 hanya bisa dicatat dan dapat dilihat menggunakan “dmesg”.

Level log konsol dapat diubah dengan menulis ke entri proc:

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

Sekarang level log konsol diatur ke 6, yaitu KERN_INFO. Kita dapat menguji logging dengan menggunakan modul berikut.

# 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 yang dipanggil dalam fungsi init menggunakan KERN_WARNING yang merupakan level log dan kurang dari 6 yang merupakan level log konsol dan karenanya harus terlihat di layar.

Printk yang digunakan dalam fungsi keluar adalah KERN_INFO yang merupakan log level 6, sama dengan level log konsol, dan karenanya tidak boleh terlihat di layar.

Catatan :Kami dapat menguji operasi kode hanya dengan masuk ke mode teks karena tidak ada pesan yang ditampilkan di terminal 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

Kompilasi dan masukkan:

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

Kita bisa melihat hello world tercetak di layar.

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

Pesan selamat tinggal dunia dicatat tetapi tidak dicetak di layar tetapi dapat dilihat di log. Jadi dengan menggunakan printk dan level log konsol, kita dapat mengontrol pesan kernel yang terlihat oleh pengguna.

Pemikiran Akhir

Kernel menggunakan fungsi printk, yang secara sintaksis sangat mirip dengan pemanggilan fungsi printf dari pustaka C standar, dengan tambahan level log opsional. Format yang diizinkan didokumentasikan dalam sumber kernel di bawah Documentation/printk-formats.txt.

Level log yang tersedia di printk disajikan dalam tabel berikut:

Jenis Simbol Deskripsi
Darurat KERN_EMERG Sistem tidak stabil dan akan mogok
Peringatan KERN_ALERT Diperlukan tindakan segera
Kritis KERN_CRIT Kegagalan perangkat lunak atau perangkat keras kritis
Kesalahan KERN_ERR Kondisi kesalahan
Peringatan KERN_WARNING Tidak ada yang serius, tapi mungkin mengindikasikan masalah
Pemberitahuan KERN_NOTICE Tidak ada yang serius, tetapi pengguna harus memperhatikan
Informasi KERN_INFO Informasi sistem
Debug KERN_DEBUG Pesan debug

Jika tidak ada level log yang ditentukan, pesan log default yang dikonfigurasi dalam konfigurasi kernel akan digunakan. Secara default, ini adalah KERN_WARNING.


Linux
  1. Mengubah Tata Letak/pemetaan Keyboard Pada Konsol (tty) Dan X Dengan Cara Agnostik X/konsol?

  2. Perbedaan Antara /var/log/messages, /var/log/syslog, Dan /var/log/kern.log?

  3. Memotong dan mengecilkan file log di SQL Server

  1. Bagaimana Cara Mengubah Level Log Cron?

  2. CentOS / RHEL 6:Cara mengubah level log SNMP

  3. Logout pengguna dan hapus akun

  1. Tingkatkan riwayat cangkang Anda dengan Loki dan fzf

  2. Linux menambahkan output konsol ke file log?

  3. Cara memperbesar dan memperkecil konsol terminal di linux