欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SpringBoot使用Graylog日志收集的实现示例

程序员文章站 2024-02-24 10:15:28
本文介绍springboot如何使用graylog日志收集。 1.graylog介绍 graylog是一个生产级别的日志收集系统,集成mongo和elasticsear...

本文介绍springboot如何使用graylog日志收集。

1.graylog介绍

graylog是一个生产级别的日志收集系统,集成mongo和elasticsearch进行日志收集。其中mongo用于存储graylog的元数据信息和配置信息,elasticsearch用于存储数据。

架构图如下:

SpringBoot使用Graylog日志收集的实现示例

生产环境配置图如下:

SpringBoot使用Graylog日志收集的实现示例

2.安装graylog

在官方文档上推荐了很多种安装的方式,这里以docker-compose的方式为例,进行安装graylog,mongo,elasticsearch。

docker-compose.yml内容如下(这里是在官网的基础上改了一下):

version: '2'
services:
 # mongodb: https://hub.docker.com/_/mongo/
 mongodb:
  image: mongo:3
 # elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/6.6/docker.html
 elasticsearch:
  image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.6.1
  environment:
   - http.host=0.0.0.0
   - transport.host=localhost
   - network.host=0.0.0.0
   - "es_java_opts=-xms256m -xmx256m"
  ulimits:
   memlock:
    soft: -1
    hard: -1
  mem_limit: 512m
 # graylog: https://hub.docker.com/r/graylog/graylog/
 graylog:
  image: graylog/graylog:3.0
  environment:
   # change me (must be at least 16 characters)!
   - graylog_password_secret=somepasswordpepper
   # password: admin
   - graylog_root_password_sha2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
   - graylog_http_external_uri=http://106.13.35.42:9000/
  links:
   - mongodb:mongo
   - elasticsearch
  depends_on:
   - mongodb
   - elasticsearch
  ports:
   # graylog web interface and rest api
   - 9000:9000
   # syslog tcp
   - 1514:1514
   # syslog udp
   - 1514:1514/udp
   # gelf tcp
   - 12201:12201
   # gelf udp
   - 12201:12201/udp

其中106.13.35.42是我的外网ip,本地服务使用127.0.0.1即可。

其他方式可以查看官方文档,

3.配置graylog

在浏览器访问http://ip:9000,如图:

SpringBoot使用Graylog日志收集的实现示例

这里默认用户名密码都是admin,进入后如图所示。

SpringBoot使用Graylog日志收集的实现示例

选择system按钮中的input,录入一个输入源,如图

SpringBoot使用Graylog日志收集的实现示例

这里以gelf udp为例,在图中位置选择gelf udp,选择完成后点击launch new input,如图

SpringBoot使用Graylog日志收集的实现示例

在node处选择自己安装的,剩下的就根据需要填写即可,如图

SpringBoot使用Graylog日志收集的实现示例

保存完成后如图,到这里就已经配置完成了。

SpringBoot使用Graylog日志收集的实现示例

4.springboot日志输出到graylog

这里分别举例logback日志和log4j2日志。

4.1 logback日志

这里使用的logback-gelf向graylog输出日志,在github上有对logback-gelf的详细使用介绍,这里只是简单举例。github地址:。

新建项目,加入logback-gelf依赖,pom文件如下:

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
     xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelversion>4.0.0</modelversion>
  <parent>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-parent</artifactid>
    <version>2.1.4.release</version>
    <relativepath/> <!-- lookup parent from repository -->
  </parent>
  <groupid>com.dalaoyang</groupid>
  <artifactid>springboot2_graylog</artifactid>
  <version>0.0.1-snapshot</version>
  <name>springboot2_graylog</name>
  <description>springboot2_graylog</description>

  <properties>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-web</artifactid>
    </dependency>

    <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-test</artifactid>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupid>de.siegmar</groupid>
      <artifactid>logback-gelf</artifactid>
      <version>2.0.0</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-maven-plugin</artifactid>
      </plugin>
    </plugins>
  </build>

</project>

加入logback日志配置,新建logback-spring.xml,内容如下:

