SYSLOG - Linux手册页

时间:2019-08-20 18:00:45  来源:igfitidea点击:

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允许用于非特权进程;请参阅第3章。从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 constantLevel valueMeaning
KERN_EMERG0System is unusable
KERN_ALERT1Action must be taken immediately
KERN_CRIT2Critical conditions
KERN_ERR3Error conditions
KERN_WARNING4Warning conditions
KERN_NOTICE5Normal but significant condition
KERN_INFO6Informational
KERN_DEBUG7Debug-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的,不应在旨在可移植的程序中使用。

备注

人们从一开始就注意到,不幸的是,同名的系统调用和库例程完全是不同的动物。

另外参见

dmesg(1),syslog(3),功能(7)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/