查看原文
其他

SpringBoot使用Graylog日志收集

大老杨。 SpringForAll社区 2021-05-27

本文介绍SpringBoot如何使用Graylog日志收集。

1.Graylog介绍

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

架构图如下:

生产环境配置图如下:

2.安装Graylog

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

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

  1. version: '2'

  2. services:

  3. # MongoDB: https://hub.docker.com/_/mongo/

  4. mongodb:

  5. image: mongo:3

  6. # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/6.6/docker.html

  7. elasticsearch:

  8. image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.6.1

  9. environment:

  10. - http.host=0.0.0.0

  11. - transport.host=localhost

  12. - network.host=0.0.0.0

  13. - "ES_JAVA_OPTS=-Xms256m -Xmx256m"

  14. ulimits:

  15. memlock:

  16. soft: -1

  17. hard: -1

  18. mem_limit: 512m

  19. # Graylog: https://hub.docker.com/r/graylog/graylog/

  20. graylog:

  21. image: graylog/graylog:3.0

  22. environment:

  23. # CHANGE ME (must be at least 16 characters)!

  24. - GRAYLOG_PASSWORD_SECRET=somepasswordpepper

  25. # Password: admin

  26. - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918

  27. - GRAYLOG_HTTP_EXTERNAL_URI=http://106.13.35.42:9000/

  28. links:

  29. - mongodb:mongo

  30. - elasticsearch

  31. depends_on:

  32. - mongodb

  33. - elasticsearch

  34. ports:

  35. # Graylog web interface and REST API

  36. - 9000:9000

  37. # Syslog TCP

  38. - 1514:1514

  39. # Syslog UDP

  40. - 1514:1514/udp

  41. # GELF TCP

  42. - 12201:12201

  43. # GELF UDP

  44. - 12201:12201/udp

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

其他方式可以查看官方文档,https://docs.graylog.org/en/3.0/pages/installation.html

3.配置Graylog

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

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

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

这里以GELF UDP为例,在图中位置选择GELF UDP,选择完成后点击Launch new input,如图

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

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

4.SpringBoot日志输出到Graylog

这里分别举例Logback日志和Log4j2日志。

4.1 Logback日志

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

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

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  4. <modelVersion>4.0.0</modelVersion>

  5. <parent>

  6. <groupId>org.springframework.boot</groupId>

  7. <artifactId>spring-boot-starter-parent</artifactId>

  8. <version>2.1.4.RELEASE</version>

  9. <relativePath/> <!-- lookup parent from repository -->

  10. </parent>

  11. <groupId>com.dalaoyang</groupId>

  12. <artifactId>springboot2_graylog</artifactId>

  13. <version>0.0.1-SNAPSHOT</version>

  14. <name>springboot2_graylog</name>

  15. <description>springboot2_graylog</description>


  16. <properties>

  17. <java.version>1.8</java.version>

  18. </properties>


  19. <dependencies>

  20. <dependency>

  21. <groupId>org.springframework.boot</groupId>

  22. <artifactId>spring-boot-starter-web</artifactId>

  23. </dependency>


  24. <dependency>

  25. <groupId>org.springframework.boot</groupId>

  26. <artifactId>spring-boot-starter-test</artifactId>

  27. <scope>test</scope>

  28. </dependency>


  29. <dependency>

  30. <groupId>de.siegmar</groupId>

  31. <artifactId>logback-gelf</artifactId>

  32. <version>2.0.0</version>

  33. </dependency>

  34. </dependencies>


  35. <build>

  36. <plugins>

  37. <plugin>

  38. <groupId>org.springframework.boot</groupId>

  39. <artifactId>spring-boot-maven-plugin</artifactId>

  40. </plugin>

  41. </plugins>

  42. </build>


  43. </project>

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

  1. <configuration>


  2. <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />

  3. <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />

  4. <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

  5. <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}}"/>


  6. <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">

  7. <encoder>

  8. <pattern>${CONSOLE_LOG_PATTERN}</pattern>

  9. <charset>UTF-8</charset>

  10. </encoder>

  11. </appender>


  12. <appender name="GELF" class="de.siegmar.logbackgelf.GelfUdpAppender">

  13. <graylogHost>106.13.35.42</graylogHost>

  14. <graylogPort>12201</graylogPort>

  15. </appender>


  16. <!-- 控制台输出日志级别 -->

  17. <root level="info">

  18. <appender-ref ref="GELF" />

  19. <appender-ref ref="STDOUT" />

  20. </root>



  21. </configuration>

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

