Halo

A magic place for coding

0%

Graylog环境搭建

Graylog简介

  Graylog是一个开源的日志聚合分析审计展现预警的工具。相比起ELK要更加简洁和高效,因为其部署使用简单的缘故,越来越多地被工业界使用,成为日志管理的首选工具。

  Graylog的架构非常简单,大致上由三部分组成:

  • MongoDB:用于存储Graylog的配置

  • ElasticSearch:日志文件的持久化与检索功能

  • Graylog:提供对外接口,Web界面

    Graylog Architecture

Graylog环境搭建–Windows

Platform: Windows10

Environment: Docker for Windows

  在这一部分,我将分享如何在windows上搭建起graylog环境来收集日志。首先要有windows上的docker环境(如果没有配置,请参考传送门),因为我们使用docker来运行graylog。

步骤

  1. 新建docker compose文件,命名为docker-compose.yml,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    version: '2'
    services:
    graylog-mongo:
    restart: always
    image: mongo:3.6.4
    container_name: graylog-mongo
    graylog-elasticsearch:
    restart: always
    image: elasticsearch:5.6.9
    container_name: graylog-elasticsearch
    environment:
    - http.host=0.0.0.0
    - transport.host=localhost
    - network.host=0.0.0.0
    # Disable X-Pack security: https://www.elastic.co/guide/en/elasticsearch/reference/5.6/security-settings.html#general-security-settings
    - xpack.security.enabled=false
    - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
    memlock:
    soft: -1
    hard: -1
    mem_limit: 1g
    # Graylog: https://hub.docker.com/r/graylog/graylog/
    graylog:
    restart: always
    image: graylog/graylog:2.4.5-2
    container_name: graylog
    environment:
    # password pepper
    - GRAYLOG_PASSWORD_SECRET=gr8r3hbnvfs73b8wefhweufpokdnc
    - GRAYLOG_ROOT_USERNAME=admin
    # Password: admin
    - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
    # elasticsearch host
    - GRAYLOG_ELASTICSEARCH_HOSTS=http://graylog-elasticsearch:9200
    # mongo host
    - GRAYLOG_MONGODB_URI=mongodb://graylog-mongo/graylog
    # time zone
    - GRAYLOG_ROOT_TIMEZONE=Asia/Shanghai
    - GRAYLOG_WEB_ENDPOINT_URI=http://127.0.0.1:9000/api
    - GRAYLOG_WEB_LISTEN_URI=http://0.0.0.0:9000/
    - GRAYLOG_REST_LISTEN_URI=http://0.0.0.0:9000/api
    depends_on:
    - graylog-mongo
    - graylog-elasticsearch
    ports:
    # Graylog web interface and REST API
    - 9000:9000
    # Syslog TCP
    - 514:514
    # Syslog UDP
    - 514:514/udp
    # GELF TCP
    - 12201:12201
    # GELF UDP
    - 12201:12201/udp

    可以看到上面的文件主要有三个服务:graylog-mongograylog-elasticsearchgraylog,对应了graylog架构中的三个部分,每一个部分我们都启动一个docker来运行。这里大部分的配置信息都是参考https://github.com/kwkwc/dockerSH/blob/master/services/graylog/config/graylog.conf,并不需要做过多的改动。注意`graylog`这个服务下有一个`depends_on`的配置项,意思是`graylog`的启动需要依赖于前面两个服务的启动。`GRAYLOG_ROOT_PASSWORD_SHA2`这个是密码,是`admin`这个字符串经过SHA256加密后的结果。

  2. 打开命令行,进入到配置文件所在的文件夹,运行:

    1
    docker-compose up -d

    初次运行需要拉去镜像,会比较慢。运行结果如图:

    graylog start

    通过docker ps命令我们可以看到确实有三个docker容器在运行,说明graylog服务已经成功启动了。

  3. 打开浏览器,输入http://127.0.0.1:9000,就可以看到graylog的界面,登录用户名和密码都是admin。然后就能看到主页面了。

    Gralog MainPage

  4. 接着配置输入点,点击System/Inputs -> Inputs

    Graylog Set Inputs

  5. 点击Select Input后选择GELF UDP,这是日志的格式,然后点击Launch new input。接着设置日志来源的Node和Title,其余的使用默认的就可以了。

    Graylog Lauch new input

  6. 然后我们在主页面就能够看到有一个Local Inputs在运行了。

    Graylog Local Inputs Running

  7. 至此,在windows上我们就使用docker搭建好了Graylog的服务了。


