syslog日志服务

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/LLZK_/article/details/69945366
syslog介绍

syslog是一种标准工业协议, 也可以说它是一款服务,它可以用来记录UNIX主机系统设备的日志信息,也可以检测网络设备,如交换机,路由器等。syslog协议也可以实现机器间通信,继而分析这些网络日志行为,追踪和掌握设备与网络的状况。
syslog所产生的日志不仅可以写往本地,也可以通过网络发送到接受syslog的服务器,实现统一的监控,接受syslog的服务器可以对多个设备的syslog消息的服务器进行统一的存储,或者解析其中的内容做相应的处理。

应用场景:网络管理工具,安全系统管理工具,日志审计系统等。

日志格式
一个完成的syslog日志应该包含产生日志的程序模块(Facility)、严重性(Sevenrity或level)、时间、主机名或IP、进程名,进程ID和正文(描述日志信息)。
在UNIX/Linux系统上可以根据Facility和Sevenrity的组合来决定记录什么样的日志信息以及写入哪个日志文件,或者是否需要发送到一个syslog服务器等。但由于标准制定的较晚,导致syslog的格式是非常随意的,我们有时无法正确解析出日志文件所包含的信息。

一个普通的syslog日志格式:

时间 主机名 进程名 进程ID 正文描述



进程名一般是我们自己指定的一个字符串,在下面将函数时会细讲,进程ID有时候是没有的,这时候中括号也没有。如下图:




我们在上面的格式中并没有看到所谓的程序模块(Facility)、严重性(Sevenrity或level)。这是在我的主机上显示的结果,严格来说在时间的前面应该有一个PRI部分。如下:

PRI 时间 主机名 进程名 进程ID 正文描述

PRI是一个尖括号包含的数字,如:<30> 。
这个数字包含了程序模块(Facility)、严重性(Sevenrity或level),这个数字是由Facility乘以8,再加上Severity后得来的。


日志是如何写入的?

1、Linux C中提供了一套写入日志的接口:openlog,syslog,closelog

2、Linux下每个用户都有一个一直运行的syslog守护进程:



我的理解为,openlog函数负责打开与syslog守护进程通信的描述符,syslog函数负责传入日志信息,syslog守护进程负责分析我们传入的参数,进而决定写入上面样的日志信息,以及写进哪些位置。closelog负责关闭用于于syslog守护进程通信的描述符。


函数分析

#include <syslog.h>
void openlog(const char *ident, int option, int facility);
void syslog(int priority, const char *format, ...);
void closelog(void);

日志的实现主要有以下三个函数:

void openlog(const char *ident, int option, int facility); ---- 打开

参数:
1、ident ---- 传入一个信息,加载每条日志里面,这个参数就是可以由我们指定的进程名。
2、option ---- 打开方式,一般以或(|)的方式指定多种打开方式

     LOG_CONS:如果信息发送给syslogd时发生错误,直接将信息输出到终端
     LOG_NDELAY立即打开与系统日志的连接(通常,在产生第一条日志信息的情况下才会打开与日记系统的连接)
     LOG_NOWAIT在记录日志信息时,不等待可能的子进程的创建
     LOG_ODELAY类似于LOG_NDELAY,日记系统在调用syslog函数时才创建
     LOG_PERROR将信息写入日志的同时,也发送到标准错误输出
     LOG_PID每条日志信息包括进程号

3、facility ---- 指定写入的数据类型

     LOG_AUTH——认证系统:login、su、getty等
     LOG_AUTHPRIV——同LOG_AUTH,但只登录到所选择的单个用户可读的文件中
     LOG_CRON——cron守护进程
     LOG_DAEMON——其他系统守护进程,如routed
     LOG_FTP——文件传输协议:ftpd、tftpd
     LOG_KERN——内核产生的消息
     LOG_LPR——系统打印机缓冲池:lpr、lpd
     LOG_MAIL——电子邮件系统
     LOG_NEWS——网络新闻系统
     LOG_SYSLOG——由syslogd(8)产生的内部消息
     LOG_USER——随机用户进程产生的消息
     LOG_UUCP——UUCP子系统
     LOG_LOCAL0~LOG_LOCAL7——为本地使用保留

