守护进程的日记实现
2013-05-12 17:48
169 查看
说明:只供学习交流,转载请注明出处
五,守护进程的日记实现:
由于守护进程不拥有控制终端,因此无法将进程运行信息输出显示。但有时候需要根据进程提供的信息来进行系统管理和维护工作。为此,Linux系统提供了一种特殊的机制来解决守护进程的日志问题。syslogd守护进程通过接收其他守护进程的信息,并将这些信息记录在指定位置来解决日志记录问题。syslogd守护进程会根据消息级别来判断是将消息记录在日志文件,还是显示在用户终端上。
syslogd守护进程负责记录、发送系统或工具所产生的信息,其配置文件是/etc/syslog.conf。当系统内核或工具产生信息时,通过调用相关的函数,将信息发送到syslogd守护进程。syslogd守护进程会根据/etc/syslog.conf中的配置信息,对消息的去向做出处理。例如,将消息记录在系统日志中、输出到控制台或转发给某个指定的用户,甚至可以让syslogd将信息通过网络转发给网络上其他主机的syslogd守护进程实现系统的集中管理。
下面给出/etc/syslog.conf配置文件的部分内容:
在syslogd文件中以#开头的是注释行,配置行的语法格式为:
[消息类型][TAB分隔符][处理方案]。
消息类型:消息类型包括facility和level两部分,这两个部分以“.”隔开,如:mail.*表示facility为mail,而level是所有级别。处理方案是将消息记录在/var/log/maillog日志文件中。facility可以使用的字段见下表:
facility取值 | 值 | 说明 |
kern | 0 | 内核日志信息 |
user | 1 | 用户日志信息 |
mail | 2 | 邮件系统日记信息 |
daemon | 3 | 系统守护进程日记信息 |
auth | 4 | 安全管理日记信息 |
syslog | 5 | syslogd守护进程的日记信息 |
lpr | 6 | 打印服务日记信息 |
news | 7 | 新闻组服务日记信息 |
uucp | 8 | uucp系统日记信息 |
cron | 9 | 守护进程cron的日记信息 |
authpriv | 10 | 私有的安全管理日记信息 |
ftp | 11 | ftp守护进程 |
| 12~15 | 系统保留 |
local0~local7 | 16~23 | 保留该系统本地使用 |
level给出的级别代表着信息的重要性,下表给出level中的级别信息:
level取值 | 值 | 说明 |
emerg | 0 | 系统不可用,出现这一情况的话,应该通知所有用户,因为这表示系统出现了严重的问题 |
alert | 1 | 警告事件,必须立即采取行动纠正的事件 |
crit | 2 | 关键事件,例如硬件出现故障 |
err | 3 | 其他错误事件 |
warning | 4 | 警告事件 |
notice | 5 | 应该注意的事件,需要特别处理 |
info | 6 | 通报信息 |
debug | 7 | 调试程序时产生的信息 |
说明:在syslog.conf中,可以使用*表示任何facility和任意的level。通过指定facility和level的取值,可以使facility在大于或等于该优先级的时候才记录相关日志信息。对于level,还可以使用none参数,表示不包含任何优先级别。例如,*.*表示任何facility的任何优先级的信息。*.emerg表示任何facility的大于或高于emerg优先级的信息。
处理方案:
处理方案中指定的字段可以为如下的内容。
(1):普通文件:使用文件的绝对路径来指明日志文件系统所在的位置。
(2):管道文件:在syslogd中支持使用管道文件(FIFO),在管道文件路径名前加“|”,表示将所得信息写入管道中。
(3):终端设备:通过将信息写入/dev/console中,可以在终端显示相关信息。
(4):其他主机:syslogd支持将信息发往网络中的其他主机的syslogd守护进程,以实现集中管理,格式为“@hostname”。
(5):用户列表:syslogd守护进程支持将日志信息发给某些指定的用户。
(6):所有登录用户:可以使用*表示所有登录的用户。在获得日志信息时,syslogd守护进程会自动将信息发送给登录用户。
下面选取前面给出的syslog.conf中的一条配置来解释其意义。具体配置如下:
cron.* /var/log/cron
配置中的facility为cron,表示记录守护进程cron的信息。level为*,表示记录所有优先级别的信息,并将日志信息记录到/var/log/cron文件中。在Linux系统中,往往将各种日志文件保存在/var/log目录中。
六,守护进程日志的实现
syslogd守护进程用于解决守护进程的日志记录问题,而日志信息保存的位置和记录的信息级别是在syslogd守护进程的配置文件中设定的。守护进程日志主要涉及3个函数,分别是openlog、syslog、closelog函数,下面给出这3个函数的具体信息:
头文件 | #include <syslog.h> | ||
函数原型 | void openlog(const char *ident, int option, int facility); void syslog(int priority, const char *format, …); void closelog(void); | ||
返回值 | 成功 | 失败 | 是否设置errno |
—— | —— | —— |
说明:openlog函数用于打开系统日志连接。只有在打开连接后,才能使用syslog函数向日志文件中添加日志信息。closelog函数用于关闭打开的系统日志连接,该函数的调用在实现中是可选择的。
openlog函数中的第一个参数为ident,该参数常用来表示信息的来源。ident指向的字符信息会被固定地添加在每行日志的前面。第二个参数option用于指定openlog函数和接下来调用的syslog函数的控制标志。option的取值情况如下表所示,可以单独取其中的某个值,也可以通过与运算来获得多种特性。第三个参数为facility,这个要与syslogd守护进程的配置文件对应,日志信息会写入syslog.conf文件指定的位置。
openlog函数中的option取值表
参数 | 说明 |
LOG_CONS | 如果将信息发送给syslogd守护进程时发送错误,直接将相关信息输出到终端 |
LOG_NDELAY | 立即打开系统日志的连接(通常情况下,只有在产生第一条日记信息的情况下才会打开与日记系统的连接) |
LOG_NOWAIT | 在记录日志信息时,不等待可能的子进程的创建 |
LOG_ODELAY | 类似于LOG_NDELAY参数,与系统日志的连接只有在syslog函数调用时才会创建 |
LOG_PERROR | 在将信息写入日志的同时,将信息发送到标准错误输出(POSIX.1-2001不支持该参数) |
LOG_PID | 每条日志信息中都包含进程号 |
参数facility的取值如下表所示。这些值与前面syslog.conf中的facility是存在对应关系的。
openlog函数参数facility取值
facility参数 | Syslog.conf中对应的facility取值 |
LOG_KERN | kern |
LOG_USER | user |
LOG_MAIL | mail |
LOG_DAEMON | daemon |
LOG_AUTH | auth |
LOG_SYSLOG | syslog |
LOG_LPR | lpr |
LOG_NEWS | news |
LOG_UUCP | uucp |
LOG_CRON | cron |
LOG_AUTHPRIV | authpriv |
LOG_FTP | ftp |
LOG_LOCAL0~LOG_LOCAL7 | local0~local7 |
syslog函数中的第一个参数priority表示消息的级别。与openlog函数中的facility参数类似,priority参数与level也存在对应的关系。priority取值和对应关系如下表所示:
syslog函数参数priority取值
priority参数 | syslog.conf中对应的level取值 |
LOG_EMERG | emerg |
LOG_ALERT | alert |
LOG_CRIT | crit |
LOG_ERR | err |
LOG_WARNING | warning |
LOG_NOTICE | notice |
LOG_INFO | info |
LOG_DEBUG | debug |
在程序中添加日志功能需要遵循如下图所示的步骤:
|
|
下面给出一个简单的实例。首先,程序调用openlog函数打开与系统日志的连接;然后,通过调用syslog函数产生5条日志信息;最后关闭与系统日志间的连接。
代码如下:
#include <stdio.h> #include <syslog.h> int main(int argc, char *argv[]) { openlog(argv[0],LOG_CONS|LOG_PID,LOG_USER); int count = 0; while ( count < 5 ) { syslog(LOG_INFO, "%d, log info test...", count); count++; } closelog(); return (0); } 运行结果: [root@localhost /]# ./log [root@localhost /]# [root@localhost /]# vim /var/log/messages 59 May 12 00:52:02 localhost ./log[9781]: 0, log info test... 60 May 12 00:52:02 localhost ./log[9781]: 1, log info test... 61 May 12 00:52:02 localhost ./log[9781]: 2, log info test... 62 May 12 00:52:02 localhost ./log[9781]: 3, log info test... 63 May 12 00:52:02 localhost ./log[9781]: 4, log info test...
说明:由于守护进程的特点,守护进程往往作为服务器(server)进程。例如,syslogd守护进程用来接收其他守护进程发送的消息。其他的守护进程是作为客户机(client)存在的。一般情况下,服务器是一个为客户机服务的进程。客户机给服务器发送服务请求,服务器响应这种请求。这一工作模式存在于很多场合,例如,常见的ftp服务器、telnet服务器等。
总结:守护进程是工作在Client/Server模式下的一种特殊的进程。由于守护进程没有控制终端,如何输出进程信息成为了一个较大的问题。为了解决这一问题,Linux系统提供了syslogd守护进程,用于完成对系统和其他守护进程或程序的日志记录。syslog.conf配置文件指定了syslogd收到的信息写入位置。
相关文章推荐
- Linux守护进程的编程实现
- Android实现双进程守护
- 守护进程的单实例实现
- 关于linux端php实现守护进程
- linux shell实现守护进程脚本
- Android 通过JNI实现守护进程,使Service服务不被杀死
- Python实现Linux下守护进程的编写方法
- Android中双进程守护的实现
- 守护进程的实现
- Linux守护进程的编程实现 (转)
- PHP程序级守护进程的实现与优化的使用概述
- PHP实现多进程并行操作(可做守护进程)
- 基于Linux守护进程的分析与实现
- python实现Linux启动守护进程
- windows环境下批处理实现守护进程
- 利用Hyperic调用Python实现进程守护
- 用PHP实现守护进程任务后台运行与多线程(php-resque使用说明)
- Linux守护进程的编程实现
- 实现进程守护 脚本命令
- 如何用php语言实现实时消息处理的后台守护进程