首先讲一下我们使用的syslog模块

这个模块基本上是移植的linux系统上最常用的开源软件syslog

其中有些差异我也不太清楚了,因为我用的时候已经已经不只是二手了...


一、结构图

zabbix 采集redis_zabbix 采集redis

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,独立了

父进程的退出造成了终端中程序退出的假象,又子进程继续在后台偷偷的跑。

关于守护进程可以看一下这篇文章



之后子进程通过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) 
  {
rtm_read() doesn't readall socket data.\n");
           zlog_err(“rtm_read() doesn't read all socketdata. \n”);
  }
//closezlog (zlog_default);