浅谈Linux下的syslog守护进程

系统 Linux
syslog是Linux下默认的日志守护进程。任何希望生成日志信息的程序都可以通过syslog 接口实现该目的。

【引自暮回_梓的博客】syslog是Linux下默认的日志守护进程。任何希望生成日志信息的程序都可以通过syslog 接口实现该目的。

同时,几乎所有的网络设备都可以通过syslog协议,将日志信息以UDP的形式传送给远端服务器,远端接收日志服务器必须通过syslogd监听UDP端口514,并根据 syslog.conf 配置文件张的配置处理。配置文件 /etc/rsyslog.conf 中规定了syslogd如何根据设备和信息的重要级别来报告信息。

这里只需要有个大致了解即可,下面都会提到这些东西。

关于配置文件:

CentOS之前的版本下,配置文件为/【etc/syslog.conf 】,具体从哪一版开始不清楚,但是从CentOS6.5之后,配置文件名变更为【/etc/rsyslog.conf 】。

syslog是支持日志分类输出到某个特定文件中的,但是有几个限制:

1、syslog日志输出支持分类,但不支持每个进程单独输出到某个文件(因为syslog并不是作为一套完整的日志库而产生的);

2、syslog输出的日志文件位置并不是任意的,默认仅仅限于【/var/log/】目录下,如果指定到其他位置,视为无效;

在该文件中,抛过大部分的注释信息,主要内容基本都下图格式:  

 

从前向后,依次为:

【服务.优先级 <tab> action字段】。

其中,【服务.优先级】一起统称为选择条件,如下图所示。条件选择是对服务进行了分类,便于syslog对日志的输出管理。同时一行的配置中,允许出现多个选择条件,多个选择条件使用 ; 隔开。  

 

服务(facility),用来指定syslog的功能,主要包括:

kern          内核信息,首先通过 klogd 传递;

user          用户进程;

mail          邮件;

daemon        后台进程;

authpriv      授权信息;

syslog        系统日志;

lpr           打印信息;

news          新闻组信息;

uucp          由uucp生成的信息

cron          计划和任务信息。

mark          syslog 内部功能用于生成时间戳

local0----local7 与自定义程序使用,例如使用 local5 做为 ssh 功能

*                  通配符代表除了 mark 以外的所有功能

优先级(level),指定了syslog的优先级,从高到底依次为:

emerg 或 panic   该系统不可用(最紧急消息)

alert            需要立即被修改的条件(紧急消息)

crit             阻止某些工具或子系统功能实现的错误条件(重要消息)

err              阻止工具或某些子系统部分功能实现的错误条件(出错消息)

warning          预警信息(警告消息)

notice           具有重要性的普通条件(普通但重要的消息)

info             提供信息的消息(通知性消息)

debug            不包含函数条件或问题的其他信息(调试级-信息量最多)

none             没有重要级,通常用于排错(不记录任何日志消息)

*                所有级别,除了none

action:

1. /var/log/lastlog : 记录每个使用者最近签入系统的时间, 因此当使用者签入时, 就会显示其上次签入的时间, 您应该注意一下这个时间, 若不是您上次签入的时间, 表示您的帐号可能被人盗用了. 此档可用 /usr/bin/lastlog 指令读取.

2. /var/run/utmp : 记录每个使用者签入系统的时间, who, users, finger 等指令会查这个档案.

3. /var/log/wtmp : 记录每个使用者签入及签出的时间, last 这个指令会查这个档案. 这个档案也记录 shutdown 及 reboot 的动作.

4. /var/log/secure : 登录系统的信息

5. /var/log/maillog : 记录 sendmail 及 pop 等相关讯息.

6. /var/log/cron : 记录 crontab 的相关讯息 ,定时器的信息

7. /var/log/dmesg : /bin/dmesg 会将这个档案显示出来, 它是开机时的画面讯息.

8. /var/log/xferlog : 记录那些位址来 ftp 拿取那些档案.

9. /var/log/messages : 系统大部份的讯息皆记录在此, 包括 login, check password , failed login, ftp, su 等.

调用syslog的守护进程:

syslog也是一个守护进程,准确的说应该是rsyslog,位于/etc/rc.d/init.d/rsyslog,这是syslog的启动脚本。当我们修改了启动交而不能文件中的内容之后,需要使用【service rsyslog restart】命令重启该服务。

syslog不仅仅用来记录本机文件的日志信息,更多的是作为一个日志服务器,用来接收远程系统的信息。对该服务的启动,有两个常用选项:

-r:将当前主机作为日志服务器,监听514端口上进来的UDP包,接收远程系统的信息。没有该选项,将不会接收来自远程系统的信息。

-h:使得当前日志服务器能够传送日志信息,

如何配置一个中央日志服务器:

1、编辑/etc/sysconfig/rsyslog(CentOS6.5之前的版本该文件叫做syslog),该文件中可以声明,启动该服务的时的启动选项。

-r:上面提到过,表示允许接收外来日志消息;

