syslog的点滴--集中处理日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:
syslogd和klogd是很有意思的守护进程,syslogd是一个分发器,它将接收到的所有日志按照/etc/syslog.conf的配置策略发送到这些日志应该去的地方,当然也包括从klogd接收到的日志,klogd首先接收内核的日志,然后将之发送给syslogd,klogd是怎么接收内核的日志,接收到的日志又是怎么发给syslogd的呢?过程其实很简单,klogd通过读取/proc/kmsg来接收内核的日志,通过strace -p可以看到:
read(0, "<6>ACPI: PCI interrupt 0000:05:0"..., 4095) = 95
time([1278013550])                      = 1278013550
write(1, "<6>Jul  1 15:45:50 kernel: ACPI:"..., 97) = 97
为了看清楚0和1分别代表什么,看一下/proc文件系统:
ll /proc/XX/fd/
total 3
lr-x------    1 root     root           64 2010-07-01 15:43 0 -> /proc/kmsg
lrwx------    1 root     root           64 2010-07-01 15:43 1 -> socket:[7974]
lr-x------    1 root     root           64 2010-07-01 15:43 2 -> /boot/System.map...
或者通过lsof -p XX查看也是可以的。经过解析命令的输出,发现klogd从/proc/kmsg中读取了内核信息,然后写入了一个套接字,这个套接字的另一端肯定是syslogd使用的套接字,并且syslogd肯定从该套接字的另一端接收了数据,用strace和lsof/ll /proc/YY/fd/证实一下:
ll /proc/YY/fd
total 18
lrwx------    1 root     root           64 2010-07-01 15:21 0 -> socket:[4146]
l-wx------    1 root     root           64 2010-07-01 15:21 1 -> /var/log/auth.log
...
l-wx------    1 root     root           64 2010-07-01 15:21 8 -> /var/log/uucp.log
l-wx------    1 root     root           64 2010-07-01 15:21 9 -> /var/log/mail.info
确实是这样的,syslogd中确实使用了一个套接字,为了证实确实从该套接字接收到了klogd发来的数据,在两个终端上同时strace -p syslogd和klogd,然后加载一个驱动或者自己写一个printk的内核模块,然后观察两个终端的输出,确实klogd从0读出了信息abc,然后写入了1,syslogd从0读出了abc,然后写入了一个配置好的日志文件,它们之间是通过套接字来完成通信的。同样的,库函数syslog将klogd的大致过程进行了封装,这样任何程序都可以调用syslog函数进行日志记录了,syslogd成了整个系统统一的一个日志记录器,下面是在syslog的manpage上得到的函数原型:
void openlog(const char *ident, int option, int facility); //ident设置为一个可被过滤的特征字符串,一般为应用程序的名字
void syslog(int priority, const char *format, ...);
void closelog(void);
此处的syslog库函数内部实现的就是套接字发送过程,没有什么好说的,可是千万不要将这个syslog和linux的系统调用sys_syslog搞混淆了,后者的原型是:
asmlinkage long sys_syslog(int type, char __user *buf, int len);
而dmesg调用的正是这个函数,该函数内部通过type分成了若干个类型,其实klogd也是可以通过直接调用这个函数来实现的(/proc/kmsg的read方法就是调用do_syslog,而sys_syslog也是调用do_syslog)。
     syslogd和syslog库函数中使用的套接字就是unix族套接字,是unix本地进程间通信的一种好办法,这种套接字必须有一对,本质上实现了一个管道,在接口和语义上又和bsd套接字相统一,实际上bsd套接字没有网络的概念,它只承认自己可以实现进程间通信,它将网络通信也统一看作了进程间通信,只是后来的AF_INET等实现的不同机器间的进程间通信,而原始的AF_UNIX实现的是本机的进程间通信。既然AF_UNIX实现了本机的进程间通信,那么它的地址只需要本机内唯一即可,因此采用普通文件是一个不错的选择,其地址就是文件的全路径:
