SYSLOG - Linux手册页
Linux程序员手册 第2部分
更新日期: 2020-08-13
名称
syslog,klogctl-读取和/或清除内核消息环形缓冲区;设置console_loglevel
语法
int syslog(int type, char *bufp, int len); /* No wrapper provided in glibc */ /* The glibc interface */ #include <sys/klog.h> int klogctl(int type, char *bufp, int len);
说明
注意:可能您正在寻找C库函数syslog(),该函数与syslogd(8)对话;有关详细信息,请参见syslog(3)。
本页描述了内核syslog()系统调用,该调用用于控制内核printk()缓冲区。系统调用的glibc包装器函数称为klogctl()。
The kernel log buffer
内核具有一个长度为LOG_BUF_LEN的循环缓冲区,该缓冲区中存储有作为内核函数printk()的参数给出的消息(无论其日志级别如何)。在早期内核中,LOG_BUF_LEN的值为4096;从内核1.3.54开始,为8192;从2.1.113内核开始是16384;从内核2.4.23 / 2.6开始,该值是内核配置选项(CONFIG_LOG_BUF_SHIFT,默认值取决于体系结构)。从Linux 2.6.6开始,可以使用命令类型10查询大小(请参见下文)。
Commands
类型参数确定此函数采取的操作。下面的列表指定类型的值。这些符号名称是在内核源代码中定义的,但是不会导出到用户空间。您将需要使用数字或自己定义名称。
- SYSLOG_ACTION_CLOSE(0)
- 关闭日志。目前是NOP。
- SYSLOG_ACTION_OPEN(1)
- 打开日志。目前是NOP。
- SYSLOG_ACTION_READ(2)
- 从日志中读取。调用将一直等待直到内核日志缓冲区为非空,然后最多将len个字节读入bufp指向的缓冲区。该调用返回读取的字节数。从日志读取的字节从日志缓冲区中消失:该信息只能读取一次。当用户程序读取/ proc / kmsg时,这是内核执行的功能。
- SYSLOG_ACTION_READ_ALL(3)
- 读取保留在环形缓冲区中的所有消息,并将其放入bufp指向的缓冲区中。该调用从日志缓冲区中读取最后len个字节(非破坏性地),但读取的内容不会超过自上一个" clear ring buffer"命令(请参阅下面的命令5)以来写入缓冲区的内容。该调用返回读取的字节数。
- SYSLOG_ACTION_READ_CLEAR(4)
- 读取并清除环形缓冲区中剩余的所有消息。该调用与类型3的调用完全相同,但也执行"清除环形缓冲区"命令。
- SYSLOG_ACTION_CLEAR(5)
- 该调用仅执行"清除环形缓冲区"命令。 bufp和len参数将被忽略。
- 该命令并没有真正清除环形缓冲区。而是设置一个内核簿记变量,该变量确定命令3(SYSLOG_ACTION_READ_ALL)和命令4(SYSLOG_ACTION_READ_CLEAR)返回的结果。该命令对命令2(SYSLOG_ACTION_READ)和9(SYSLOG_ACTION_SIZE_UNREAD)没有影响。
- SYSLOG_ACTION_CONSOLE_OFF(6)
- 该命令保存console_loglevel的当前值,然后将console_loglevel设置为minimum_console_loglevel,这样就不会将任何消息打印到控制台。在Linux 2.6.32之前的版本,该命令仅将console_loglevel设置为minimum_console_loglevel。请参阅下面对/ proc / sys / kernel / printk的讨论。
- bufp和len参数将被忽略。
- SYSLOG_ACTION_CONSOLE_ON(7)
- 如果已执行先前的SYSLOG_ACTION_CONSOLE_OFF命令,则此命令会将console_loglevel还原为该命令保存的值。在Linux 2.6.32之前,此命令仅将console_loglevel设置为default_console_loglevel。请参阅下面对/ proc / sys / kernel / printk的讨论。
- bufp和len参数将被忽略。
- SYSLOG_ACTION_CONSOLE_LEVEL(8)
- 该调用将console_loglevel设置为len中给出的值,该值必须是1到8(含)之间的整数。内核默默地为len强制执行minimum_console_loglevel的最小值。有关详细信息,请参见日志级别部分。 bufp参数将被忽略。
- SYSLOG_ACTION_SIZE_UNREAD(9) (since Linux 2.4.10)
- 该调用返回当前可通过命令2(SYSLOG_ACTION_READ)从内核日志缓冲区读取的字节数。 bufp和len参数将被忽略。
- SYSLOG_ACTION_SIZE_BUFFER(10) (since Linux 2.6.6)
- 此命令返回内核日志缓冲区的总大小。 bufp和len参数将被忽略。
除3和10以外的所有命令都需要特权。在2.6.37之前的Linux内核中,命令类型3和10允许无特权的进程使用。从Linux 2.6.37开始,仅当/ proc / sys / kernel / dmesg_restrict的值为0时,才允许将这些命令用于非特权进程。在Linux 2.6.37之前,"特权"表示调用方具有CAP_SYS_ADMIN功能。从Linux 2.6.37开始,"特权"意味着调用者具有CAP_SYS_ADMIN功能(现在已不推荐使用)或(新的)CAP_SYSLOG功能。
/proc/sys/kernel/printk
/ proc / sys / kernel / printk是一个可写文件,其中包含四个整数值,这些值会在打印或记录错误消息时影响内核printk()的行为。这四个值是:
- console_loglevel
- 仅日志级别低于此值的消息将被打印到控制台。此字段的默认值是DEFAULT_CONSOLE_LOGLEVEL(7),但是如果内核命令行包含单词" quiet",则将其设置为4;如果内核命令行包含单词" debug",则将其设置为10;如果出现a,则将其设置为15。内核故障(10和15只是愚蠢的,相当于8)。可以通过类型为8的syslog()调用将console_loglevel的值设置为1-8之间的值。
- default_message_loglevel
- 该值将用作没有显式级别的printk()消息的日志级别。在Linux 2.6.38(含)之前,此字段的硬编码默认值为4(KERN_WARNING);从Linux 2.6.39开始,默认值由内核配置选项CONFIG_DEFAULT_MESSAGE_LOGLEVEL定义,默认值为4。
- minimum_console_loglevel
- 此字段中的值是可以设置console_loglevel的最小值。
- default_console_loglevel
- 这是console_loglevel的默认值。
The log level
每个printk()消息都有其自己的日志级别。如果日志级别未明确指定为消息的一部分,则默认为default_message_loglevel。日志级别的常规含义如下:
Kernel constant | Level value | Meaning |
KERN_EMERG | 0 | System is unusable |
KERN_ALERT | 1 | Action must be taken immediately |
KERN_CRIT | 2 | Critical conditions |
KERN_ERR | 3 | Error conditions |
KERN_WARNING | 4 | Warning conditions |
KERN_NOTICE | 5 | Normal but significant condition |
KERN_INFO | 6 | Informational |
KERN_DEBUG | 7 | Debug-level messages |
内核printk()例程仅在其日志级别小于console_loglevel的值时,才会在控制台上打印消息。
返回值
对于等于2、3或4的类型,成功调用syslog()会返回读取的字节数。对于类型9,syslog()返回当前可在内核日志缓冲区上读取的字节数。对于类型10,syslog()返回内核日志缓冲区的总大小。对于其他类型的值,成功返回0。
如果发生错误,则返回-1,并且将errno设置为指示错误。
错误说明
- EINVAL
- 错误的参数(例如,错误的类型;或者对于类型2、3或4,buf为NULL,或者len小于零;或者对于类型8,级别超出1到8的范围)。
- ENOSYS
- 该syslog()系统调用不可用,因为在禁用CONFIG_PRINTK内核配置选项的情况下编译了内核。
- EPERM
- 试图通过没有足够特权(更准确地说:没有CAP_SYS_ADMIN或CAP_SYSLOG功能)的进程来更改console_loglevel或清除内核消息环缓冲区。
- ERESTARTSYS
- 系统调用被信号中断;什么都没读。 (这只能在跟踪期间看到。)
遵循规范
此系统调用是特定于Linux的,不应在旨在可移植的程序中使用。
备注
人们从一开始就注意到,不幸的是,同名的系统调用和库例程完全是不同的动物。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。