发送syslog4j 发送日志时openlog函数可以不用吗

linux log路径/var/log系统级别log syslog openlog closelog vsylog-红联Linux系统门户
您的位置:
&& 查看内容 - - -
linux log路径/var/log系统级别log syslog openlog closelog vsylog
Stealth发布于
&&字号: &&&&(网友评论&0&条)&
主要有两个问题:
1:linux系统log的路径 /var/log
2: 系统级别log API:
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);
void vsyslog(int priority, const char *format, va_list ap);
发表评论,与各位同人交流。回复请点击下方的我要评论按钮(游客可回复),要发表贴子请点击
Linux教程下载?“”(请点击),Linux教程免费下载。
求助Linux问题?论坛有39版块,覆盖所有Linux技术层面。前往“”
 |  |  |  |  |  |  |  |  |  |  |  | 
&2015 红联 Powered by SupSite您现在的位置:&&>>&&>>&&>>&&>>&正文
Linux下syslog日志函数使用
  许多应用程序需要记录它们的活动。系统程序经常需要向控制台或日志文件写消息。这些消息可能指示错误、警告或是与系统状态有关的一般信息。例如,su程序会把某个用户尝试得到超级用户权限但失败的事实记录下来。
  通常这些日志信息被记录在系统文件中,而这些系统文件又被保存在专用于此目的的目录中。它可能是/usr/adm或/var/log目录。对一个典型的Linux安装来说,文件 /var/log/messages包含所有系统信息,/var/log/mail包含来自邮件系统的其他日志信息,/var/log/debug可能包 含调试信息。你可以通过查看/etc/syslog.conf文件来检查系统配置。
  下面是一些日志信息的样例:
  这里,我们可以看到记录的各种类型的信息。前几个是Linux内核在启动和检测已安装硬件时自己报告的信息。接着是任务安排程序cron报告它正在启动。最后,su程序报告用户neil获得了超级用户权限。
  查看日志信息可能需要有超级用户特权。
  有些UNIX系统并不像上面这样提供可读的日志文件,而是为管理员提供一些工具来读取系统事件的数据库。具体情况请参考系统文档。
  虽然系统消息的格式和方式不尽相同,可产生消息的方法却是标准的。UNIX规范为所有程序提供了一个接口,通过syslog函数来产生日志信息:
  syslog函数向系统的日志工具发送一条日志信息。每条信息都有一个priority参数,该参数是一个严重级别与一个设施值的按位或。严重级别控制日志信息的处理,设施值记录日志信息的来源。
  定义在头文件syslog.h中的设施值包括LOG_USER(默认值)――它指出消息来自一个用户应用程序,以及LOG_LOCAL0、LOG_LOCAL1直到LOG_LOCAL7,它们的含义由本地管理员指定。
  严重级别按优先级递减排列,如表4-6所示。
  表& 4-6
  优& 先& 级
  说&&& 明
  LOG_EMERG
  紧急情况
  LOG_ALERT
  高优先级故障,例如数据库崩溃
  LOG_CRIT
  严重错误,例如硬件故障
  LOG_ERR
  LOG_WARNING
  LOG_NOTICE
  需要注意的特殊情况
  LOG_INFO
  一般信息
  LOG_DEBUG
  调试信息
  根据系统配 置,LOG_EMERG信息可能会广播给所有用户,LOG_ALERT信息可能会EMAIL给管理员,LOG_DEBUG信息可能会被忽略,而其他信息则 写入日志文件。当我们编写的程序需要使用日志记录功能时,只要在希望创建一条日志信息时简单的调用syslog函数即可。
  syslog创建的日志信息包含消息头和消息体。消 息头根据设施值及日期和时间创建。消息体根据syslog的message参数创建,该参数的作用类似printf中的格式字符串。syslog的其他参 数要根据message字符串中printf风格的控制转换符而定。此外,控制转换符%m可用于插入与错误变量errno当前值对应的出错消息字符串。这 对于记录错误消息很有用。
  实验:syslog函数
  在这个程序中,我们试图打开一个不存在的文件:
  编译并运行这个程序syslog.c,我们没有看到输出,但是/var/log/messages文件现在在尾部有如下一行:
  Feb 8 09:59:14 beast syslog: oops - No such file or directory
  实验解析
  在这个程序中,我们试图打开一个不存在的文件。在文件打开失败后,我们调用syslog在系统日志中记录这一事件。
  注意:日志信息并未指明是哪个程序调用了日志功能,它仅仅记录syslog被调用以记录一条信息的事实。%m转换控制符被替换为一个错误描述,在本例中就是“文件没有找到”。这比仅仅报告一个原始的错误码更有用。
  在头文件syslog.h中还定义了一些能够改变日志记录行为的其他函数。它们是:
  我们可以通过调用openlog函数来改变日志信息 的表示方式。它允许我们设置一个字符串ident,该字符串会加在日志信息的前面。我们可以通过它来指明是哪个程序创建了这条信息。facility参数 记录一个设施值,它将作为后续syslog调用的默认设施值。它的默认值是LOG_USER。logopt参数对后续syslog调用的行为进行配置,它是0个或多个表4-7中值的按位或。
  表& 4-7
  logopt参数
  说&&& 明
  LOG_PID
  在日志信息中包含进程标识符,这是系统分配给每个进程的一个唯一值
  LOG_CONS
  如果信息不能被记录到日志文件中,就把它们发送到控制台
  LOG_ODELAY
  在第一次调用syslog时才打开日志功能
  LOG_NDELAY
  立即打开日志功能,而不是等到第一次记录日志时
  openlog函数会分配并打开一个文件描述符,并通过它来写日志。你可以使用closelog函数来关闭它。注意,在调用syslog之前无需调用openlog,因为syslog会根据需要自行打开日志功能。
  我们可以通过setlogmask函数来设置一个日志掩码,并通过它来控制日志信息的优先级。优先级未在日志掩码中置位的后续syslog调用都将被丢弃。例如,你可以通过这个方法关闭LOG_DEBUG消息而不用改变程序主体。
  我们可以用LOG_MASK(priority)为日志信息创建一个掩码,它的作用是创建一个只包含一个优先级的掩码。我们还可以用LOG_UPTO(priority)来创建一个由指定优先级之前的所有优先级(包括指定优先级)构成的掩码。
  实验:logmask程序
  在本例中,我们将看到日志掩码的作用:
  logmask.c程序没有输出,但是在一个典型的Linux系统中,在/var/log/messages文件尾部,我们会看到如下信息:
  Feb 8 10:00:50 beast logmask[1833]: informative message, pid = 1833
  接收调试日志信息的文件(根据日志配置而定,通常是/var/log/debug,有时也可能是/var/log/messages)会包含如下信息:
  Feb 8 10:00:50 beast logmask[1833]: debug message, should appear