struct sockaddr_un {
    sa_family_t  sun_family; 
    char         sun_path[UNIX_PATH_MAX]; //文件路径
};
比如syslogd使用的/dev/log就是一个处于一般文件系统的套接字。套接字创建函数socket的第二个参数是类型,AF_UNIX族的套接字也分stream类型和datagram类型,只是在语义约束上松了很多,datagram仅仅在数据边界等不多的方面和stream类型的套接字有区别,有无连接的概念已经退化了。不管是stream还是datagram类型的AF_UNIX套接字,send的本质就是将数据放入接收者的接收队列,recv则相反。

     上述套接字和管道的区别是什么?仅仅是使用时的语义不同,管道的约束很少,也不很规范,很难扩展,而套接字拥有地址空间的概念,有协议的概念,很容易进行扩展,并且语义也很清晰。也正是这种统一,使得syslog很容易支持远程日志记录,本机日志记录和远程记录都使用套接字,所不同的只是套接字的地址族不同,这样很多编码都可以参数化,配置化,不必再写冗余的代码了。


 本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1271806


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
4月前
|
安全 Ubuntu Unix
/var/log/syslog日志说明
`/var/log/syslog`是Unix和Linux的日志文件,记录系统事件和消息,由`syslogd`或`rsyslogd`生成。日志条目含时间戳、主机名、PID、日志级别(如DEBUG、ERROR)和事件描述。内容涵盖系统启动/关闭、硬件错误、网络、用户登录、安全事件等。查看日志可使用`cat`、`tail`、`less`或`grep`命令。不过,不同Linux发行版可能有变,如Ubuntu使用`journald`和`journalctl`。
398 3
|
22天前
|
存储 网络协议 Linux
在Linux中,如何通过syslog进行远程日志转发?
在Linux中,如何通过syslog进行远程日志转发?
|
2月前
|
Unix Python
Python代码示例:使用`syslog`模块进行日志记录
Python代码示例:使用`syslog`模块进行日志记录
|
4月前
|
运维 安全 Ubuntu
`/var/log/syslog` 和 `/var/log/messages` 日志详解
`/var/log/syslog` 和 `/var/log/messages` 是Linux系统的日志文件,分别在Debian和Red Hat系发行版中记录系统事件和错误。它们包含时间戳、日志级别、PID及消息内容,由`rsyslog`等守护进程管理。常用命令如`tail`和`grep`用于查看和搜索日志。日志级别从低到高包括`debug`到`emerg`,表示不同严重程度的信息。注意保护日志文件的安全,防止未授权访问,并定期使用`logrotate`进行文件轮转以管理磁盘空间。
1502 1
|
数据采集 网络安全
syslog日志接口调试方法
日志数据采集,比较方便常用的就是通过syslog来进行数据采集,syslog可以通过udp协议来进行高效的数据传输。一般来说在工程实施的过程中需要对接对端系统的数据采集源可以通过以下步骤来进行syslog日志接口的调试。主要是验证syslog日志是否能正常送到指定的日志服务器的指定端口,日志服务器的指定端口是否能正常收到对端发过来的日志。
240 0
syslog日志接口调试方法
|
4月前
|
数据采集 监控 网络协议
使用函数计算(FC)通过Syslog协议投递日志
本文主要介绍一种使用函数计算(FC)通过Syslog协议投递日志的方法。
134 0
使用函数计算(FC)通过Syslog协议投递日志
|
运维 网络协议 Ubuntu
flume 通过syslog协议读取系统日志
flume 通过syslog协议读取系统日志
|
4月前
|
弹性计算 监控 网络协议
使用ECS通过Syslog协议投递日志到SIEM
Syslog是一个常见的日志通道,几乎所有的SIEM(例如IBM Qradar, HP Arcsight)都支持通过Syslog渠道接收日志。本文主要介绍如何通过Syslog将日志服务中的日志投递到SIEM。
115 0
使用ECS通过Syslog协议投递日志到SIEM
|
负载均衡 应用服务中间件 Linux
只能使用UDP:514端口接收Syslog日志的两种解决方法
只能使用UDP:514端口接收Syslog日志的两种解决方法
2898 0
只能使用UDP:514端口接收Syslog日志的两种解决方法
|
前端开发 网络安全
使用EVE-NG模拟山石网科防火墙syslog日志接入GrayLog4.1(下)
使用EVE-NG模拟山石网科防火墙syslog日志接入GrayLog4.1(下)
1115 0
使用EVE-NG模拟山石网科防火墙syslog日志接入GrayLog4.1(下)