背景及目标

游戏平台每天产生上千万条牌局结算日志(包括跑得快PDK、斗地主DDZ等各种游戏),这些日志未非结构化数据。很多时候,我们需要依据这些日志制定各种业务服务,如道具、礼包等。

不同的业务服务(如只针对PDK游戏提供优惠礼包服务),需要的日志可能是不同的,如果将所有的日志全部塞给业务服务,交由业务服务区筛选,那么业务服务需要承担太多不必要的压力(一千万条日志中,需要的可能只有一千条)。

因此,想要一个实现游戏日志处理系统,实现如下功能:

  • 监控日志文件,收集日志。
  • 处理日志:非结构化转为结构化数据(如JSON)。
  • 输出结构化数据到消息中间件。
  • 业务服务可以从消息中间件中获取自己想要的消息。

技术方案

  • 游戏事件(日志)收集:filebeat(6.2.4版本)
  • 事件处理:logstash(6.2.3版本)
  • 消息中间件:kafka(1.1.0版本)

filebeat收集事件

虽然logstash也可以收集日志,且有很多丰富的输入、处理、输出插件,但是logstash相对于filebeat来说会消耗更多的服务器资源,这些logstash如果部署在应用服务其中,可能对应用服务带来影响(抢资源)。

filebeat则是及其轻量级的,占用资源少,适合分布在各个应用服务上收集日志,并将收集到的日志发送到logstash服务。另外,filebeat具有调节发送速度的功能,当logstash处理不过来时,filebeat会降低发送速度,因此不需要类似于中间缓冲队列等机制。

基于此,本系统中选用filebeat而不是logstash来收集日志。

filebeat安装

官方说明

以mac OS 系统为例:

curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-darwin-x86_64.tar.gz
tar xzvf filebeat-6.2.4-darwin-x86_64.tar.gz

filebeat配置

官方配置说明

filebeat的配置文件:filebeat.yml,其中主要内容为:

#============= Filebeat prospectors ===============
# 探测器配置,即filebeat的输入

## 配置一个探测器
filebeat.prospectors:
    ## 探测器类型:日志
    - type: log
      ## 是否启用该探测器
      enabled: true
      ## 日志文件路径,当前不支持递归监控某个目录及其子目录下的所有文件。
      ## 要监控子目录,则可以配:/var/log/*/*.log
      paths:
        - /var/log/*.log
      ## 去掉正则表达式列表中的行
      exclude_lines: ['^DBG', '^D2']
      ## 包含正则表达式列表中的行
      include_lines: ['^ERR', '^E2']
      ## 去掉正则表达式列表中匹配的文件
      exclude_files: ['.gz$']
      
#============================= 其他配置(和本系统关系不大,略) ====================

#================================ Outputs =====================================
# 输出配置,可输出到诸如logstash,elasticsearch,kafka等服务或中间件。

## 输出到logstash

output.logstash:
  # 目标logstash的服务地址及端口
  hosts: ["localhost:5044"]

本系统中,暂时没有用到复杂、高阶的filebeat配置,仅简单地配置输入(日志文件)和输出(logstash)。
更详细的配置可以参见官方说明。

另外,filebeat提供了一些预定义的模组(module),可快速地对诸如nginxmysql的日志进行收集。

注意:只能配置一个output

filebeat启动

官方文档

以mac OS为例:

./filebeat -e -c filebeat.yml -d "publish"

logstash接收事件

filebeat收集到的事件要想推送到logstash,除了要在filebeat.yml的output中配置之外,还需要在logstashinput模块中配置beats

input {
    ## 来自于filebeat的事件作为输入
    beats {
        ## 端口与filebeat中filebeat.yml文件output中配置的端口一致。
        port => 5044
    }
}

启动logstash服务、filebeat服务之后,往/var/log/目录中的日志文件中写入日志,如:

echo "test info ..." >> /var/log/test.log

就能在filebeat的运行日志中,看到相关内容,也可以在logstash的输出中看到相应事件。

关于logstash的配置文件,将在后续的博客中详细介绍。

小结

filebeat 还有很多高阶特性(如一些方便的模组)可以使用,这里只是简单地介绍了一种常用的用法。

在后续的文章中,将使用logstash来处理从filebeat过来的数据。


SnaiLiu
36 声望11 粉丝