Linuxカーネルlogレベルとprintk印刷メッセージ制御

7165 ワード

定義済みカーネルlogレベル

// include/linux/kern_levels.h

#define KERN_SOH    "\001"      /* ASCII Start Of Header */
#define KERN_SOH_ASCII  '\001'

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

#define KERN_DEFAULT    KERN_SOH "d"    /* the default kernel loglevel */

printk印刷メッセージ制御

// linux/include/printk.h

/* printk's without a loglevel use this.. */
#define MESSAGE_LOGLEVEL_DEFAULT CONFIG_MESSAGE_LOGLEVEL_DEFAULT

/* We show everything that is MORE important than this.. */
#define CONSOLE_LOGLEVEL_DEFAULT 7 
#define CONSOLE_LOGLEVEL_MIN     1 
#define CONSOLE_LOGLEVEL_DEFAULT 7 

-------------------------------------------------------------------------
// kernel/printk.c

int console_printk[4] = {
    CONSOLE_LOGLEVEL_DEFAULT,   /* console_loglevel */
    MESSAGE_LOGLEVEL_DEFAULT,   /* default_message_loglevel */
    CONSOLE_LOGLEVEL_MIN,       /* minimum_console_loglevel */
    CONSOLE_LOGLEVEL_DEFAULT,   /* default_console_loglevel */
};

-------------------------------------------------------------------------
// linux/include/printk.h

extern int console_printk[];

#define console_loglevel (console_printk[0])
#define default_message_loglevel (console_printk[1])
#define minimum_console_loglevel (console_printk[2])
#define default_console_loglevel (console_printk[3])
  • console_loglevel printk印刷メッセージのlog優先度がconsole_より高い場合のみloglevelの場合、端末に出力できる
  • default_message_loglevel printkメッセージ印刷時のデフォルトのlogレベル
  • minimum_console_loglevel console_loglevelが設定できる最小値
  • default_console_loglevel console_loglevelのデフォルト値
  • procfs制御printkによるメッセージの印刷


    1.現在のprintk印刷メッセージのlogレベルの表示

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

    「7 4 1 7」はそれぞれconsole_に対応loglevel、default_message_loglevel、minimum_c onsole_loglevel、default_console_loglevelは、KERN_より優先度が高いことを意味します.DEBUG(7)の印刷メッセージが端末に出力される

    2.console_を変更するloglevel

    # echo 8 4 1 7 > /proc/sys/kernel/printk

    「8 4 1 7」を入力してconsoleを変更します.loglevel値により、すべての印刷メッセージが端末に出力されます.

    3.procfsシリーズノード

    // kernel/sysctl.h
    
    static struct ctl_table kern_table[] = {
        ......
    #if defined CONFIG_PRINTK
        {
            .procname   = "printk",
            .data       = &console_loglevel,
            .maxlen     = 4*sizeof(int),
            .mode       = 0644,
            .proc_handler   = proc_dointvec,
        },
        {
            .procname   = "printk_ratelimit",
            .data       = &printk_ratelimit_state.interval,
            .maxlen     = sizeof(int),
            .mode       = 0644,
            .proc_handler   = proc_dointvec_jiffies,
        },
        {
            .procname   = "printk_ratelimit_burst",
            .data       = &printk_ratelimit_state.burst,
            .maxlen     = sizeof(int),
            .mode       = 0644,
            .proc_handler   = proc_dointvec,
        },
        {
            .procname   = "printk_delay",
            .data       = &printk_delay_msec,
            .maxlen     = sizeof(int),
            .mode       = 0644,
            .proc_handler   = proc_dointvec_minmax,
            .extra1     = &zero,
            .extra2     = &ten_thousand,
        },
        {
            .procname   = "printk_devkmsg",
            .data       = devkmsg_log_str,
            .maxlen     = DEVKMSG_STR_MAX_SIZE,
            .mode       = 0644,
            .proc_handler   = devkmsg_sysctl_set_loglvl,
        },
        {
            .procname   = "dmesg_restrict",
            .data       = &dmesg_restrict,
            .maxlen     = sizeof(int),
            .mode       = 0644,
            .proc_handler   = proc_dointvec_minmax_sysadmin,
            .extra1     = &zero,
            .extra2     = &one,
        },
        {
            .procname   = "kptr_restrict",
            .data       = &kptr_restrict,
            .maxlen     = sizeof(int),
            .mode       = 0644,
            .proc_handler   = proc_dointvec_minmax_sysadmin,
            .extra1     = &zero,
            .extra2     = &two,
        },
    #endif
    
        ......
    
        { }
    };