4.2 Log4j2日志

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

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

  4. <modelVersion>4.0.0</modelVersion>

  5. <parent>

  6. <groupId>org.springframework.boot</groupId>

  7. <artifactId>spring-boot-starter-parent</artifactId>

  8. <version>2.1.4.RELEASE</version>

  9. <relativePath/> <!-- lookup parent from repository -->

  10. </parent>

  11. <groupId>com.dalaoyang</groupId>

  12. <artifactId>springboot2_graylog_log4j</artifactId>

  13. <version>0.0.1-SNAPSHOT</version>

  14. <name>springboot2_graylog_log4j</name>

  15. <description>springboot2_graylog_log4j</description>


  16. <properties>

  17. <java.version>1.8</java.version>

  18. </properties>


  19. <dependencies>

  20. <dependency>

  21. <groupId>org.springframework.boot</groupId>

  22. <artifactId>spring-boot-starter-web</artifactId>

  23. </dependency>


  24. <dependency>

  25. <groupId>org.springframework.boot</groupId>

  26. <artifactId>spring-boot-starter-test</artifactId>

  27. <scope>test</scope>

  28. </dependency>

  29. <dependency>

  30. <groupId>org.springframework.boot</groupId>

  31. <artifactId>spring-boot-starter</artifactId>

  32. <exclusions>

  33. <exclusion>

  34. <artifactId>spring-boot-starter-logging</artifactId>

  35. <groupId>org.springframework.boot</groupId>

  36. </exclusion>

  37. </exclusions>

  38. </dependency>

  39. <dependency>

  40. <groupId>org.springframework.boot</groupId>

  41. <artifactId>spring-boot-starter-log4j2</artifactId>

  42. </dependency>


  43. <dependency>

  44. <groupId>org.graylog2.log4j2</groupId>

  45. <artifactId>log4j2-gelf</artifactId>

  46. <version>1.3.1</version>

  47. </dependency>


  48. </dependencies>


  49. <build>

  50. <plugins>

  51. <plugin>

  52. <groupId>org.springframework.boot</groupId>

  53. <artifactId>spring-boot-maven-plugin</artifactId>

  54. </plugin>

  55. </plugins>

  56. </build>


  57. </project>

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

  1. <?xml version="1.0" encoding="UTF-8"?>

  2. <Configuration status="OFF" packages="org.graylog2.log4j2">

  3. <Properties>

  4. <Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss:SSS} - %-5level - %pid - %t - %c{1.}:%L - %m%n</Property>

  5. </Properties>

  6. <Appenders>

  7. <Console name="Console" target="SYSTEM_OUT" follow="true">

  8. <ThresholdFilter level="trace" onMatch="ACCEPT" onMismatch="DENY" />

  9. <PatternLayout pattern="${LOG_PATTERN}"/>

  10. </Console>

  11. <GELF name="gelfAppender" server="106.13.35.42" port="12201" hostName="appserver01.example.com">

  12. <PatternLayout pattern="%logger{36} - %msg%n"/>

  13. <Filters>

  14. <Filter type="MarkerFilter" marker="FLOW" onMatch="DENY" onMismatch="NEUTRAL"/>

  15. <Filter type="MarkerFilter" marker="EXCEPTION" onMatch="DENY" onMismatch="ACCEPT"/>

  16. </Filters>

  17. <!-- Additional fields -->

  18. <KeyValuePair key="foo" value="bar"/>

  19. <KeyValuePair key="jvm" value="${java:vm}"/>

  20. </GELF>

  21. </Appenders>

  22. <Loggers>

  23. <Root level="info">

  24. <AppenderRef ref="gelfAppender"/>

  25. <AppenderRef ref="Console"/>

  26. </Root>

  27. </Loggers>

  28. </Configuration>

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

5. ELK vs Graylog

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

6. 源码

springboot2_graylog源码地址:https://gitee.com/dalaoyang/springboot_learn/tree/master/springboot2_graylog

springboot2grayloglog4j源码地址:https://gitee.com/dalaoyang/springboot_learn/tree/master/springboot2_graylog_log4j


推荐:Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

上一篇:Spring Data JPA存储库Populators





 关注公众号

点击原文阅读更多


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存