Contents

Graylog 与 Spring Boot 集成

1. 简介

Graylog 是一个日志聚合服务。简而言之,它能够从多个来源收集数百万条日志消息并在单个界面中显示它们。

而且,它还提供了许多其他功能,例如实时警报、带有图形和图表的仪表板等等。

在本教程中,我们将了解如何设置 Graylog 服务器并从 Spring Boot 应用程序向其发送日志消息。

2. 设置灰度日志

有几种方法可以安装和运行 Graylog。在本教程中,我们将讨论两种最快的方法:Docker 和 Amazon Web Services。

2.1. Docker

以下命令将下载所有必需的 Docker 映像并为每个服务启动一个容器:

$ docker run --name mongo -d mongo:3
$ docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
    -e ES_JAVA_OPTS="-Xms2g -Xmx4g" \
    -e "discovery.type=single-node" -e "xpack.security.enabled=false" \
    -e "bootstrap.memory_lock=true" --ulimit memlock=-1:-1 \
    -d docker.elastic.co/elasticsearch/elasticsearch:5.6.11
$ docker run --name graylog --link mongo --link elasticsearch \
    -p 9000:9000 -p 12201:12201 -p 514:514 -p 5555:5555 \
    -e GRAYLOG_WEB_ENDPOINT_URI="http://127.0.0.1:9000/api" \
    -d graylog/graylog:2.4.6-1

Graylog 仪表板现在可以使用 URL http://localhost:9000/ 访问,默认用户名和密码都是admin

虽然 Docker 设置是最简单的,但它确实需要大量内存。它也不适用于 Docker for Mac,因此可能不适合所有平台。

2.2. Amazon Web Services

设置 Graylog 进行测试的下一个最简单的选项是 Amazon Web Services。Graylog 提供了一个官方 AMI,其中包含所有必需的依赖项,尽管它在安装后确实需要一些额外的配置。

通过单击此处 并选择一个区域,我们可以使用 Graylog AMI 快速部署 EC2 实例。Graylog 建议使用至少 4GB 内存的实例

实例启动后,我们需要通过 SSH 连接到主机并进行一些更改。以下命令将为我们配置 Graylog 服务:

$ sudo graylog-ctl enforce-ssl
$ sudo graylog-ctl set-external-ip https://<EC2 PUBLIC IP>:443/api/
$ sudo graylog-ctl reconfigure

我们还需要更新使用 EC2 实例创建的安全组,以允许特定端口上的网络流量。下图显示了需要启用的端口和协议:

/uploads/graylog_with_spring_boot/1.jpg

现在可以使用 URL https://EC2_PUBLIC_IP/ 访问 Graylog 仪表板,并且默认用户名和密码都是admin

2.3. 其他 Graylog 安装

除了 Docker 和 AWS,还有  适用于各种操作系统的Graylog 包。使用这种方法,我们还必须设置 ElasticSearch 和 MongoDB 服务

出于这个原因,Docker 和 AWS 更容易设置,尤其是用于开发和测试目的。

3. 发送日志消息

随着 Graylog 启动并运行,我们现在必须配置 Spring Boot 应用程序以将日志消息发送到 Graylog 服务器。

任何 Java 日志框架都可以支持使用 GELF 协议向 Graylog 服务器发送消息。

3.1. Log4J

目前唯一官方支持的日志框架是 Log4J。Graylog 提供了一个 appender,它在Maven central 上可用。

我们可以通过将以下 Maven 依赖项添加到任何pom.xml文件来启用它:

<dependency>
    <groupId>org.graylog2</groupId>
    <artifactId>gelfj</artifactId>
    <version>1.1.16</version>
</dependency>

我们还必须在使用 Spring Boot 启动模块的任何地方排除日志记录启动模块:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

现在我们可以在log4j.xml文件中定义一个新的 appender:

<appender name="graylog" class="org.graylog2.log.GelfAppender">
    <param name="graylogHost" value="<GRAYLOG IP>"/>
    <param name="originHost" value="localhost"/>
    <param name="graylogPort" value="12201"/>
    <param name="extractStacktrace" value="true"/>
    <param name="addExtendedInformation" value="true"/>
    <param name="facility" value="log4j"/>
    <param name="Threshold" value="INFO"/>
    <param name="additionalFields" value="{'environment': 'DEV', 'application': 'GraylogDemoApplication'}"/>
</appender>

这会将所有具有 INFO 级别或更高级别的日志消息配置到 Graylog appender,然后将日志消息发送到 Graylog 服务器。

3.2. 其他日志框架

Graylog市场 具有支持各种其他日志记录框架(例如 Logback、Log4J2 等)的其他库。请注意,这些库不是由 Graylog 维护的。其中一些被遗弃,而另一些则很少或没有文档。

依赖这些 3rd 方库时应谨慎。

3.3. Graylog Collector Sidecar

日志收集的另一个选项是Graylog Collector Sidecar 。Sidecar 是一个沿着文件收集器运行的进程,将日志文件内容发送到 Graylog 服务器。

对于无法更改日志配置文件的应用程序,Sidecar 是一个很好的选择。并且由于它直接从磁盘读取日志文件,它还可以用于集成来自任何平台和编程语言的日志消息

4. 在 Graylog 中查看消息

我们可以使用 Graylog 仪表板来确认我们的日志消息的成功传递。使用过滤器 source:localhost 将显示来自我们上面示例log4j配置的日志消息:

/uploads/graylog_with_spring_boot/3.jpg