linux日志syslog知识总结

来源:互联网 发布:金庸群侠前传内功数据 编辑:程序博客网 时间:2024/06/04 18:05
介绍
syslog日志消息既可以记录在本地文件中,也可以通过网络发送到接收syslog的服务器。
接收syslog的服务器可以对多个设备的syslog消息进行统一的存储,或者解析其中的内容做相应的处理。
常见的应用场景是网络管理工具、安全管理系统、日志审计系统。

完整的syslog日志中包含产生日志的程序模块(Facility)、严重性(Severity或Level)、时间、主机名或IP、进程名、进程ID和正文。

1.工作流程
inux日记系统由系统日志监控程序syslogd和内核日志监控程序klogd组成。
消息:通过UNIX套接字发送给syslogd
内核消息:由klogd读取/proc/kmsg文件,将读取的内容发送给syslogd
远程消息:使用UDP 514端口

2.syslog的配置文件syslog.conf
a.基本语法
  [消息类型(规则)]     [处理方案(日记文件)]
b.消息类型
  由消息来源和优先级构成,中间点号连接。
  消息来源(facility):
     kern  内核产生的信息
     user  用户进程
     daemon 系统守护进程
     mail  电子邮件系统
     auth  与安全权限相关的命令(login, su, getty等)
     lpr   打印机
     news  新闻组信息
     uucp  uucp程序
     cron  cron守护进程
     wtmp  一个用户每次登录和退出时间的永久记录
     authpriv 授权信息
     mark
     ftp    ftp文件传输信息
   优先级(priority):
     emerg  最高的紧急程度状态
     alert  紧急状态
     crit   重要信息
     warning 警告
     err    临界状态
     notice 不是错误信息,但可能需要处理
     info   一般性消息
     debug  调试级信息
     none   不记录任何日志信息
c.处理方案
   一般为文件路径,可以是设备文件、普通文件或远程机器,如/dev/console,/var/log/messages,@192.168.1.100
d.syslog.conf内容格式
   facility.priority     action
   
   facility可以为facility1,facility2等多个由逗号分隔,或者*
   priority可以为*或priority,所有优先级大于或等于priority被发送

   facility.priority可以为多个,用分号隔开。如:*.info;mail.none;authpriv.none;cron.none

   action可以为设备文件、一般文件或远程主机,其中远程消息会发送远程主机syslogd上,
    以逗号分隔的用户列表,*表示向所有登录用户发送信息。
    

   通配符:
      * : 用于facility,表示所有facility;用于priority,表示所有priority(与debug效果一致);用于action,表示向所有用户发送信息
      = : 只发送本优先级的日志信息
      ! : 记录所有日志(不包含本优先级)


3.syslogd守护进程
a.启动和关闭syslogd服务
   service syslog start/stop/restart
    
   更改/etc/syslog.conf配置文件后,需要重启服务后生效。
b.支持远程接收日志信息
   如果将要使用一个日志服务器,必须调用syslogd -r。
   缺省情况下syslogd不接受来自远程系统的信息。当指定-r选项,syslogd将会监听从514端口上进来的UDP包。
c.支持日志传递
   如果还希望日志服务器能传送日志信息,可以使用-h标志。
   缺省时,syslogd将忽略使其从一个远程系统传送日志信息到另一个系统的syslogd。

4.log文件规范
   完整的syslog消息由3部分组成,分别是PRI、HEADER和MSG。大部分syslog都包含PRI和MSG部分,而HEADER可能没有
   如:<30>Oct 9 22:33:20 hlfedora auditd[1787]: The audit daemon is exiting.
     其中“<30>”是PRI部分,“Oct 9 22:33:20 hlfedora”是HEADER部分,“auditd[1787]: The audit daemon is exiting.”是MSG部分。

a.PRI
   PRI部分由尖括号包含的一个数字构成,这个数字包含了程序模块(Facility)、严重性(Severity),这个数字低3位表示Severity,其它高位表示Facility
   Facility的定义如下,可以看出来syslog的Facility是早期为Unix操作系统定义的,不过它预留了User(1),Local0~7 (16~23)给其他程序使用:
      Numerical             Facility
         Code
          0             kernel messages
          1             user-level messages
          2             mail system
          3             system daemons
          4             security/authorization messages (note 1)
          5             messages generated internally by syslogd
          6             line printer subsystem
          7             network news subsystem
          8             UUCP subsystem
          9             clock daemon (note 2)
         10             security/authorization messages (note 1)
         11             FTP daemon
         12             NTP subsystem
         13             log audit (note 1)
         14             log alert (note 1)
         15             clock daemon (note 2)
         16             local use 0  (local0)
         17             local use 1  (local1)
         18             local use 2  (local2)
         19             local use 3  (local3)
         20             local use 4  (local4)
         21             local use 5  (local5)
         22             local use 6  (local6)
         23             local use 7  (local7)
   
    Severity的定义如下:
       Numerical         Severity
        Code
         0       Emergency: system is unusable
         1       Alert: action must be taken immediately
         2       Critical: critical conditions
         3       Error: error conditions
         4       Warning: warning conditions
         5       Notice: normal but significant condition
         6       Informational: informational messages
         7       Debug: debug-level messages

