Linux內核log等級與printk打印消息控制


預定義的內核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

    ......

    { }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章