syslog() - Unix、Linux 系统调用
广告
名称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);
|
描述如果您需要 libc 函数 syslog()(它与 syslogd(8) 通信),请参阅 syslog(3)。此名称的系统调用与控制内核 printk() 缓冲区有关,而 glibc 版本称为 klogctl()。type 参数确定此函数执行的操作。 引用自 kernel/printk.c
/*
* Commands to sys_syslog:
*
* 0 -- Close the log. Currently a NOP.
* 1 -- Open the log. Currently a NOP.
* 2 -- Read from the log.
* 3 -- Read up to the last 4k of messages in the ring buffer.
* 4 -- Read and clear last 4k of messages in the ring buffer
* 5 -- Clear ring buffer.
* 6 -- Disable printk’s to console
* 7 -- Enable printk’s to console
* 8 -- Set level of messages printed to console
* 9 -- Return number of unread characters in the log buffer
*/
|
只有函数 3 允许非 root 进程使用。(函数 9 在 2.4.10 中添加。)
内核日志缓冲区 内核有一个长度为 LOG_BUF_LEN(4096,自 1.3.54 起:8192,自 2.1.113 起:16384;在最近的内核中,大小可以在编译时设置)的循环缓冲区,其中存储传递给内核函数 printk() 的消息作为参数(无论其日志级别如何)。 调用 syslog() (2,buf,len) 会等待此内核日志缓冲区变为非空,然后最多读取 len 字节到缓冲区 buf 中。它返回读取的字节数。从日志中读取的字节会从日志缓冲区中消失:信息只能读取一次。这是内核在用户程序读取 /proc/kmsg 时执行的函数。 调用 syslog() (3,buf,len) 将从日志缓冲区读取最后 len 个字节(非破坏性),但不会读取自上次“清除环形缓冲区”命令(根本不会清除缓冲区)以来写入缓冲区的更多字节。它返回读取的字节数。 调用 syslog() (4,buf,len) 执行完全相同的操作,但也会执行“清除环形缓冲区”命令。 调用 syslog() (5,dummy,idummy) 只执行“清除环形缓冲区”命令。
日志级别 内核例程 printk() 仅在消息的日志级别小于变量 console_loglevel 的值时才会在控制台上打印消息。此变量最初的值为 DEFAULT_CONSOLE_LOGLEVEL(7),但如果内核命令行包含单词“debug”,则将其设置为 10,如果发生内核故障,则设置为 15(10 和 15 只是胡说八道,等效于 8)。此变量由调用 syslog() (8,dummy,value) 设置(设置为 1-8 范围内的值)。type 等于 6 或 7 的 syslog() (type,dummy,idummy) 调用分别将其设置为 1(仅内核恐慌)或 7(除调试消息之外的所有消息)。 消息中的每一行文本都有自己的日志级别。除非该行以 <d> 开头,其中 d 是 1-7 范围内的数字,在这种情况下级别为 d,否则此级别为 DEFAULT_MESSAGE_LOGLEVEL - 1(6)。日志级别的常规含义在 <linux/kernel.h> 中定义如下
#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 */
|
返回值如果发生错误,则返回 -1,并设置 errno。否则,对于 type 等于 2、3 或 4,syslog() 返回读取的字节数,否则返回 0。错误
标签 | 描述 |
EINVAL | 参数错误。 |
EPERM | 进程尝试更改 console_loglevel 或清除内核消息环形缓冲区,但没有 root 权限。 |
ERESTARTSYS | | 系统调用被信号中断;未读取任何内容。(这只能在跟踪期间看到。) |
符合标准此系统调用是 Linux 特定的,不应在旨在可移植的程序中使用。注释从一开始,人们就注意到,内核调用和同名库例程是完全不同的东西,这很不幸。在 libc4 和 libc5 中,此调用的编号由 SYS_klog 定义。在 glibc 2.0 中,系统调用被命名为 klogctl()。参见
广告
|