首先讲一下我们使用的syslog模块
这个模块基本上是移植的linux系统上最常用的开源软件syslog
其中有些差异我也不太清楚了,因为我用的时候已经已经不只是二手了...
一、结构图
syslogd是作为一个守护进程启动的,可以接收来自用户进程,网络上的和内核中的log信息,将收到的log做一些必要的处理
然后保存到内存,文件或网络服务器上
二、启动流程
1.syslogd的启动流程
syslogd启动时会读取传入的参数,如./syslogd -f /etc/syslog.conf
目前启动参数有
-a
-d debug模式,并非以守护进程形式启动
-f 指定配置文件
-n 不以守护进程启动
-r 接受远端信息
-t 添加hostname tag
-v 打印syslog版本,立即退出
检查pid文件,判断syslog是否已经启动过了,如果没启动则fork出子进程
之后就是守护进程的启动形式,即,父进程退出,子进程执行setsid()获取会话id
因为父进程一旦退出,子进程变为孤儿进程,由init收养,执行setsid后会变得strong,独立了
父进程的退出造成了终端中程序退出的假象,又子进程继续在后台偷偷的跑。
关于守护进程可以看一下这篇文章
http://blog.csdn.net/davion_zhang/article/details/51510557
之后子进程通过getdtablesize获取所有文件描述符并关闭,所以后续的终端打印都不会打印了
后面就是写pid文件,分配资源,进入init函数
init函数的主要作用是分配struct filed * Files资源
启动两个server
一个是unix 本地server
一个是tcp或udp的网络server
后续就是启动接收线程,等待接收log消息
2.用户进程发送log消息
用户侧就比较简单了,主要是初始化和发送log
三、接口介绍
syslog主要包含以下函数接口
1. struct zlog * openzlog(constchar *progname, zlog_proto_t protocol, int syslog_flags, int syslog_facility);
progname: 进程名 如“zebra”
protocol: 模块协议类型 如“ZLOG_ZEBRA”
syslog_flags: log选项 LOG_PID 每一条日志都带有pid信息
LOG_CONS 当日志发送出错,将日志发送到控制台
LOG_ NDELAY 立刻创建socketclient (建议使用)
syslog_facility: 指明记录日志的程序的类型。
LOG_KERN,"kern" 内核
LOG_USER,"user" 用户
LOG_MAIL,"mail" 邮件
LOG_DAEMON,"daemon" 守护进程相关
LOG_AUTH,"auth" 认证相关
LOG_SYSLOG,"syslog" syslog
LOG_LPR, "lpr"
LOG_NEWS,"news" 消息
LOG_UUCP,"uucp" 复制程序相关
2. void zlog (struct zlog *zl, intpriority, const char *format, ...);
zl:zlog配置结构一般为全局变量zlog_default
priority:log级别 LOG_EMERG= 0,
LOG_ALERT,
LOG_CRIT,
LOG_WARNING,
LOG_ERR,
LOG_INFO,
LOG_DEBUG
format:按格式输入
3. 几个zlog衍生函数
void zlog_err (const char *format, ...);
void zlog_warn (const char *format, ...);
void zlog_info (const char *format, ...);
void zlog_notice (const char *format, ...);
void zlog_debug (const char *format, ...);
这几个函数就等于带有zl和priority的zlog
如zlog_err(“zlogerror \n”);
=zlog(zlog_default, LOG_ERR, “zlog error \n”)
4. closezlog(struct zlog *zl);
关闭本进程log功能
四、使用流程
1. log初始化
调用函数openzlog(const char *progname, zlog_proto_t protocol,
intsyslog_flags, int syslog_facility);
openzlog会初始化log日志,创建syslog客户端。
2. 日志记录
调用函数zlog (struct zlog *zl, int priority, const char *format, ...);
zlog用于本进程的调试和syslog日志输出,目前有4种输出形式
ZLOG_DEST_SYSLOG = 0, ——输出到syslog
ZLOG_DEST_STDOUT, ——标准输出
ZLOG_DEST_MONITOR, ——通过vty输出到监控器
ZLOG_DEST_FILE ——输出到文件
目前zebra可同时支持这4种,现只保留syslog的输出形式。
log级别
LOG_EMERG= 0,
LOG_ALERT,
LOG_CRIT,
LOG_WARNING,
LOG_ERR,
LOG_INFO,
LOG_DEBUG
5. 关闭本进程日志
调用函数closezlog(struct zlog *zl);
五、例
例如在zebra进程中使用syslog输出告警日志
zlog_default = openzlog (progname,ZLOG_ZEBRA,
LOG_CONS|LOG_NDELAY|LOG_PID, LOG_DAEMON);
/*Assert warning. */
if(pnt != end)
{
zlog (zlog_default, LOG_WARNING, "rtm_read() doesn't readall socket data.\n");
zlog_err(“rtm_read() doesn't read all socketdata. \n”);
}
//closezlog (zlog_default);