syslog() - Unix、Linux 系统调用
Tutorials Point


  Unix 初学者指南
  Unix Shell 编程
  高级 Unix
  Unix 有用参考
  Unix 有用资源
  精选阅读

版权所有 © 2014 tutorialspoint



  首页     参考     讨论论坛     关于 TP  

syslog() - Unix、Linux 系统调用


previous next AddThis Social Bookmark Button

广告

名称

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()。

参见



previous next Printer Friendly

广告


  

广告



广告