我们是ELK和Exchange的朋友。第1部分





我将开始撰写一系列文章,以分享我在连接Exchange和ELK方面的经验。该堆栈将帮助您处理大量日志,并且不奇怪常规日志记录工具将拒绝帮助我们的大小。让我们熟悉一下新战斗机的日志。



Exchange具有相当广泛的日志记录系统。最受欢迎的日志是跟踪日志,它跟踪邮政组织内特定信件的逐步传递;Web服务器日志,该日志跟踪系统中的每个新用户会话,以及具有不同会话粒度程度的特定Web应用程序的日志。Exchange还可以存储原始的smtp,imap和pop3协议日志。



我们可以使用哪些工具来处理日志:



  • 标准Get-MessageTrackingLog cmdlet:方便处理跟踪日志;
  • logparser实用程序:使用伪SQL搜索语言进行日志记录,并且工作相当迅速;
  • 外部SQL Server:在特定情况下(例如,长时间分析数据)。


当我们有几个服务器并且处理的日志量以数十或数百GB为单位时,所有这些工作都很好。但是,如果有数十台服务器,并且日志大小超过1 TB,该怎么办?该方案很可能开始崩溃。



这就是发生的情况:由于超时,Get-MessageTrackingLog开始下降,logparser达到32位体系结构的上限,并且在最不适当的时刻上载到SQL Server的中断,而没有从服务中消化多行异常。



在这里,一个新的参与者进入了场景-ELK堆栈,该堆栈专门为在合理的时间内处理大量原木和可忍受的资源消耗而设计。



在第一部分中,我将详细说明如何连接filebeat,这是ELK堆栈的一部分-负责读取和发送简单的文本文件,不同的应用程序将其日志写入该文本文件。在以下文章中,我们将更详细地介绍Logstash和Kibana组件。



安装



因此,可以从该站点下载filebeat代理的文件归档



我们只需解压缩zip文件的内容即可完成安装。例如,在中c:\Program Files\filebeat然后,您需要运行该install-service-filebeat.ps1工具包随附的PowerShell脚本来安装filebeat服务。



现在,我们准备开始自定义配置文件。



容错



Filebeat保证将日志传送到日志收集系统。这是通过在日志文件中保留条目的注册来完成的。注册表存储有关从日志文件中读取的那些记录的信息,并标记已传递到目标的特定记录。



如果某些记录无法传递,则filebeat将尝试再次发送它,直到它从接收系统接收到传递确认,或者在轮换期间删除了原始日志文件。



重新启动服务后,filebeat将从注册表中读取有关最后读取和传递的记录的信息,并将基于注册表中的信息读取日志文件中的记录。



这使您可以最大程度地降低在意外故障和执行服务器维护操作过程中丢失有关需要发送到Elastic \ Logstash服务器的日志信息的风险。



您可以在以下段落的文档中阅读有关此内容的更多信息:Filebeat如何保持文件状态,Filebeat如何确保至少一次传送?



配置



所有配置都在格式配置文件中完成,该文件yml分为几部分。让我们看看其中一些与从Exchange服务器收集日志有关的内容。



日志处理单元



日志处理块从以下字段开始:



filebeat.inputs:


我们将使用通用的日志收集工具:



- type: log


接下来,我们用日志指示状态(已启用)和文​​件夹路径。例如,对于IIS日志,设置可以如下:



    enabled: true
    paths:
	- C:\inetpub\logs\LogFiles\W3SVC1\*.log
	- C:\inetpub\logs\LogFiles\W3SVC2\*.log


另一个重要的调整是filebeat应该如何读取多行记录。默认情况下,filebeat会将日志文件的一行视为一条记录。只要我们不开始在日志中接收与该服务的错误操作相关的异常,这就会很好地工作。在这种情况下,异常可以跨越多行。因此,如果下一行以日期开头,filebeat应该将多行记录视为一条记录。在Exchange中记录日志的格式如下:日志文件中的每个新记录均以日期开头。在配置中,这种情况如下所示:



multiline:
	pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
	negate: true
	match: after


将标签添加到您发送的帖子中很有意义,例如:



  tags: ['IIS', 'ex-srv1']


并且不要忘记从以哈希符号开头的行中排除:



  exclude_lines: ['^#']


因此,读取日志的块将如下所示:



filebeat.inputs:
- type: log
  enabled: true
  paths:
	- C:\inetpub\logs\LogFiles\W3SVC1\*.log
	- C:\inetpub\logs\LogFiles\W3SVC2\*.log
  multiline:
	pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
	negate: true
	match: after
  tags: ['IIS', 'ex-srv1']
  exclude_lines: ['^#']


日志发送块



Filebeat将日志文件中的各个条目作为json对象发送,其中日志中的特定条目包含在单个消息字段中。如果我们想以某种方式使用此信息,则需要首先将此字段解析为单独的字段。例如,这可以在logstash中完成。它将是filebeat中记录的接收者。这是在filebeat配置文件中的外观:



output.logstash:
  hosts: ["logstash1.domain.com:5044"]


如果有多个服务器,则可以为它们启用平衡:然后,filebeat不会将日志发送到列表中的第一个可用服务器,而是将已发送的日志分发到多个服务器之间:



hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true 


Filebeat在处理登录到发送的json中的日志时,除了消息字段中包含的日志记录外,还会添加一定数量的元数据,这会影响进入弹性文件的大小。可以有选择地从提交中删除此元数据。这是使用处理器在处理器块中完成的drop_fields例如,您可以排除以下字段:



processors:
- drop_fields:
	fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]


应该谨慎地选择排除字段,因为其中一些字段可以用于弹性方面以建立索引。



因此,发送日志的块将如下所示:



output.logstash:
  hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true
 
processors:
- drop_fields:
	fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]


Filebeat日志记录设置



设置以下日志记录设置很有意义:



  • 日志级别信息;
  • 我们将日志写入默认情况下位于文件中(文件目录安装目录中的logs目录);
  • 日志文件名为filebeat;
  • 保留最后10个日志文件;
  • 大小达到1MB时开始旋转。


最后,日志记录设置块将如下所示:



logging.level: info
logging.to_files: true
logging.files:
  name: filebeat
  keepfiles: 10
  rotateeverybytes: 1048576


最终配置



我们已经收集了配置,现在看起来像这样:



filebeat.inputs:
- type: log
  enabled: true
  paths:
    - C:\inetpub\logs\LogFiles\W3SVC1\*.log
    - C:\inetpub\logs\LogFiles\W3SVC2\*.log
  multiline:
    pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}'
    negate: true
    match: after
  tags: ['IIS', 'ex-srv1']
  exclude_lines: ['^#']
 
output.logstash:
  hosts: ["logstash1.domain.com:5044", "logstash2.domain.com:5044"]
  loadbalance: true
 
processors:
- drop_fields:
    fields: ["agent.ephemeral_id", "agent.hostname", "agent.id", "agent.type", "agent.version", "agent", "ecs.version", "ecs", "input.type", "input", "log.offset", "version"]
 
logging.level: info
logging.to_files: true
logging.files:
  name: filebeat
  keepfiles: 10
  rotateeverybytes: 1048576


重要的是要了解配置文件格式为yml。因此,正确放置空格和减号很重要。



Filebeat可以检查配置文件,如果语法包含错误,它将指示语法在哪一行和哪一行不正确。检查如下:



.\filebeat.exe test config


Filebeat还可以检查日志接收器的网络可用性。像这样开始检查:



.\filebeat.exe test output


在下一部分中,我将讨论与Logstash和Kibana组件的Exchange连接和友谊。



有用的链接






All Articles