-m **:将默认的时间戳标记信息出现频率变为自己指定的值【eg: -m240,表示每240分钟在日志文件中增加一行时间戳消息】;

-x:表示不希望让中央日志服务器解析其他机器的FQDN(完全合格域名,指的是主机名+全路径);

SYSLOGD_OPTIONS="-r -x -m 240 -c 5"

2、重启rsyslog服务

service rsyslog restart

3、关闭防火墙(iptables),允许514号端口上的连接通过;

4、对客户机进行配置syslog

方法一:在客户机上syslog的配置文件中,对有关配置行的操作动作部分用“@”字符指向中央日志服务器,而不用指向本机的 /var/log/.....

  1. # Log all the mail messages in one place. 
  2.  
  3. mail.* @192.168.3.24  

方法二:在DNS中定义一个机器,命名随意,这里以“loghost”为例,然后将客户机的配置文件改为如下形式。这样就可以避免以后如果发生日志服务器更换的情况,不用再一个一个修改客户机的syslog配置文件。

  1. # Log all the mail messages in one place. 
  2.  
  3. mail.* @loghost  

对客户机配置完毕之后,以及需要进行重启。

syslog的函数接口:

  1. #include <syslog.h> 
  2.      void openlog(const char *ident, int  option,  int  facil- ity); 
  3.           # ident:对哪个进程进行日志记录,为进程名 
  4.           # option常用选项: 
  5.                LOG_CONS: 
  6.                LOG_PID:打印的每一条日志信息包含当前进程的PID 
  7.           # facil-ity常用选项: 
  8.                LOG_USER:打印的每一条日志信息包含当前用户的等级信息 
  9.      void syslog(int priority, const char *format, ...); 
  10.           # format:输出日志信息的参数列表,用法类同printf 
  11.      void closelog(void);  

测试用例:

  1. #include <stdio.h> 
  2. #include <syslog.h> 
  3. int main(int argc,char* argv[]) 
  4.     openlog(argv[0],LOG_CONS | LOG_PID, LOG_USER); 
  5.     int count = 0; 
  6.     while(count < 5) 
  7.     { 
  8.         syslog(LOG_INFO, "%d, log info test ..."count); 
  9.         count++; 
  10.     } 
  11.     closelog(); 
  12.     return 0; 
  13.  

为了同时测试配置文件,在syslog的配置文件中添加一行内容如下:

  1. user.* /var/log/0.1 # 该文件默认只能在/var/log下,放在其它目录下无效 

重启rsyslog服务;

执行原程序,就可以在/var/log/看到0.log文件,打开文件,内容如下:

  1. [root@www ~]# cat /var/log/0.log 
  2.  
  3. Apr  7 23:13:12 www ./test_log[4063]: 0, log info test ... 
  4.  
  5. Apr  7 23:13:12 www ./test_log[4063]: 1, log info test ... 
  6.  
  7. Apr  7 23:13:12 www ./test_log[4063]: 2, log info test ... 
  8.  
  9. Apr  7 23:13:12 www ./test_log[4063]: 3, log info test ... 
  10.  
  11. Apr  7 23:13:12 www ./test_log[4063]: 4, log info test ...  

简单的例子看到这里就够了,我看到网上很多人都在讨论如何使用syslog针对特定的某一进程输出日志文件,但都没有很好的解决方案。尽管在配置文件中提供了local0~local7自定义服务,但也并不是***的,很多情况下并不能真正实现我们的目的。

这里我想说的是,Linux下的syslog,它出现的目的并不是为了提供用户每个进程的日志输出,syslog只是用来作为对于服务管理的整套机制,它针对的是一类服务,用来做日志服务器,实现对整个系统网络中日志的维护(对日志的维护,实际上就是对整个计算机群的维护)。同时,真正的工程中,并不会使用syslog作为全套的日志管理工具,在Linux下有提供了很多完整的日志库工具,比如log4cplus、zlog等。 

责任编辑:庞桂玉 来源: 51CTO博客
相关推荐

2010-06-28 14:52:30

cron进程

2010-03-02 16:37:53

Linux Quagg

2009-11-24 11:35:59

2012-05-08 11:01:45

linux守护进程

2013-01-15 15:18:46

Linux守护进程

2014-08-01 15:38:37

Linux进程管理

2011-03-29 12:45:07

Zabbix进程

2010-03-16 13:41:09

Python进程

2009-06-22 11:13:00

linuxJava运行环境

2010-01-05 10:00:48

Linux进程间通信

2009-09-16 08:43:51

linux进程线程

2010-07-15 15:54:10

Perl守护进程

2019-05-08 11:10:05

Linux进程语言

2009-10-27 08:57:50

linux杀死进程

2019-02-26 11:15:25

进程多线程多进程

2013-12-19 15:01:03

LinuxLinux进程

2013-11-06 15:35:49

LinuxLinux进程

2010-07-15 15:47:46

Perl守护进程

2011-08-08 10:02:55

iPhone开发 进程 通信

2009-07-15 17:52:23

sqlite jdbc
点赞
收藏

51CTO技术栈公众号