如何使用rsyslogd将Syslog消息写入MySQL
如何使用rsyslogd将Syslog消息写入MySQL
在本文中,我描述了如何将syslog消息写入MySQL数据库。将syslog消息存储在数据库中通常很方便,尤其是当您打算设置用于查看它们的前端时。本文介绍了使用rsyslogd的方法,rsyslogd是本机支持MySQL的替代增强型syslog守护程序。我描述了需要安装的组件以及如何配置它们。
背景在许多情况下,系统日志数据仅写入文本文件。这种方法具有一些优点,最显着的是它非常快速和有效。但是,无法实时访问存储在文本文件中的数据以进行实时查看和分析。为此,消息需要在数据库中。有多种方法可以将syslog消息存储在数据库中。例如,有些人将syslogd写入文本文件,然后通过单独的脚本将其输入数据库。其他人编写了脚本,这些脚本从非数据库感知的syslogd中(通过管道)获取数据并将其存储在出现时。其他人则使用数据库感知的syslogds并使它们直接将数据写入数据库。在本文中,我使用了“直接写入”方法。我认为它是优越的,因为syslogd本身知道数据库连接的状态,因此可以智能地(希望地)处理它。我之所以使用rsyslogd来完成此任务,仅仅是因为我以数据库感知作为一个目标启动了rsyslog项目。一个警告:虽然数据库中的消息存储为交互式分析提供了极好的基础,但它要付出一定的代价。数据库I/O比文本文件I/O慢得多。这样,仅当您的消息量足够小以允许syslogd,网络和数据库服务器赶上它时,才直接写入数据库才有意义。前段时间,我写了一篇有关优化syslog服务器性能的论文。尽管本文讨论基于窗口的解决方案,但其中的思想足够通用,也可以在此处应用,因此,如果您预期中高流量到高流量,则可能值得一读。如果您预期流量确实很高(或流量峰值非常大),则应认真考虑忘记直接进行数据库写操作。我认为,这种情况需要非常专业的系统或其他方法(在这种情况下,从文本文件到数据库的方法可能会更好一些)。
整体系统设置
如果您决定使用客户端-服务器系统,那么安全地进行此操作将是一个好主意,并且您可能也对我有关SSL加密syslog消息传输的论文感兴趣。
在本文中,我专注于服务器端。如果您正在考虑交互式系统日志消息查看,则可能要集中系统日志。在这种情况下,您有多台计算机(所谓的客户端)将其数据发送到中央计算机(在此情况下称为“服务器”)。当您希望将消息存储在数据库中时,我希望这种设置很常见,但我没有介绍如何设置它。这超出了本文的范围。如果稍加搜索,您可能会发现许多有关如何集中syslog的良好描述。
无论消息如何到达服务器,它们的处理过程始终是相同的,因此您可以将本文与任何说明结合使用,以进行集中的syslog报告。
如我所说,我在服务器上使用rsyslogd。它具有与MySQL数据库对话的内在支持。出于明显的原因,我们还需要运行一个MySQL实例。为了使我们专注,MySQL本身的设置也超出了本文的范围。我认为您已经成功安装了MySQL,并且还有一个前端可以使用它(例如phpMyAdmin)。请确保已安装并且可以正常工作,并且对如何使用它有基本的了解。
设置系统
您需要先下载并安装rsyslogd。从rsyslog站点获取它。确保禁用stocksyslogd,否则您将遇到一些困难。
重要的是要了解rsyslogd如何与数据库对话。在rsyslogd中,有“模板”的概念。基本上,模板是一个包含一些替换字符的字符串,这些替换字符在rsyslog中称为“属性”。通过“属性替换器”访问属性。您可以通过在模板中的百分号之间包含属性名称来访问属性。例如,如果系统日志消息为“Test”,则模板“%msg%”将扩展为“Test”。Rsyslogd支持将模板文本作为SQL语句发送到MySQL。因此,模板必须是有效的SQL语句。该语句可能没有限制,但是有一些显而易见的选择。例如,可以使用带有“droptablexxx”的模板,但没有多大意义。实际上,您将始终在模板内使用“插入”语句。
一个示例:如果您只想存储完整syslog消息的message部分,则可能已经创建了带有单个列“message”的表“syslog”。在这种情况下,好的模板应该是“insertintosyslog(message)values('%msg%')”。在上面的示例中,该字段将扩展为“insertintosyslog(message)values('Test')”。然后,该扩展的字符串将发送到数据库。就是这么简单,没有什么特别的魔术。您唯一必须确保的是模板可以扩展为适当的SQL语句,并且该语句与您的数据库设计匹配。
这是否意味着您需要自己创建数据库架构,还必须完全了解rsyslogd的属性?不,不需要。因为我们期望人们可能更感兴趣于使事情顺利进行,而不是从头开始设计它们,所以我们提供了默认模式及其内置支持。这种模式还提供了一个额外的好处:rsyslog是Adiscon的MonitorWare产品系列的一部分(包括OpenSource和ClosedSource成员)。所有这些工具共享相同的默认架构,并且知道如何对其进行操作。因此,默认架构也称为“MonitorWare架构”。如果使用它,则只需添加phpLogCon(GPLedsyslogWeb界面)连接到您的系统,并具有对数据库的即时交互访问。因此,使用提供的架构有一些好处。
模式定义包含在rsyslog软件包随附的文件“createDB.sql”中。查看它以检查数据库名称是否可接受。请确保不要更改表名和字段名,否则,您将需要自定义rsyslogd的默认SQL模板,本文不会对此进行介绍。然后,使用您最喜欢的MySQL工具运行脚本。仔细检查表是否已成功创建。
接下来,我们需要告诉rsyslogd将数据写入数据库。由于我们将使用默认架构,因此我们不需要为此定义模板。我们可以使用硬编码的代码(rsyslogd处理正确的模板链接),因此我们要做的就是在/etc/rsyslog.conf中添加一条简单的选择器行:
*。*>数据库服务器,数据库名称,数据库用户标识,数据库密码
在许多情况下,MySQL将在本地计算机上运行。在这种情况下,您可以简单地将“127.0.0.1”用于database-server。如果您不需要将MySQL暴露给本地计算机之外的任何进程,则这尤其可取。在这种情况下,您可以简单地将其绑定到127.0.0.1,这提供了非常安全的设置。当然,也支持远程MySQL实例。在这种情况下,请使用远程服务器名称(例如mysql.example.com)或IP地址。默认的数据库名称是“syslog”。如果您修改了默认设置,请在此处使用您的名字。数据库用户标识和-password是用于连接到数据库的凭据。由于它们以明文形式存储在rsyslog.conf中,因此该用户应仅具有尽可能少的特权。只授予它对systemevents表的INSERT特权就足够了。附带说明,强烈建议使rsyslog.conf文件仅可由root读取。如果您将其设置为全球可读,那么每个人都可以获取密码(并最终从中获取其他重要信息)。在我们的示例中,假设您创建了一个名为“syslogwriter”的MySQL用户,其密码为“topsecret”。如果您的MySQL数据库位于本地计算机上,则rsyslog.conf行可能如下所示:
*。*>127.0.0.1,syslog,syslogwriter,topsecret
保存rsyslog.conf,重新启动rsyslogd,您应该看到syslog消息存储在“systemevents”表中。
示例行将每条消息存储到数据库。如果通信量很大,则可能需要限制所记录的消息数。这很容易实现。“写数据库”操作只是常规的选择器行,因此您可以应用常规的选择器行过滤。例如,如果您仅对来自邮件子系统的消息感兴趣,则可以使用以下选择器行:
邮件。*>127.0.0.1,syslog,syslogwriter,topsecret
查看rsyslog.conf文档以获取有关选择器行及其过滤的详细信息。
现在,您已经完成了将系统日志消息存储到MySQL数据库所需的所有操作。如果您想试用前端,则可能需要查看phpLogCon,它在浏览器中显示syslog数据。在撰写本文时,phpLogCon尚不是一个功能强大的工具,但它是开放源代码,因此它可能是您自己的解决方案的起点。
rsyslogd将syslog消息直接写入数据库。这意味着在消息到达时数据库必须是可用的。如果数据库处于脱机状态,没有剩余空间或发生其他问题,则rsyslogd无法写入数据库记录。如果rsyslogd无法存储消息,它将执行一次重试。如果数据库服务器重新启动,这将很有帮助。在这种情况下,先前的连接已断开,但是重新连接立即成功。但是,如果数据库长时间关闭,则立即重试将无济于事。尽管rsyslogd可以重试直到最终成功,但这将产生负面影响。Syslog消息不断进入。如果rsyslogd忙于重试数据库,它将无法处理这些消息。最终,这将导致丢失新到达的消息。
在大多数情况下,rsyslogd不仅配置为写入数据库,而且还可以执行其他操作。在始终重试的情况下,这意味着将不执行其他任何操作,因此rsyslogd的设计仅限于单个重试。如果这样不成功,则不会将当前消息写入数据库,并且MySQL数据库编写器将在短时间内被挂起。显然,这会导致丢失当前消息以及在暂停期间接收到的所有消息,但是这些消息仅在数据库方面丢失(所有其他操作均已正确执行)。尽管不是完美的方法,但我们认为这是比所有动作中所有消息都可能丢失的更好的方法。
简而言之:如果不想丢失消息,请尝试避免数据库停机。
请注意,此限制不是特定于rsyslogd的。实时数据库存储的所有方法都共享此问题区域。
结论:您可以轻松地使用rsyslogd将syslog消息写入MySQL数据库。邮件到达那里后,您可以进行交互地查看和分析它们。在通常的实践中,消息也存储在文本文件中以进行长期存档,并且在一段时间后清空数据库(以避免变得太慢)。如果您希望syslog消息量非常大,则将其实时存储到数据库中的性能可能会超过数据库服务器。在这种情况下,要么过滤掉一些消息,要么考虑使用涉及非实时数据库编写的替代方法(超出了本文的范围)。
本文概述的方法为大多数用例提供了易于设置和易于维护的解决方案,尤其是对于中小型syslog消息量(或快速数据库服务器)的情况。
【版权与免责声明】如发现内容存在版权问题,烦请提供相关信息发邮件至 1439028666@qq.com ,我们将及时沟通进行删除处理。
本站内容除了 98link( http://www.98link.com/ )特别标记的原创外,其它均为网友转载内容,涉及言论、版权与本站无关。