<configuration>

  <conversionrule conversionword="clr" converterclass="org.springframework.boot.logging.logback.colorconverter" />
  <conversionrule conversionword="wex" converterclass="org.springframework.boot.logging.logback.whitespacethrowableproxyconverter" />
  <conversionrule conversionword="wex" converterclass="org.springframework.boot.logging.logback.extendedwhitespacethrowableproxyconverter" />
  <property name="console_log_pattern" value="${console_log_pattern:-%clr(%d{yyyy-mm-dd hh:mm:ss.sss}){faint} %clr(${log_level_pattern:-%5p}) %clr(${pid:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${log_exception_conversion_word:-%wex}}"/>

  <appender name="stdout" class="ch.qos.logback.core.consoleappender">
    <encoder>
      <pattern>${console_log_pattern}</pattern>
      <charset>utf-8</charset>
    </encoder>
  </appender>

  <appender name="gelf" class="de.siegmar.logbackgelf.gelfudpappender">
    <grayloghost>106.13.35.42</grayloghost>
    <graylogport>12201</graylogport>
  </appender>

  <!-- 控制台输出日志级别 -->
  <root level="info">
    <appender-ref ref="gelf" />
    <appender-ref ref="stdout" />
  </root>


</configuration>

启动项目,当前项目端口是8081,查看graylog控制台如图:

SpringBoot使用Graylog日志收集的实现示例

4.2 log4j2日志

log4j2日志使用的是log4j2-gelf依赖,github上面也有对应的介绍,pom文件如下:

<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
     xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelversion>4.0.0</modelversion>
  <parent>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-parent</artifactid>
    <version>2.1.4.release</version>
    <relativepath/> <!-- lookup parent from repository -->
  </parent>
  <groupid>com.dalaoyang</groupid>
  <artifactid>springboot2_graylog_log4j</artifactid>
  <version>0.0.1-snapshot</version>
  <name>springboot2_graylog_log4j</name>
  <description>springboot2_graylog_log4j</description>

  <properties>
    <java.version>1.8</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-web</artifactid>
    </dependency>

    <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-test</artifactid>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter</artifactid>
      <exclusions>
        <exclusion>
          <artifactid>spring-boot-starter-logging</artifactid>
          <groupid>org.springframework.boot</groupid>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-log4j2</artifactid>
    </dependency>

    <dependency>
      <groupid>org.graylog2.log4j2</groupid>
      <artifactid>log4j2-gelf</artifactid>
      <version>1.3.1</version>
    </dependency>

  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-maven-plugin</artifactid>
      </plugin>
    </plugins>
  </build>

</project>

创建log4j2-spring.xml进行配置输出日志信息,如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration status="off" packages="org.graylog2.log4j2">
  <properties>
    <property name="log_pattern">%d{yyyy-mm-dd hh:mm:ss:sss} - %-5level - %pid - %t - %c{1.}:%l - %m%n</property>
  </properties>
  <appenders>
    <console name="console" target="system_out" follow="true">
      <thresholdfilter level="trace" onmatch="accept" onmismatch="deny" />
      <patternlayout pattern="${log_pattern}"/>
    </console>
    <gelf name="gelfappender" server="106.13.35.42" port="12201" hostname="appserver01.example.com">
      <patternlayout pattern="%logger{36} - %msg%n"/>
      <filters>
        <filter type="markerfilter" marker="flow" onmatch="deny" onmismatch="neutral"/>
        <filter type="markerfilter" marker="exception" onmatch="deny" onmismatch="accept"/>
      </filters>
      <!-- additional fields -->
      <keyvaluepair key="foo" value="bar"/>
      <keyvaluepair key="jvm" value="${java:vm}"/>
    </gelf>
  </appenders>
  <loggers>
    <root level="info">
      <appenderref ref="gelfappender"/>
      <appenderref ref="console"/>
    </root>
  </loggers>
</configuration>

这个项目使用的端口号是8888,可以在日志中清晰的看到。

SpringBoot使用Graylog日志收集的实现示例

5. elk vs graylog

这里仅以日志收集为例,简单说一下二者之间的选择,我个人的建议就是取决于现有技术栈,比如现在就有现成的mongodb,那么选择graylog可以节省不少成本,elk类似,不要盲目的追求技术而选择。

6. 源码

springboot2_graylog源码地址:

springboot2_graylog_log4j源码地址:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。