且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

《日志管理与分析权威指南》一3.2.1 syslog

更新时间:2022-10-04 23:19:31

本节书摘来华章计算机《日志管理与分析权威指南》一书中的第3章 ,第3.2.1节,(美) Anton A. Chuvakin Kevin J. Schmidt Christopher Phillips 著 姚 军 简于涵 刘 晖 等译更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.2.1 syslog

在第1章和第2章中你已经看到了syslog消息示例。本节更多的是关于协议本身的。syslog被Unix内核和许多应用程序用来记录日志消息,它最初是用于收集调试信息的。因此,它对于安全日志分析有一些限制,不是最优的。尽管如此,syslog已经成为了基于UNIX的系统中记录应用程序事件的最常用方法。
syslog包含syslog守护进程(syslogd)。它通常分别在开机和关机时启动和停止。应用程序通过syslog(3)库调用与syslogd通信。syslogd通过Unix域套接字从应用程序和内核接收日志记录syslogd还可以选择通过端口514上的UDP消息,从远程主机接收数据。现代版本和syslog替代品(如rsyslog和syslog-ng)还能使用TCP。
syslogd的行为由配置文件控制,这个文件通常是/etc/syslog.conf。守护进程从Unix域套接字(domain socket)/dev/log(在不同的Unix/Linux变种中,该名称可能不同)读取日志消息,并写入一个或者多个输出文件,或者通过UDP将日志转发到一台收集主机。对配置文件的更改需要发送一个SIGHUP到syslogd进程,重新读取新配置。
syslog通常在系统自举时启动,但是可以运行“syslogd”手工启动。syslogd的标准参数可以指定配置文件的位置、“标记时间间隔”(下文将作解释)、是否接收来自网络的数据以及Unix域套接字的路径。选项的特殊名称在不同的Unix/Linux变种中各有不同。例如,Linux使用“-r”启用从主机接收日志(“remote”),而OSX使用“-u”。有些版本的syslogd自动接受远程消息,不需要任何命令行参数。这些选项通常有默认值,命令行参数用于覆盖默认值。特定于操作系统的信息可以查询本地的man页面。
默认syslogd配置文件(/etc/syslog.conf)的内容在不同发布版本中也不一样。大部分配置默认情况下不记录所有日志,有些对不同的程序记录不同的日志信息。你应该总是检查syslog配置文件,以确定日志中是否记录了你需要的信息。
1.用syslogd记录基本日志
那么,如何用syslogd中开始日志记录?我们建议采用一种简单的方法:将所有日志记录到本地主机上的一个文件中(我们将在后面讨论长期记录所有信息是不是好主意)。将所有日志记录到单一文件有两个好处。首先,你可以浏览一个文件查看所有日志信息。如果你不知道记录了什么,那么如何做出应该把“什么”记录到“哪里”的决策?其次,因为后面我们将把这些消息转发到一个集中日志主机,本地拷贝保留下来用于故障排除和备份用途。
要在一个文件中记录所有日志,可以在syslog.conf中加入如下文本(含义和语法将在后面解释):
《日志管理与分析权威指南》一3.2.1 syslog

如果你喜欢,可以使用不同的路径名,这里使用的只是为了举例。如果选择不同路径名,你可能必须创建这个(空)文件,然后syslog才能写入它(我们将在本章后面更多地讨论它)。
你可以注释掉文件中的其他行,避免多余地将相同的信息写到一个以上的文件中。在你想要注释或者禁用的行前面添加一个“#”。
用ps获取syslog守护进程(syslogd)的进程ID:
《日志管理与分析权威指南》一3.2.1 syslog

向该进程发送一个SIGHUP:
《日志管理与分析权威指南》一3.2.1 syslog

查看文件/var/log/messages,你应该看到如下消息:
《日志管理与分析权威指南》一3.2.1 syslog

