Syslog是一种工业标准的协议,可用来记录设备的日志。
Ubuntu下安装syslog apt-get install inetutils-syslogd。
这里面的三个函数openlog, syslog, closelog是一套系统日志写入接口。另外那个vsyslog和syslog功能一样,只是参数格式不同。
通常,syslog守护进程读取三种格式的记录消息。此守护进程在启动时读一个配置文件。一般来说,其文件名为/etc/syslog.conf,该文件决定了不同种类的消息应送向何处。例如,紧急消息可被送向系统管理员(若已登录),并在控制台上显示,而警告消息则可记录到一个文件中。该机制提供了 syslog函数,其调用格式如下。
#include <syslog.h>。
void openlog (char*ident,int option ,int facility);。
void syslog(int priority,char*format,……)。
void closelog();。
调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符。调用openlog 使我们可以指定一个ident,以后, 此ident 将被加至每则记录消息中。ident 一般是程序的名称(例如 ,cron ,ine 等)
程序的用法示例代码如下:
#include <syslog.h>。
int main(int argc, char **argv)。
openlog("MyMsgMARK", LOG_CONS | LOG_PID, 0);。
syslog(LOG_DEBUG,。
"This is a syslog test message generated by program '%s'\n",。
argv[0]);
closelog();
return 0;
编译生成可执行程序后,运行一次程序将向/var/log /message文件添加一行信息如下:
Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message generated by program './a.out'。
syslog函数及参数
syslog函数用于把日志消息发给系统程序syslogd去记录,此函数原型是:
void syslog(int priority, const char *format, ...);。
第一个参数是消息的紧急级别,第二个参数是消息的格式,之后是格式对应的参数。就是printf函数一样使用。
如果我们的程序要使用系统日志功能,只需要在程序启动时使用openlog函数来连接 syslogd程序,后面随时用syslog函数写日志就行了。
下面介绍在RedHat和ubuntu中如何配置它:
Ubuntu和红帽常使用它,并且通过文件/etc/rsyslog.conf进行管理。文件中包含许多指定的特殊系统日志:有的是控制台方面的,有的是文件方面或其它主机的。
首先,我们需要载入合适的TCP和UDP插件以支持接收系统日志。把下面的代码添加到rsyslog.conf的头部:
$modload imtcp
$modload imudp
$InputTCPServerRun 10514。
$UDPServerRun 514。
载入的这两个模块能支持监听TCP和UDP的端口,并且指定哪个端口来接受事件,在这种情况下,使用TCP的10514端口和UDP的514端口。你需要确认一下本地防火墙(在你的主机和中央系统日志服务器之间的防火墙)。
下面我们需要指定一些规则来告诉rSyslog在哪放输入事件。如果你不添加任何规则,输入事件将按照本地的规则进行处理,并且与本地主机的事件交织在一起。我们需要在上面添加节之后和本地处理系统日志之前来正确的指定这个规则,例如:
if $fromhost-ip isequal '192.168.0.2' then /var/log/192.168.0.2.log。
& ~
这里我们说的每一个来自于192.168.0.2的系统日志都应该保存在/var/log/192.168.0.2.log文件中。&~这个符号是非常重要的,因为它告诉rSyslog将停止处理消息。如果你把它忘写了,消息将越过下一个规则,并且继续处理。在这一规则中还有其他的变量。例如:
if $fromhost-ip startswith '192.168.' then /var/log/192.168.log。
& ~
这里我们用192.168.*替代了以这个为开始的所有IP地址,写入到/var/log/192.168.log文件中。你还可以看到一些其它的过滤。
你将需要重启这个rsyslog服务来激活我们所做的新的配置:
$ sudo service rsyslog restart。
现在,对于发送方的主机,我们还需要对文件rsyslog.conf进行一些更改,在文件的头部,添加下面这行:
*.* @@192.168.0.1:10514。
这是发送的所有事件,来自于所有源代码和所有重要级别(用*.*),通过TCP协议传给IP地址为192.168.0.1的10514端口。你可是用你所在环境的地址来替换这个IP地址。要启用此配置,你将需要重启主机上的rSyslog。
你可以通过SSL/TLS更进一步地发送你的系统日志。如果你在互联网上或其它网络间传输系统日志,这也没什么坏处,你可能会发现这个的简单说明。
现在,如果给你的配置管理系统(如果不使用这个,你可以试一试Puppet或Cfengine工具)添加这个配置,然后,您可以用适当的系统日志来有效地配置每台主机,以确保你的日志将被发送到中央系统日志服务器。
我们的程序一般都会产生输出信息。但是服务器程序一般却不希望输出信息到屏幕上,因为没有人盯着你的程序执行。所以我们要把一些信息写成日志文件,正常情况下运行程序的人不用关心日志里的内容,只有在出现问题的时候才会查看日志文件里的内容以确定问题所在。
但如果我们的程序要自己生成一个文件来保存日志却不是好主意,因为这一方面增加了维护程序运行的人的负担,另一方面自己维护起系统来也多有不便。
在Linux系统中有一个系统日志,通常放在/var/log目录下,比如文件名是syslog的,系统中的一些程序产生的日志信息都会存放到这个文件里。日志文件有固定的格式,比如第1列是消息产生的时间,第2列是机器名(因为日志记录程序支持远程连接),第3列是标记信息(一般就是程序名称)等。而且对应的有一些工具来对这个日志进行维护,比如通过轮回机制保证日志文件大小不会把磁盘空间占尽。所以我们把自己程序的信息也写到这个系统日志里是比较好的想法。
在GNU C语言库提供的内容中,有接口可以用来做这件事。用下面的命令查看:
nm -D /lib/libc.so.6 | grep log。
可以看到一些调用:
000b9410 T closelog。
0008b870 T getlogin。
0008b960 T getlogin_r。
000d0180 T __getlogin_r_chk。
000bd190 T klogctl。
00027450 T __open_catalog。
000b9380 T openlog。
0008bae0 T setlogin。
000b8b80 T setlogmask。
000b9350 T syslog。
000b9320 T __syslog_chk。
000b92f0 T vsyslog。
000b8da0 T __vsyslog_chk。
这里面的三个函数openlog, syslog, closelog是一套系统日志写入接口。另外那个vsyslog和syslog功能一样,只是参数格式不同。
程序的用法示例代码如下:
#include <syslog.h>。
int main(int argc, char **argv)。
openlog("MyMsgMARK", LOG_CONS | LOG_PID, 0);。
syslog(LOG_DEBUG,。
"This is a syslog test message generated by program '%s'\n",。
argv[0]);。
closelog();。
return 0;
编译生成可执行程序后,运行一次程序将向/var/log/syslog文件添加一行信息如下:
Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message generated by program './a.out'。
Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message generated by program './a.out'。
LOG_CONS
Write directly to system console if there is an error while sending to system logger.。
LOG_NDELAY。
Open the connection immediately (normally, the connection is opened when the first message is logged).。
LOG_NOWAIT。
Don’t wait for child processes that may have been created while logging the message. (The GNU C library does not create a。
child process, so this option has no effect on Linux.)。
LOG_ODELAY。
The converse of LOG_NDELAY; opening of the connection is delayed until syslog() is called. (This is the default, and need。
not be specified.)。
LOG_PERROR。
(Not in SUSv3.) Print to stderr as well.。
LOG_PID
Include PID with each message.。
第三个参数指明记录日志的程序的类型。
syslog函数及参数
syslog函数用于把日志消息发给系统程序syslogd去记录,此函数原型是:
void syslog(int priority, const char *format, ...);。
第一个参数是消息的紧急级别,第二个参数是消息的格式,之后是格式对应的参数。就是printf函数一样使用。
如果我们的程序要使用系统日志功能,只需要在程序启动时使用openlog函数来连接syslogd程序,后面随时用syslog函数写日志就行了。
另外,作为syslog的替代程序的新一代工具是syslog-ng,syslog-ng具有很强的网络功能,可以方便地把多台机器上的日志保存到一台中心日志服务器上。
发送syslog时openlog函数可以不用.。
Syslog是一种工业标准的协议,可用来记录设备的日志。
Ubuntu下安装syslog apt-get install inetutils-syslogd。
这里面的三个函数openlog, syslog, closelog是一套系统日志写入接口。另外那个vsyslog和syslog功能一样,只是参数格式不同。
通常,syslog守护进程读取三种格式的记录消息。此守护进程在启动时读一个配置文件。一般来说,其文件名为/etc/syslog.conf,该文件决定了不同种类的消息应送向何处。例如,紧急消息可被送向系统管理员(若已登录),并在控制台上显示,而警告消息则可记录到一个文件中。该机制提供了 syslog函数,其调用格式如下。
#include <syslog.h>。
void openlog (char*ident,int option ,int facility);。
void syslog(int priority,char*format,……)。
void closelog();。
调用openlog是可选择的。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符。调用openlog 使我们可以指定一个ident,以后, 此ident 将被加至每则记录消息中。ident 一般是程序的名称(例如 ,cron ,ine 等)
程序的用法示例代码如下:
#include <syslog.h>。
int main(int argc, char **argv)。
openlog("MyMsgMARK", LOG_CONS | LOG_PID, 0);。
syslog(LOG_DEBUG,。
"This is a syslog test message generated by program '%s'\n",。
argv[0]);
closelog();
return 0;
编译生成可执行程序后,运行一次程序将向/var/log /message文件添加一行信息如下:
Feb 12 08:48:38 localhost MyMsgMARK[7085]: This is a syslog test message generated by program './a.out'。
syslog函数及参数
syslog函数用于把日志消息发给系统程序syslogd去记录,此函数原型是:
void syslog(int priority, const char *format, ...);。
第一个参数是消息的紧急级别,第二个参数是消息的格式,之后是格式对应的参数。就是printf函数一样使用。
如果我们的程序要使用系统日志功能,只需要在程序启动时使用openlog函数来连接 syslogd程序,后面随时用syslog函数写日志就行了。
下面介绍在RedHat和ubuntu中如何配置它:
Ubuntu和红帽常使用它,并且通过文件/etc/rsyslog.conf进行管理。文件中包含许多指定的特殊系统日志:有的是控制台方面的,有的是文件方面或其它主机的。
首先,我们需要载入合适的TCP和UDP插件以支持接收系统日志。把下面的代码添加到rsyslog.conf的头部:
$modload imtcp
$modload imudp
$InputTCPServerRun 10514。
$UDPServerRun 514。
载入的这两个模块能支持监听TCP和UDP的端口,并且指定哪个端口来接受事件,在这种情况下,使用TCP的10514端口和UDP的514端口。你需要确认一下本地防火墙(在你的主机和中央系统日志服务器之间的防火墙)。
下面我们需要指定一些规则来告诉rSyslog在哪放输入事件。如果你不添加任何规则,输入事件将按照本地的规则进行处理,并且与本地主机的事件交织在一起。我们需要在上面添加节之后和本地处理系统日志之前来正确的指定这个规则,例如:
if $fromhost-ip isequal '192.168.0.2' then /var/log/192.168.0.2.log。
& ~
这里我们说的每一个来自于192.168.0.2的系统日志都应该保存在/var/log/192.168.0.2.log文件中。&~这个符号是非常重要的,因为它告诉rSyslog将停止处理消息。如果你把它忘写了,消息将越过下一个规则,并且继续处理。在这一规则中还有其他的变量。例如:
if $fromhost-ip startswith '192.168.' then /var/log/192.168.log。
& ~
这里我们用192.168.*替代了以这个为开始的所有IP地址,写入到/var/log/192.168.log文件中。你还可以看到一些其它的过滤。
你将需要重启这个rsyslog服务来激活我们所做的新的配置:
$ sudo service rsyslog restart。
现在,对于发送方的主机,我们还需要对文件rsyslog.conf进行一些更改,在文件的头部,添加下面这行:
*.* @@192.168.0.1:10514。
这是发送的所有事件,来自于所有源代码和所有重要级别(用*.*),通过TCP协议传给IP地址为192.168.0.1的10514端口。你可是用你所在环境的地址来替换这个IP地址。要启用此配置,你将需要重启主机上的rSyslog。
你可以通过SSL/TLS更进一步地发送你的系统日志。如果你在互联网上或其它网络间传输系统日志,这也没什么坏处,你可能会发现这个的简单说明。
现在,如果给你的配置管理系统(如果不使用这个,你可以试一试Puppet或Cfengine工具)添加这个配置,然后,您可以用适当的系统日志来有效地配置每台主机,以确保你的日志将被发送到中央系统日志服务器。
In file included from ../sysdeps/unix/sysv/linux/syslog.c:10:0:。
../misc/syslog.c: In function ‘__vsyslog_chk’:。
../misc/syslog.c:123:1: sorry, unimplemented: inlining failed in call to ‘syslog’: function body not available。
../misc/syslog.c:155:9: sorry, unimplemented: called from here。
make[2]: *** [/home/daphne/glibc-build/misc/syslog.o] 错误 1。
make[2]:正在离开目录 `/home/daphne/glibc-2.15/misc'。
make[1]: *** [misc/subdir_lib] 错误 2。
make[1]:正在离开目录 `/home/daphne/glibc-2.15'。
make: *** [all] 错误 2。
///////////////////////////////。
我从这里下载了glibc-2.15.tar.bz2和glibc-2.15.tar.bz2.sig;
并且按照要求进行configure,make;
结果就出现了如上所述的错误。我从这里看到了解决的方式->>>>>>.。
>>>>>http://hi.baidu.com/wstone_h/item/941976f98cc6751de3e3bd18。
Syslog是一种工业标准的协议,可用来记录设备的日志。 Ubuntu下安装syslog apt-get install inetutils-syslogd 这里面的三个函数openlog, syslog, closelog是一套系统日志写入接口。另外那个vsyslog和syslog功能一样,只是参数格式不同。