c语言库函数syslog--将信息记录至系统日志文件

来源:互联网 发布:程序员需要学什么 编辑:程序博客网 时间:2024/05/16 18:25
 

c语言库函数syslog--将信息记录至系统日志文件

                                      

参见 《unix 环境高级编程》第13 章 精灵进程

在Linux下有个syslogd的Daemon程式,syslog是个系统管理员必看的档案。因此,如果您的程式有除错或安全讯息要显示,写到syslog是个很好的选择。

syslog有三个函数,使用上,一般您只需要用syslog(...)这个函数即可,一般使用状况下,openlog/closelog是可有可无的。

syslog()中的priority是facility及level的组合,其後参数的用法与printf无异。

范例:
#include
#include
#include
#include

void main(void)
{
if (fork()==0) {
for (;;) {
syslog(LOG_USER|LOG_INFO,"syslog programming test/n");
sleep(10);
}
}
}

检验:
tail -f /var/log/messages

Mar 22 01:42:51 foxman log: syslog programming test
Mar 22 01:43:31 foxman last message repeated 4 times
Mar 22 01:44:31 foxman last message repeated 6 times
Mar 22 01:45:31 foxman last message repeated 6 times
Mar 22 01:46:21 foxman last message repeated 5 times



--------------------------------------------------------------------------------


void openlog( char *ident, int option, int facility)
void syslog( int priority, char *format, ...)
void closelog( void )

option
用於openlog()的option参数可以是以下几个的组合:

LOG_CONS : 如果送到system logger时发生问题,直接写入系统console。
LOG_NDELAY : 立即开启连接(通常,连接是在第一次写入讯息时才打开的)。
LOG_PERROR : 将讯息也同时送到stderr
LOG_PID : 将PID含入所有讯息中

facility
facility参数用来指定何种程式在记录讯息,这可让设定档来设定何种讯息如何处理。

LOG_AUTH : 安全/授权讯息(别用这个,请改用LOG_AUTHPRIV)
LOG_AUTHPRIV : 安全/授权讯息
LOG_CRON : 时间守护神专用(cron及at)
LOG_DAEMON : 其它系统守护神
LOG_KERN : 核心讯息
LOG_LOCAL0到LOG_LOCAL7 : 保留
LOG_LPR : line printer次系统
LOG_MAIL : mail次系统
LOG_NEWS : USENET news次系统
LOG_SYSLOG : syslogd内部所产生的讯息
LOG_USER(default) : 一般使用者等级讯息
LOG_UUCP : UUCP次系统

level
决定讯息的重要性. 以下的等级重要性逐次递减:

LOG_EMERG : 系统无法使用
LOG_ALERT : 必须要立即采取反应行动
LOG_CRIT : 重要状况发生
LOG_ERR : 错误状况发生
LOG_WARNING : 警告状况发生
LOG_NOTICE : 一般状况,但也是重要状况
LOG_INFO : 资讯讯息
LOG_DEBUG : 除错讯

配置文件:
/etc/syslog-ng/syslog-ng.conf

添加语句为:
destination chentest_log { file("/var/log/chentest.log"); };
filter chentest { program("chentest"); };
filter n_chentest { not program("chentest"); };
log { source(src); filter(chentest); destination(chentest_log); };
log { source(src); filter(n_indexfiles); filter(n_chentest); filter(n_contentserver); filter(n_gongtest);destination(messages); };
第一句指明了写文件路径,
2句是一个过滤,表明运行程序chentest的日志写入/var/log/chentest.log里,当然最后要记得定义非chentest的程序日志写入/var/log/messages里,否则LINUX仍然会写chentest的日志到message里面.
另外,注意:这样只定义了chentest这个应用程序,必须确定你想写入你自己LOG的应用程序名必须是chentest.

完整的配置文件


# $Header: /var/cvsroot/gentoo-x86/app-admin/syslog-ng/files/syslog-ng.conf.gentoo,v 1.5 2005/05/12 05:46:10 mr_bones_ Exp $
#
# Syslog-ng default configuration file for Gentoo Linux
# contributed by Michael Sterrett

options {
    chain_hostnames(off);
    sync(0);

    # The default action of syslog-ng 1.6.0 is to log a STATS line
    # to the file every 10 minutes.  That's pretty ugly after a while.
    # Change it to every 12 hours so you get a nice daily update of
    # how many messages syslog-ng missed (0).
    stats(43200);
};

source src { unix-stream("/dev/log"); internal(); pipe("/proc/kmsg"); };

destination messages { file("/var/log/messages"); };
destination creatidf_log { file("/var/log/caocreatidf.log"); };
destination daily_log { file("/var/log/caodaily.log"); };
# By default messages are logged to tty12...
destination console_all { file("/dev/tty12"); };

filter creatidf { program("creatidf"); };
filter daily { program("daily"); };
filter n_creatidf { not program("creatidf"); };
filter n_daily { not program("daily"); };
# ...if you intend to use /dev/console for programs like xconsole
# you can comment out the destination line above that references /dev/tty12
# and uncomment the line below.
#destination console_all { file("/dev/console"); };

log { source(src); destination(messages); };
log { source(src); filter(creatidf); destination(creatidf_log); };
log { source(src); filter(daily); destination(daily_log); };
log { source(src); filter(n_creatidf); filter(n_daily); destination(messages); };
log { source(src); destination(console_all); };


http://www.linuxselfhelp.com/gnu/glibc/html_chapter/libc_18.html

原创粉丝点击