b.HEADER
   HEADER部分包括两个字段,时间和主机名(或IP)。
   时间紧跟在PRI后面,中间没有空格,格式必须是“Mmm dd hh:mm:ss”,不包括年份。
  “日”的数字如果是1~9,前面会补一个空格(也就是月份后面有两个空格),而“小时”、“分”、“秒”则在前面补“0”。
   月份取值包括:Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
   时间后边跟一个空格,然后是主机名或者IP地址,主机名不得包括域名部分。
   HEADER部分后面跟一个空格,然后是MSG部分。
   有些syslog中没有HEADER部分。这个时候MSG部分紧跟在PRI后面,中间没有空格。

c.MSG
   MSG部分又分为两个部分,TAG和Content。其中TAG部分是可选的。
   在前面的例子中,“auditd[1787]”是TAG部分,包含了进程名称和进程PID。PID可以没有,这个时候中括号也是没有的。由LOG_PID指定的。
   TAG后面用一个冒号隔开Content部分,这部分的内容是应用程序自定义的。


5.syslog API使用
void openlog(char *ident, int option, int facility);   
此函数用来打开一个到系统日志记录程序的连接,打开之后就可以用syslog或vsyslog函数向系统日志里添加信息了。而closelog函数就是用来关闭此连接的。
ident是一个标记,ident所表示的字符串将固定地加在每行日志的前面以标识这个日志,通常就写成当前程序的名称以作标记。
option一般是下列选项值取“与”运算(如“LOG_CONS | LOG_PID”)的结果:
  LOG_CONS:如果送到system logger时发生问题,直接写入系统终端;
  LOG_NDELAY:立即开启连接,通常连接是在第一次写入消息时才打开的;
    LOG_ODELAY: 在第一次写入消息时才打开的;(default)
  LOG_PERROR:将消息也同时送到stderr设备;
  LOG_PID:将进程PID含入所有消息中。
facility指明记录日志的程序的类型,它主要具有如下几类日志类型:
  LOG_AUTH :安全/授权消息
  LOG_AUTHPRIV:安全/授权消息(private)
  LOG_CRON:时间守护进程(cron和at)专用
  LOG_DAEMON:其它系统守护进程
  LOG_KERN:核心消息
  LOG_LOCAL0到LOG_LOCAL7:系统保留
  LOG_LPR:printer子系统
  LOG_MAIL:mail子系统
  LOG_NEWS:USENET新闻子系统
  LOG_SYSLOG:syslogd进程内部所产生的消息
  LOG_USER:一般使用者缺省使用消息(default)
  LOG_UUCP:UUCP子系统
  LOG_FTP:FTP子系统使用

调用openlog是可选择的。通过调用openlog,可以指定ident参数。如果不调用openlog,则在第一次调用syslog时,自动调用openlog。
调用closelog也是可选择的,它只是关闭被用于与syslog守护进程通信的描述符。

void syslog(int priority, char *format, ...);   
打开连接后,随便可以调用syslog函数写日志。
priority,它是由severity level和facility组成的(如LOG_USER|LOG_DEBUG)。
severity level,消息的重要级别,它主要包括:
  LOG_EMERG:紧急状况
  LOG_ALERT:高优先级问题,比如说数据库崩溃等,必须要立即采取反应行动
  LOG_CRIT:重要状况发生,比如硬件故障
  LOG_ERR:错误发生
  LOG_WARNING:警告发生
  LOG_NOTICE:一般状况,需要引起注意
  LOG_INFO:信息状况
  LOG_DEBUG:调试消息
format,与printf的第一个参数类似,增加了%m可以直接打印errno对应的信息。
  
在实际使用中,如果我们的程序要使用系统日志功能,只需要在程序启动时使用openlog函数来连接syslogd程序,后面随时用syslog函数写日志就行了。


void closelog(void);
虽然该函数的使用和调用情况非常简单,但是是必不可少的,因为在Linux系统中,打开的日志也是资源,如果只使用openlog函数打开日志,而忘记使用closelog关闭日志的话,当打开的日志数量累积到一定程度,便会造成内存不足,从而引起系统问题。

6.远程syslog服务配置
a.服务端配置

修改/etc/sysconfig/syslog 文件:
# vi /etc/sysconfig/syslog
将SYSLOGD_OPTIONS="-m 0" 修改成:SYSLOGD_OPTIONS="-r -m 0"
-r 表示启用记录远程主机的日志。

b.客户端配置

修改/etc/syslog.conf文件
# vi /etc/syslog.conf
authpriv.*     @192.168.0.1 表示将本机的登录日志记录到192.168.0.1这台服务器上。
要记录其它类型的日志类似

c.重启服务
修改配置文件后必须重启服务才能生效。
#/etc/init.d/syslog restart

#service syslog restart
原创粉丝点击