这条消息后面可能还跟着许多其他消息。这就对啦!你现在正在记录发送到syslog守护进程的所有信息。值得注意的是,在某些Unix版本上,syslog守护进程默认不监听来自远程系统的入站请求。这意味着,具备可发送syslog日志消息的应用程序的远程系统无法在中心位置(也就是集中日志服务器)记录日志。在大部分情况下,需要在启动时向syslog守护进程传递一个特殊标志。想起来了吧,在大部分Linux上是“-r”选项,而OS-X使用-u选项。查询你的syslog守护进程手册确定该选项。
很快,我们将讨论日志文件中看到的消息的含义。但是现在,我们将从配置的角度解释你刚刚进行的操作。
2.syslog消息分类
syslog消息有两个属性供syslogd使用,以决定如何路由它们:设施和优先级。设施用于指定消息生成位置的一般分类。
设施是一个固定集合中的一项,你不能制作自己的设施并开始使用它。你可以使用的设施集合包括:
《日志管理与分析权威指南》一3.2.1 syslog

这些设施的名称在不同的Unix/Linux发布版本中稍有不同,有些操作系统有少数其他系统没有的分类。例如,OS-X有一个名为“install”的设施。Solaris 9没有“syslog”或者“authpriv”设施。你可以查询操作系统的man页面。
注意,由应用程序程序员选择设施,因此对这一选择没有任何限制。即使程序不是邮件程序或者内核程序,程序员也可以选择使用Mail设施或者Kern设施。
3.“Mark”设施
“Mark”是一个特殊设施,这个设施由syslog内部使用,在固定间隔内生成一个标记消息,如:
《日志管理与分析权威指南》一3.2.1 syslog

标记设施的目的是验证syslog守护进程正在工作,即使没有接收到任何消息。标记消息对于监控系统是否正常运行以及确定主机何时崩溃很有用,你可以使用崩溃前的最后一个标记消息的时间来(粗略)确定故障时间。
如果在命令行上没有指定,默认的时间间隔是20分钟,但是有些发布版本的启动脚本完全关闭标记消息(将消息时间间隔设置为0)。
4.syslog优先级
消息的优先级表示消息的重要性。
可用的优先级如下(按照敏感性递增的顺序):

  • debug.
  • info.
  • notice.
  • warn.
  • err.
  • crit.
  • alert.
  • emerg.

同样,与指定事件相关的优先级也是由应用程序的程序员选择的,所以不能保证它真正意味着严重性。
设施和优先级的实际应用是syslog守护进程用它来形成消息过滤的基本形式。这种过滤在syslog.conf文件中规定。
5.syslog.conf
syslog.conf文件包含如下格式的一行或者多行:
《日志管理与分析权威指南》一3.2.1 syslog

指定所在行适用的消息类型,指定这条消息与什么操作有关。
(选择器)是设施和优先级的组合,以句点分隔,如daemon.debug。选择器将匹配指定优先级或者更高优先级的该设施的所有消息。这意味着kern.info匹配从kern.info开始到kern.critf(或者最高优先级)的所有消息。传统的syslog不允许指定单个优先级匹配,只能指定最低优先级匹配通过逗号分隔,可以为单个优先级指定多个设施,例如,daemon,lpr.debug指定daemon.debug和lpr.debug。“”可以用于代替设施名,指定所有设施。多个选择器可以用“;”分隔,放在同一行里,例如daemon,info;mail.crit。最后,“none”关键字可以作为优先级,它将取消同一行上的任何选择器,这可以用于和通配符配合,选择除了特定设施以外的所有设施,例如“.info;mail.none”将选择info优先级上除了邮件设施之外的所有设施的消息。
选择器和操作(action)由字符分隔。虽然新版本的syslogd除了外还接受,但是如果在一行上出现,旧版本的syslogd将会崩溃。
对于选择器所采取的操作可以是如下三种之一:将消息附加到一个文件或者管道、转发消息到另一台主机上的syslogd以及将消息写入用户终端。
最常用的操作是指定文件的完整路径,将消息附加到一个文件。例如:
《日志管理与分析权威指南》一3.2.1 syslog