日志收集

收集docker容器内的日志

  搭建好Graylog服务后,我们运行一个demo来测试一下graylog是否能够真正地收集到服务运行的日志。这里我用redis服务作为例子,展示如何使用Graylog收集docker容器的日志。

  1. 编写redis容器的启动文件docker-compose.yml(与上面的分开地方放):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    version: '2'
    services:
    redis:
    restart: always
    image: redis:4.0.10
    container_name: redis
    logging:
    driver: gelf
    options:
    # 将 x.x.x.x 替换成你的 IP
    gelf-address: udp://x.x.x.x:12201
    tag: "redis"

    特别注意:IP地址必须使用Node里面的IP地址,点击进入Node里面查看即可。这里不能用localhost或者127.0.0.1,这个docker容器的网络通讯策略有关。

  2. 运行docker-compose up -d,启动Redis容器

  3. 然后再回到Graylog中,点击Search就能看到系统运行的日志了,当然这里只有启动的日志。

    Graylog Collect Log from Redis

收集非docker容器的日志

  上面看到收集docker容器的日志是非常简单的,在运行docker的时候配置就可以了。如果要收集非docker容器的日志,那么通常需要使用第三方的插件。这里我以一个flask应用为例(Python),展示如何手机非docker容器的日志。

  1. 在一个已有的flask项目中安装graypy插件:

    1
    pip install graypy
  2. 然后在代码中使用,这里我把log的初始化封装成一个函数,返回一个logger,方便全局使用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import logging
    import graypy

    def init_logger():
    # init logger for Graylog
    logger = logging.getLogger()
    logger.setLevel(logging.INFO)
    handler = graypy.GELFUDPHandler('localhost', 12201)
    logger.addHandler(handler)
    return logger

    其实原理就是在logging的基础上,添加了一个handler,这里使用到了graypy.GELFUDPHandler,指定了以UDP的方式向Graylog发送GELF类型的日志,后面的参数是host主机和端口号,与Graylog服务中设置的要保持一致。

  3. 简单的使用例子:

    1
    2
    logger = init_logger()
    logger.info('this is a log')
  4. 然后运行这个flask服务,打开Graylog就能看到日志的输出了。

    Graylog Flask


Graylog环境搭建–CentOS

Platform: CentOS 7.5

Environment: Docker 19.03.5

  CentOS下的搭建原理与步骤与windows下基本一致,我们只需要对个别地方稍作修改。

  1. 修改docker-compose.yml中graylog的GRAYLOG_WEB_ENDPOINT_URI

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    graylog:
    restart: always
    image: graylog/graylog:2.4.5-2
    container_name: graylog
    environment:
    # password pepper
    - GRAYLOG_PASSWORD_SECRET=gr8r3hbnvfs73b8wefhweufpokdnc
    - GRAYLOG_ROOT_USERNAME=admin
    # Password: admin
    - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
    # elasticsearch host
    - GRAYLOG_ELASTICSEARCH_HOSTS=http://graylog-elasticsearch:9200
    # mongo host
    - GRAYLOG_MONGODB_URI=mongodb://graylog-mongo/graylog
    # time zone
    - GRAYLOG_ROOT_TIMEZONE=Asia/Shanghai
    - GRAYLOG_WEB_ENDPOINT_URI=http://x.x.x.x:9000/api # x.x.x.x为服务器IP地址
    - GRAYLOG_WEB_LISTEN_URI=http://0.0.0.0:9000/
    - GRAYLOG_REST_LISTEN_URI=http://0.0.0.0:9000/api
    depends_on:
    - graylog-mongo
    - graylog-elasticsearch
    ports:
    # Graylog web interface and REST API
    - 9000:9000
    # Syslog TCP
    - 514:514
    # Syslog UDP
    - 514:514/udp
    # GELF TCP
    - 12201:12201
    # GELF UDP
    - 12201:12201/udp
  2. 运行后我们在浏览器访问的地址为:x.x.x.x:9000(同样地,x.x.x.x为服务器IP地址)。

  3. 其他的操作与上面一致,我们就能在Search中看到log输出了。

总结

  以上就是有关graylog的搭建以及简单的使用,我们还可以在graylog中进行审计、展现和预警,这些之后有时间我会一一分享。本篇博文长期更新,欢迎订阅,谢谢您的支持!


Reference

  1. Graylog Documentation
  2. Graylog Website

Welcome to my other publishing channels