系统日志函数 -- syslog、vsyslog

2015-01-14 21:04:30   最后更新: 2015-01-14 21:04:30   访问数量:1752




对于很多程序来说,我们非常关心他们的运行状态,特别是守护进程,他们无法通过标准输入、标准输出来反馈他们的运行状态,所以日志就显得格外重要

最早出现在BSD上的 syslog 完成了这样的工作,如今,这个函数已经成为 POSIX 的一部分

 

如图,有三种方式可以操作 syslog 打印日志

  1. 内核通过调用 log 函数写入日志到 /dev/klog
  2. 大多数用户进程可以通过调用 syslog 函数产生日志消息,该消息通过调用序列发送至 UNIX 域套接字 /dev/log
  3. 通过 TCP/IP 连接到本机的其他机器进程或本机进程可以通过 UDP 端口 514 发送日志消息

守护进程 syslogd 在启动时读取某个配置文件,决定不同类型的消息应送往何处

void openlog(const char *ident, int option, int facility); void syslog(int priority, const char *format, ... ); void vsyslog(int priority, const char *format, va_list arg); void closelog(void); int setlogmask(int maskpri); // 返回之前日志记录优先级屏蔽值

 

定义于 syslog.h 中

 

openlog 是可选的,同样 closelog 也是可选的,用来关闭曾被用于与 syslogd 通信的描述符

 

setlogmask 函数用于设置进程的记录优先级屏蔽字,返回调用之前的屏蔽字

只有大于当前优先级屏蔽字的消息才会被记录到日志,其他消息不会被记录

ident

该参数一般是程序的名称

option

位屏蔽选项

openlog 的 option 参数
optionXSI说明
LOG_CONS若日志消息不能通过 UNIX 域数据报送至 syslogd,则将该信息写到控制台
LOG_NDELAY立即打开至 syslogd守护进程的 UNIX 域数据报套接字,而不是待消息到来时再打开
LOG_NOWAIT不等待再将消息计入日志过程中可能已创建的子进程
LOG_ODELAY在记录第一条消息之前暂不打开至 syslogd 的连接
LOG_PERROR 除将日志消息发送给 syslogd 外,还将他写到标准错误输出
LOG_PID每条消息都包含写入消息的进程 ID

facility

openlog 的 facility 参数
facilityXSI说明
LOG_AUTH 授权程序:login, su, getty 等
LOG_AUTHPRIV 在 LOG_AUTH 的基础上增加写日志文件时的权限限制
LOG_CRON cron 和 at
LOG_DAEMON 系统守护进程:inetd, routed等
LOG_FTP FTP 守护进程(ftpd)
LOG_KERN 内核产生的消息
LOG_LOCAL0保留
LOG_LOCAL1保留
LOG_LOCAL2保留
LOG_LOCAL3保留
LOG_LOCAL4保留
LOG_LOCAL5保留
LOG_LOCAL6保留
LOG_LOCAL7保留
LOG_LPR 行打印系统:lpd, lpc 等
LOG_MAIL 邮件系统
LOG_NEWS Usenet 网络新闻系统
LOG_SYSLOG syslogd 守护进程本身
LOG_USER来自其他用户进程的消息(默认值)
LOG_UUCP UUCP 系统

level

syslog 中的 level
level说明
LOG_EMERG紧急(最高优先级)
LOG_ALERT必须立即修复
LOG_CRIT严重状态(如硬设备出错)
LOG+WARNING警告
LOG_NOTICE重要提醒
LOG_INFO信息
LOG_DEBUG调试消息

format

format 参数以及其他参数,传至 vsprintf 函数以便进行格式化

在 format 参数中,每个 %m 都先被代换成对应于 errno 的出错消息字串(strerror)

 






读书笔记      技术帖      linux      unix      龙潭书斋      apue      log      日志      syslog      vsyslog      openlog      closelog      setlogmask      logmask     


京ICP备15018585号