【责编:coco】
?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]?&[]
相关产品和培训
 友情推荐链接
 专题推荐
 ? ? ? ? ? ? ? ? ? ?
 今日更新
?&?&?&?&?&?&?&?&?&?&
 认证培训
 频道精选
 Windows频道导航
                      syslog.h源码分析
/*&*这个头文件是linux系统里的,存在于/usr/include/sys/目录下&*不是这个包(sysklogd-1.3)中的文件,在这个包的某些源文件中引用到&*这个头文件。&* Copyright (c) , &*&The Regents of the University of California.& All rights reserved.&*&* Redistribution and use in source and binary forms, with or without&* modification, are permitted provided that the following conditions&* are met:&* 1. Redistributions of source code must retain the above copyright&*&&& notice, this list of conditions and the following disclaimer.&* 2. Redistributions in binary form must reproduce the above copyright&*&&& notice, this list of conditions and the following disclaimer in the&*&&& documentation and/or other materials provided with the distribution.&* 4. Neither the name of the University nor the names of its contributors&*&&& may be used to endorse or promote products derived from this software&*&&& without specific prior written permission.&*&* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND&* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE&* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE&* ARE DISCLAIMED.& IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE&* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL&* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS&* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)&* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT&* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY&* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF&* SUCH DAMAGE.&*&*&@(#)syslog.h&8.1 (Berkeley) 6/2/93&*/#ifndef _SYS_SYSLOG_H#define _SYS_SYSLOG_H 1#include &features.h&#define __need___va_list#include &stdarg.h&#define&_PATH_LOG&&/dev/log&/*&* priorities/facilities are encoded into a single 32-bit quantity, where the&* bottom 3 bits are the priority (0-7) and the top 28 bits are the facility&* (0-big number).& Both the priorities and the facilities map roughly&* one-to-one to strings in the syslogd(8) source code.& This mapping is&* included in this file.&* priorities和facilities使用一个32位的整数进行编码。末尾的三位表示priority(0-7),&* 前面28位表示facility(0-最大数)。(这句话不会翻译????)&* 这个对应关系被包含在各个文件中。&* priorities (these are ordered)&*/#define&LOG_EMERG&0&/* system is unusable */#define&LOG_ALERT&1&/* action must be taken immediately */#define&LOG_CRIT&2&/* critical conditions */#define&LOG_ERR&&3&/* error conditions */#define&LOG_WARNING&4&/* warning conditions */#define&LOG_NOTICE&5&/* normal but significant condition */#define&LOG_INFO&6&/* informational */#define&LOG_DEBUG&7&/* debug-level messages */#define&LOG_PRIMASK&0x07&/* mask to extract priority part (internal) 为获取priority值,所使用的掩码,作用就像子网掩码*/&&&&/* extract priority */#define&LOG_PRI(p)&((p) & LOG_PRIMASK) /*根据给定的整数p,计算出priority的值*/#define&LOG_MAKEPRI(fac, pri)&(((fac) && 3) | (pri))/* 相当于(fac*8+pri)。计算出一个值,可以表示facility和priority。给出这个值,可以用宏&LOG_PRI(p)&和&LOG_FAC(p)&分别计算出这两个值。*/#ifdef SYSLOG_NAMES#define&INTERNAL_NOPRI&0x10&/* the &no priority& priority */&&&&/* mark &facility& */#define&INTERNAL_MARK&LOG_MAKEPRI(LOG_NFACILITIES, 0)???上面一段没有看懂???typedef struct _code {&char&*c_&int&c_} CODE;CODE prioritynames[] =& {&&& { &alert&, LOG_ALERT },&&& { &crit&, LOG_CRIT },&&& { &debug&, LOG_DEBUG },&&& { &emerg&, LOG_EMERG },&&& { &err&, LOG_ERR },&&& { &error&, LOG_ERR },&&/* DEPRECATED 不赞成使用*/&&& { &info&, LOG_INFO },&&& { &none&, INTERNAL_NOPRI },&&/* INTERNAL 如配置文件中&mail.none&表示对mail的信息不做记录*/&&& { &notice&, LOG_NOTICE },&&& { &panic&, LOG_EMERG },&&/* DEPRECATED 不赞成使用*/&&& { &warn&, LOG_WARNING },&&/* DEPRECATED 不赞成使用*/&&& { &warning&, LOG_WARNING },&&& { NULL, -1 }& };#endif/* facility codes *//*&*在32位的整数中,priority使用后3位表示,facility用前面28位表示。所以,要&*使用下面的方法把0-24都左移3个bit。然后,加上priority就形成了完整的编码。&*左移三位可以用另一种方法实现:将0-24分别乘以8.两者等效。&*左移三位就等于扩大8倍。*/#define&LOG_KERN&(0&&3)&/* kernel messages */#define&LOG_USER&(1&&3)&/* random user-level messages */#define&LOG_MAIL&(2&&3)&/* mail system */#define&LOG_DAEMON&(3&&3)&/* system daemons */#define&LOG_AUTH&(4&&3)&/* security/authorization messages */#define&LOG_SYSLOG&(5&&3)&/* messages generated internally by syslogd */#define&LOG_LPR&&(6&&3)&/* line printer subsystem */#define&LOG_NEWS&(7&&3)&/* network news subsystem */#define&LOG_UUCP&(8&&3)&/* UUCP subsystem */#define&LOG_CRON&(9&&3)&/* clock daemon */#define&LOG_AUTHPRIV&(10&&3)&/* security/authorization messages (private) */#define&LOG_FTP&&(11&&3)&/* ftp daemon */&/* other codes through 15 reserved for system use */#define&LOG_LOCAL0&(16&&3)&/* reserved for local use */#define&LOG_LOCAL1&(17&&3)&/* reserved for local use */#define&LOG_LOCAL2&(18&&3)&/* reserved for local use */#define&LOG_LOCAL3&(19&&3)&/* reserved for local use */#define&LOG_LOCAL4&(20&&3)&/* reserved for local use */#define&LOG_LOCAL5&(21&&3)&/* reserved for local use */#define&LOG_LOCAL6&(22&&3)&/* reserved for local use */#define&LOG_LOCAL7&(23&&3)&/* reserved for local use */#define&LOG_NFACILITIES&24&/* current number of facilities 当前的facility数量????????*/#define&LOG_FACMASK&0x03f8&/* mask to extract facility part 这个掩码是11-1000*/&&&&&&&&/* 说明facility并并没有用到28位,只用了7位,可以表示*/&&&&&&&&/*255种facility,目前的facility远小于255。不知道为什么不*/&&&&&&&&/*直接用0xfffffff8*/&&&&/* facility of pri */#define&LOG_FAC(p)&(((p) & LOG_FACMASK) && 3)/*根据给定的整数p,计算出facility的值*/#ifdef SYSLOG_NAMESCODE facilitynames[] =& {&&& { &auth&, LOG_AUTH },&&& { &authpriv&, LOG_AUTHPRIV },&&& { &cron&, LOG_CRON },&&& { &daemon&, LOG_DAEMON },&&& { &ftp&, LOG_FTP },&&& { &kern&, LOG_KERN },&&& { &lpr&, LOG_LPR },&&& { &mail&, LOG_MAIL },&&& { &mark&, INTERNAL_MARK },&&/* INTERNAL */&&& { &news&, LOG_NEWS },&&& { &security&, LOG_AUTH },&&/* DEPRECATED */&&& { &syslog&, LOG_SYSLOG },&&& { &user&, LOG_USER },&&& { &uucp&, LOG_UUCP },&&& { &local0&, LOG_LOCAL0 },&&& { &local1&, LOG_LOCAL1 },&&& { &local2&, LOG_LOCAL2 },&&& { &local3&, LOG_LOCAL3 },&&& { &local4&, LOG_LOCAL4 },&&& { &local5&, LOG_LOCAL5 },&&& { &local6&, LOG_LOCAL6 },&&& { &local7&, LOG_LOCAL7 },&&& { NULL, -1 }& };#endif/*&* arguments to setlogmask.&*/#define&LOG_MASK(pri)&(1 && (pri))&&/* mask for one priority */#define&LOG_UPTO(pri)&((1 && ((pri)+1)) - 1)&/* all priorities through pri *//*&* Option flags for openlog.&* 函数openlog使用的选项标致。&* LOG_ODELAY no longer does anything.&* LOG_NDELAY is the inverse of what it used to be.&*/#define&LOG_PID&&0x01&/* log the pid with each message在消息中记录pid */#define&LOG_CONS&0x02&/* log on the console if errors in sending如果消息无法送到syslogd,直接输出到系统console */#define&LOG_ODELAY&0x04&/* delay open until first syslog() (default) 与LOG_NDELAY 正相反*/#define&LOG_NDELAY&0x08&/* don't delay open立即打开到syslogd的连接,默认连接是在第一次写入讯息时才打开的*/#define&LOG_NOWAIT&0x10&/* don't wait for console forks: DEPRECATED */#define&LOG_PERROR&0x20&/* log to stderr as well将消息也同时送到stderr 上 */__BEGIN_DECLS/* Close desriptor used to write to system logger.& */extern void closelog (void) __THROW;/* Open connection to system logger.& */extern void openlog (__const char *__ident, int __option, int __facility)&&&& __THROW;/* ,,/* Set the log mask level.& */extern int setlogmask (int __mask) __THROW;/* Generate a log message using FMT string and option arguments.& */extern void syslog (int __pri, __const char *__fmt, ...) __THROW&&&& __attribute__ ((__format__(__printf__, 2, 3)));#ifdef __USE_BSD/* Generate a log message using FMT and using arguments pointed to by AP.& */extern void vsyslog (int __pri, __const char *__fmt, __gnuc_va_list __ap)&&&& __THROW __attribute__ ((__format__(__printf__, 2, 0)));#endif__END_DECLS#endif /* sys/syslog.h */附录:__THROW &Linux/FreeBSD内核的源文件里常会出现这个东东。其实并不复杂,只是简单的宏定义,可以参考以下代码&sys/cdefs.h&;:/* GCC can always grok prototypes.&&For C++ programs we add throw()& &to help it optimize the function calls.&&But this works only with& &gcc 2.8.x and egcs.&&*/# if defined __cplusplus && (__GNUC__ &;= 3 || __GNUC_MINOR__ &;= #&&define __THROW& && & throw ()# else#&&define __THROW# endif# define __P(args)& && &args __THROW/* This macro will be used for functions which might take C++ callback& &functions.&&*/# define __PMT(args)& & args# define __DOTS& && && &, ...像这个static void icmp6_errcount __P((struct icmp6errstat *, int, int)); 展开后就是static void icmp6_errcount (struct icmp6errstat *, int, int) throw();或者static void icmp6_errcount (struct icmp6errstat *, int, int);&__Pc++, throw(),,.&
&&最后修改于
请各位遵纪守法并注意语言文明1591人阅读
UNIX(26)
为了满足某些目的,进行日志记录是很有必要的。在典型的 LINUX 安装中,/var/log/messages 包含所有的系统消息,/var/log/mail 包含来自邮件系统的其它日志消息,/var/log/debug 可能包含调试消息。根据你的LINUX的版本,你可以在 /etc/syslog.conf 或者 /etc/syslog-ng/syslog-ng.conf 文件里检查你的系统(消息)配置情况。尽管系统消息的格式和存储位置可能不同,但产生消息的方法却是标准的。UNIX 技术规范(specification)为所有程序生成日志消息提供了一个接口,这通过syslog() 函数实现:
#include &syslog.h&void syslog(int priority, const char *message, arguments...);
syslog() 函数向日志设备(日志工具 facility)发送日志消息。每一个消息都有一个 priority(优先级) 参数,这个参数由一个&危险系数&(severity level)和一个程序标识码(facility value)相或(OR)得来。&危险系数&用来调控(control)如何对这条日志消息做出响应的(以哪一种危险等级来响应);程序标识码记录着发出这条消息是哪一个程序。(The severity level controls how the log message is acted upon)程序标识码(定义自 syslog.h)包含 LOG_USER----用来指示这消息是来自用户的应用程序(默认值)的。LOG_LOCAL0, LOG_LOCAL1...LOG_LOCAL7 --这些都可以由本地管理员来进行赋值。以下是危险等级的降序排列:Priority Level&&&&&&&&&&&&&&&&&&&&&&&&&&&& DescriptionLOG_EMERG&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 紧急状况LOG_ALERT&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 高优先级故障,如数据库损坏LOG_CRIT&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 关键性(critical)错误,如硬件操作失败LOG_ERR&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 一般错误LOG_WARNING&&&&&&&&&&&&&&&&&&&&&&&&&&&& 一般警告LOG_NOTICE&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 需要注意的特殊条件LOG_INFO&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 通知性消息(Information messages)LOG_DEBUG&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 调试消息根据系统的配置,LOG_EMERG 消息可能会向所有用户进行广播,LOG_ALERT 消息可能会给管理员发出一个邮件,LOG_DEBUG 消息可能会被忽略,而其它的消息都写到一个消息文件中去。当你想创建一个日志消息时,你可以简单的写一个使用日志工具的程序,这通过调用 syslog() 函数即可。由 syslog() 函数创建的日志消息由消息标题(message header)和消息内容(message body)组成。消息标题由设备指示符(facility indicator)、日期和时间来创建。消息内容由syslog() 函数中的 message 参数生成,这个和 printf() 的格式字符串的使用类似。syslog() 后面其他的参数按照 message 字符串里的 printf() 风格转换说明符给出(Further arguments to syslog() are used according to printf() style conversion specifiers in the message string)。另外,指示符 %m 可用来插入错误信息字符串,这个字符串和当前的错误变量 errno 所对应。这对于日志错误信息记录很有用。测试代码:
01 #include &syslog.h&02 #include &stdio.h&03 #include &stdlib.h&04 05 int main()06 {07 &&&&&&& FILE *f;08 09 &&&&&&& f = fopen("not_here", "r");10 11 &&&&&&& if(!f)12 &&&&&&&&&&&&&&& syslog(LOG_ERR|LOG_USER, "oops - %m/n");13 &&&&&&& exit(0);14 }
执行输出:没有显示输出,但是会把错误信息写到日志文件中,通过查看 /var/log/messages 可以看得到:Feb 24 00:49:45 localhost syslog.exe: oops - No such file or directory %m 转换控制符被一个错误描述信息所替换,在上面的程序中,错误的原因是没有找到需要的文件。这比单纯的报告错误编号要来得有用的多。其他的用来改变日志功能的行为的函数也定义在 syslog.h 头文件中:
#include &syslog.h&void closelog(void);void openlog(const char *ident, int logopt, int facility);int setlogmask(int maskpri);
你可以通过调用 openlog() 函数改变你的日志消息的呈现方式。这允许你设置一个字符串--ident,这将被加在你的日志消息的最前面。你可以使用这些来指示哪一个程序正在创建这条消息。facility 参数记录了一个默认的程序标识码---这在后来使用 syslog() 里会被用到。默认的 facility 值为 LOG_USER. logopt 参数配置将来要调用 syslog() 函数的行为。它是0个或多个一下参数的OR运算:logopt Parameter&&&&&&&&&&&&&&&&&&&&&&&&&&&& DescriptionLOG_PID&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 加上进程标识符(系统分配给每个进程的一个独一无二的数字标识)LOG_CONS&&&&&&&&&&&&&&&&&&&&&&&&&&&& 如果消息无法记录到日志文件里则发送消息到控制台LOG_NDELAY&&&&&&&&&&&&&&&&&&&&&&&&&& 在第一次调用 syslog 函数时打开日志功能LOG_NDELAY&&&&&&&&&&&&&&&&&&&&&&&&&& 立即打开日志功能,而不等到第一次记日志时openlog() 函数将分配和打开一个用来写到日志功能的文件描述符,你也可以通过调用 closelog() 函数来关闭它。注意,你无须在调用 syslog() 之前调用 openlog() ,这是因为如果有需要的话 syslog 它自己也会打开日志功能。通过设置一个日志掩码(使用 setlogmask()函数 )你可以控制日志消息的优先级。此后, 所有没有在日志掩码里置位的优先级的 syslog()调用都要被丢弃。举例来说,你可以使用这来关闭 LOG_DEBUG 消息而无须影响程序内容。使用 LOG_MASK(priority) 你可以为日志消息创建一个掩码,通过这样创建的掩码仅由一个优先级组成;或者是 LOG_UPTO(priority)这创建的掩码由指定优先级之前所有优先级组成(也包含指定优先级自身)。示例代码:
01 #include &syslog.h&02 #include &stdio.h&03 #include &unistd.h&04 #include &stdlib.h&05 06 int main()07 {08 &&&&&&& int09 10 &&&&&&& openlog("logmask", LOG_PID|LOG_CONS, LOG_USER);11 &&&&&&& syslog(LOG_INFO, "informative message, pid = %d", getpid());12 &&&&&&& syslog(LOG_DEBUG, "debug message, should appear");13 &&&&&&& logmask = setlogmask(LOG_UPTO(LOG_NOTICE));14 &&&&&&& syslog(LOG_DEBUG,"debug message, should not appear");15 16 &&&&&&& exit(0);17 }
程序说明:在运行 logmask 程序后不产生任何输出,但在典型的 linux 系统上,在 /var/log/messages 的末尾处,可以看到:
Feb 26 17:48:59 localhost logmask[14184]: informative message, pid = 14184
可能在 /var/log/debug (centos5 没这个文件) 或者有时在 /var/log/messages 中会包含如下行:
Feb 26 22:23:42 localhost logmask[11730]: debug message, should appear
10).调用了 openlog() 函数。openlog() 函数的作用是打开一个日志连接。其中参数 ident 是一个字符串指针,它所指向的字符串会放在每个消息的前面,通常的应用都是设置为程序名,用来指示是哪个程序创建里这个消息。所以,这里就为 logmask 这个程序名。第二个参数 LOG_PID|LOG_CONS 设置就是要告诉后面在调用 syslog() 对日志进行记录时,要包含进程PID号信息,如果无法对日志进行记录操作,则把消息发往控制台。第三个参数是 facility . facility 参数用来指定是什么程序类型在记录日志。如默认类型是 LOG_USER(通用的用户级消息),LOG_FTP(FTP 守护进程记录的消息&FTP守护进程程序类型&),LOG_KERN(内核消息&内核程序类型&)等等,详见 man 手册。上面举例中用的是 LOG_USER 这个默认类型。注意:在上面程序中,/var/log/debug 文件原本是没有的,那是因为没有激活这个日志功能,要激活 debug 记录功能,在 /etc/syslog.conf 中添加以下内容:
#debug messages*.debug /var/log/debug
编辑并保存文件后,重启计算机即可。在程序中,debug message, should not appear 这条消息不会出现,因为调用了 setlogmask() 函数,这里忽略了所有低于 LOG_NOTICE 优先级的所有消息,而 LOG_DEBUG 优先级最低,自然不会被记录到 /var/log/debug 文件中。(注意:这种做法在早期的内核中行不通).这是因为 LOG_UPTO(priority) 是一个宏,这个宏表示:低于 priority 优先级的消息都不会在掩码中被置位,也就是在进一步调用 syslog() 函数时,里面的消息是无法记录到日志文件的。上面的程序使用了 getpid() 函数,它和一个非常接近的函数 getppid() 的函数定义在一起:
#include &sys/types.h&#include &unistd.h&pid_t getpid(void);pid_t getppid(void);
LOG_ALERT=1
LOG_CRIT=3
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:94013次
积分:1729
积分:1729
排名:第17479名
原创:67篇
转载:81篇
(1)(1)(6)(3)(2)(9)(8)(6)(1)(4)(1)(1)(8)(7)(24)(59)(5)(1)(1)

我要回帖

更多关于 syslog发送工具 的文章

 

随机推荐