void syslog(int priority, const char *format,...);  --- 使用

参数:
priority ---- 指明日志信息的严重级别优先级类型,有以下几种选项:
     LOG_EMERG——紧急情况
     LOG_ALERT——应该被立即改正的问题,如系统数据库破坏
     LOG_CRIT——重要情况,如硬盘错误
     LOG_ERR——错误
     LOG_WARNING——警告信息
     LOG_NOTICE——不是错误情况,但是可能需要处理
     LOG_INFO——情报信息
     LOG_DEBUG——包含情报的信息,通常旨在调试一个程序时使用

format---指定要写入的数据,示例如下:

syslog(LOG_INFO, "%d, log info test...", count);

void closelog(void);  ---- 关闭

示例代码

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

  17. }  



配置文件

syslog日志服务的主要文件有以下两个:
1、/var/log --- 日志文件保存在此目录下
根据不同的类型,分有不同的日志文件:
dmesg  内核引导信息日志
message 标准系统错误信息日志 (上述分析的日志格式就是按照此类型分析的)
maillog 邮件系统信息日志
cron 计划任务日志
secure 安全信息日志

2、/etc/syslog.conf或者/etc/rsyslog.conf  ---- 配置文件

主要内容如下:


# rsyslog v5 configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### MODULES ####

$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imklog   # provides kernel logging support (previously done by rklogd)
#$ModLoad immark  # provides --MARK-- message capability

# Provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514

# Provides TCP syslog reception   ## 指明syslog服务提供TCP网络日志的接受
#$ModLoad imtcp
#$InputTCPServerRun 514  ## 端口514


#### GLOBAL DIRECTIVES ####

# Use default timestamp format
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

# File syncing capability is disabled by default. This feature is usually not required,
# not useful and an extreme performance hit
#$ActionFileEnableSync on

# Include all config files in /etc/rsyslog.d/
$IncludeConfig /etc/rsyslog.d/*.conf

##### 重要的是下面这部分,指明了不同类型日志存放的位置
#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog
# Log cron stuff
cron.*                                                  /var/log/cron
# Everybody gets emergency messages
*.emerg                                                 *
# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log


注意,我用加粗标注的信息,每条信息都可分为两部分,日志类型----存放路径。
日志类型可分为两个字段:选择条件,重要级。两者之间用点(.)隔开。
选择条件:
选择条件是对消息类型的一种分类,这种分类便于人们把不同的消息发送到不同的位置。syslog配置上允许出现一个以上的选择条件,不同条件之间必须以分好(;)隔开。

kern                内核信息;
user                用户进程信息;
mail                电子邮件相关信息;
daemon          后台进程相关信息;
authpriv            包括特权信息如用户名在内的认证活动;
cron                计划任务信息;
syslog          系统日志信息
lpr             打印服务相关信息。
news            新闻组服务器信息
uucp                uucp 生成的信息
local0----local7        本地用户信息

重要级:
表示消息的紧急程序。下面按严重程度由低到高。

debug       不包含函数条件或问题的其他信息
info            提供信息的消息
none        没有重要级,通常用于排错
notice      具有重要性的普通条件
warning     预警信息
err         阻止工具或某些子系统部分功能实现的错误条件
crit            阻止某些工具或子系统功能实现的错误条件
alert           需要立即被修改的条件
emerg       该系统不可用
不同的服务类型有不同的优先级,数值较大的优先级涵盖数值较小的优先级,比如,只指定了一个“notice”,而没有指定其他,其实默认涵盖了“debug”“info”“none”。

存放路径
日志信息可被记录到多个文件里,还可以发送端命名管道,其他程序深圳另一台机器。
主要如下:
file                    指定文件的绝对路径
terminal 或 prin        完全的串行或并行设备标志符
@host(@IP地址)    远程的日志服务器







猜你喜欢

转载自blog.csdn.net/LLZK_/article/details/69945366