在许多syslogd版本上,该文件必须已经存在,syslogd才能写入它;该文件如果不存在,syslogd不会创建它。如果文件不存在,你可以用touch<文件名>或者cp/dev/null<文件名>来创建文件(使用touch的好处是如果文件已经存在,该文件不会被损坏,这对于shell脚本很有用)。
可以使用同样的操作,将消息写入设备。最常见的例子是写入系统控制台(/dev/console)。在远古时代,控制台实际上就是硬拷贝终端(例如decwriter),“重要”消息应该被写入控制台,以便在系统崩溃时,管理员能够查看打印输出,并尝试推断崩溃时发生的状况。当然,在那个时代,系统比现在慢得多,运行的设备也较少,所以打印到控制台的信息量是可以控制的。而且,在那个时代,磁盘很昂贵,而纸张则相对便宜。
将日志消息转发到另一台主机通过在主机名前加上“@”作为操作来完成,例如:
《日志管理与分析权威指南》一3.2.1 syslog

日志主机可以是一个主机名,也可以是IP地址。指定IP地址的好处是syslog守护进程启动时,消息在DNS不能正常工作的情况下也可以转发。消息通过UDP发送给远程主机,不期待任何响应,所以远程主机的故障也不会使syslogd无法在本地主机上运行(这既有好处又有坏处,我们将在下面讨论)。
最后,第三种可能的操作是将消息写入用户终端。当然,用户必须登录,才能显示消息。这通过在操作中指定用户名完成,例如:
《日志管理与分析权威指南》一3.2.1 syslog

这个例子将导致crit或更高优先级的所有内核消息写入anton所拥有的所有tty。注意,这一操作应该审慎使用,向用户“anton”发送.debug可能使anton非常不愉快。消息可以通过指定“”为操作,发送给所有用户。这种特殊情况通常保留用于非常关键的事件,一般表示即将发生的系统崩溃,如:
《日志管理与分析权威指南》一3.2.1 syslog

有些syslog守护进程有额外的功能,可以通过配置文件控制。例如,有些syslogd允许你限制日志主机可以从哪些主机接受syslog消息。我们建议你阅读系统的Fine Man页面,找出可能拥有的额外功能。
6.标记时间间隔
如上所述,“标记”消息的频率通常可以设置为命令行参数,粒度为一分钟。默认值为20分钟。确定标记消息的“正确”时间间隔需要折中考虑。小的值(如1分钟)将更精确地确定主机(至少syslog守护进程)启动或者停机的时间。但是,如果你有数千台主机每分钟都向集中日志主机发送标记消息,你的网络上就会有巨大的相关流量。但是,你可能希望指定某个标记时间间隔,以便验证syslog真的在工作。
7.syslogd输出
syslogd写入ASCII文本消息,以换行结束。所以阅读该文件不需要特殊的查看器,任何文本查看器都可以使用。不过,我们不建议使用“vi”或者其他编辑器检查日志文件。首先,日志文件可能非常大,你的编辑器可能被堵塞。更重要的是,用文本编辑器阅读日志文件造成不当修改的风险,如果你需要将日志数据用于法律或者商务用途,这是不能接受的。除非你打算修改文件,不在文件上使用文本编辑器是系统管理的好习惯。
8.syslog协议
多年以来,syslog协议的标准RFC是RFC3194(http://www.ietf.org/rfc/rfc3164.txt)。现在,RFC5424(http://tools.ietf.org/search/rfc5424)是新提出的syslog协议标准草案。换言之,RFC5424将淘汰RFC3194。
RFC5424是旧的syslog协议的必要更新。协议中最大的变化之一是遵循RFC3339(http://tools.ietf.org/search/rfc3339)的时间戳规范。旧协议对时间戳没有太多的规定。如果你接收的日志消息包含月、日、时和秒信息,就算运气了。时间戳中通常没有年份信息和时区信息。从分析的角度来说,这造成了很大的困难。RFC5424还在syslog中添加了name=value等结构化数据,显著地简化了自动化日志分析。
我们鼓励你查阅RFC,对协议的概念和功能有基本的感性认识。