rsyslog

rsyslogd是提供rsyslog服务的守护进程,rsyslog服务的功能是提供日志的记录,通常被守护进程记录进程运行时的消息输出,包括出错消息,调试消息,因为守护进程所在的会话没有控制终端,不能通过printf等打印出来,rsyslogd的配置文件包括/etc/rsyslog.conf和文件夹/etc/rsyslog.d/中的所有文件。

消息可由等级(level)和设备(facility)分类,比如level的等级:LOG_INFO(通告消息)为6,LOG_DEBUG(调试消息)为7,值越低优先级越高,(这个优先级的作用我尚不明确)。facility:LOG_USER(任意的用户级消息)(默认),LOG_SYSLOG(由syslogd内部产生的消息)


在/etc/rsyslog.conf和/etc/rsyslog.d/文件夹中,配置文件中的每一行的形式为以下几种之一:


<facilityname>.<levelname> 
 <destination> 

 *.<levelname> 
 <destination> 

 <facilityname>.* 
 <destination> 

 *.* 
 <destination>


<destination>可以为文件或其他rsyslogd服务器的ip


比如:


kern.* 
 /dev/console 
  

 local7.debug 
 /var/log/cisco.log




产生日志的方法


1.使用loger命令


2.使用syslog(int priority, const char *message, ...);


priority有level和facility用过或运算符|构成




与syslog函数相关的函数还有:


void openlog(const char *ident, int options, int facility);



ident指定了消息的前缀,options可由LOG_CONS,LOG_NDELAY,LOG_PERROR,LOG_PID逻辑或构成,这个函数在调用syslog之前调用,功能是指定消息的前缀,设备和选项



void closelog(void);//这个在不需要syslog是调用,用来关闭log连接




xinetd


功能:完成tcp udp等服务器端的套接字的建立和监听端口,简化服务器程序的开发,减少进程的创建




也就是说,在我们的服务器程序中socket,bind,listen,accept函数不需要我们自己写,我们只要把要创建的服务的信息写入xinetd的配置文件/etc/xinetd.conf或/etc/xinetd.d/中的文件就能够委托xinetd帮我们完成这些函数的调用。xientd守护进程帮我们accept到一个连接或者对于udp端口检测到可读后(使用select函数等待可读),就会fork一个进程,exec到我们的服务器程序。通过这种方式,我们只需要一个xinetd守护进程,当一个连接产生时再fork一个进程,比起传统的服务器程序各自遇到有连接时fork一个进程,能够产生更少的进程。同时因为创建监听端口一系列的设置不需要我们编写代码,只需要设置配置文件就行了,自然简化的服务器程序的编写,让服务器程序专注与处理客户的请求






xinetd的配置


xinetd的配置文件/etc/xinetd.conf主要是为各个服务设置默认的配置,要注意开头的'#'号表示这一行是注释。/etc/xinetd.d/文件夹中的各个文件是针对具体的单个服务配置的,这是xinetd与inetd相比更模块化的表现。该文件夹下配置文件的形式为:


service <serviceName> 

 { 

   <attributeName> = <value> 

   ... 

   ... 

 }


其中serviceName为服务的名字,一般设置为在/etc/services中可以找到的服务,{}中是对该服务的属性的设值,一些属性如果可以是一个集合,还可以使用+= -= 这样的操纵符(但有些不能使用-=)。下面介绍几个主要的属性:


disable

如果要开启服务应该设为no


id

服务的唯一标识符,一般与serviceName同名


type

如果本服务是xinetd的内置服务(可能xinetd实现了某些服务器程序的功能),比如说echo服务,本 值就应设为INTERNAL,如果本服务没有在/etc/services中列出,就应设为UNLISTED,如果是一个RPC服 务,就应设为RPC




flags

一些套接字的选项,比如NODELAY,KEEPALIVE


wait

当子进程未结束时新的请求到来,是否等待子进程结束后再fork新子进程,udp一般为yes,tcp为no


socket_type

tcp设为stream, udp设为dgram


server

服务器程序路径名


user

启动server的用户,因为xinetd进程以值为0的用户启动,所以可以fork的进程可以改变用户






xinetd的调试


当我们写了一个服务在/etc/xinetd.d文件夹中,但是重启xinetd服务后netstat -ano | grep <端口号>又查不到我们服务的端口,就是出了错误了,我们需要知道哪里出了错。方法是查看日志文件,当日志文件在哪真是个问题,我设置的服务配置文件中的log_type,log_on_success log_on failure选项,然后service xinetd restart重启xinetd服务,但是去查看log_type中设的文件竟是空的。最后只能在rsyslog服务的配置文件/etc/rsyslog.conf中加上一行:*.*

,然后重启xinetd终于可以了,当这个方法实在太笨,最后通过man xinetd发现xinetd -filelog 可以指定日志文件而且有效,还是要看英文文档啊!虽然有点反感英文