logstash收集springboot日志

maven依赖

<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.1</version>
</dependency>

springboot 配置文件

logging:
config: classpath:logback.xml

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />
<!--======================================= 本地变量 ======================================== -->
<!--在没有定义${LOG_HOME}系统变量的时候,可以设置此本地变量。提交测试、上线时,要将其注释掉,使用系统变量。 -->
<property name="LOG_HOME" value="logs/spring.log" /> <!-- 应用名称:和统一配置中的项目代码保持一致(小写) -->
<property name="APP_NAME" value="log" />
<!--日志文件保留天数 -->
<property name="LOG_MAX_HISTORY" value="30" />
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
<!--应用日志文件保存路径 -->
<property name="LOG_APP_HOME" value="${APP_NAME}/%d{yyyy-MM-dd}" /> <!--=========================== 按照每天生成日志文件:默认配置=================================== -->
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件:主项目日志 -->
<appender name="APP"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_APP_HOME}/base.%d{yyyy-MM-dd}.log
</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{500} - %msg%n</pattern>
</encoder>
</appender>
<!--=============================== 日志输出: 默认主业务日志 ====================================== -->
<logger name="org.springframework">
<level value="WARN" />
</logger>
<logger name="org.apache.shiro">
<level value="WARN" />
</logger>
<logger name="freemarker">
<level value="WARN" />
</logger>
<logger name="org.hibernate">
<level value="WARN" />
</logger>
<logger name="org.hibernate.SQL">
<level value="DEBUG" />
</logger>
<logger name="org.apache.ibatis">
<level value="DEBUG" />
</logger>
<logger name="org.mybatis.spring">
<level value="DEBUG" />
</logger>
<logger name="com.alibaba.druid">
<level value="DEBUG,INFO" />
</logger>
<!-- 这里是你的业务的包名 -->
<logger name="com.bart.elk">
<level value="DEBUG" />
</logger>
<!-- logstash ip和暴露的端口,我目前理解就是通过这个地址把日志发送过去 -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- 和logstash 的input 配置的端口保持一致 -->
<destination>localhost:4567</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
</appender>
<root level="warn,info,debug">
<appender-ref ref="APP" />
<appender-ref ref="STDOUT" />
<appender-ref ref="LOGSTASH" />
<appender-ref ref="CONSOLE" />
</root>
</configuration>

logstash

springboot-log.conf

# 文档
# https://www.elastic.co/guide/en/logstash/5.6/input-plugins.html
# https://www.elastic.co/guide/en/logstash/6.1/input-plugins.html
input{
tcp {
mode => "server"
host => "0.0.0.0"
port => 4567
codec => json_lines
}
} output{
# 为了模拟测试就先不放es了,在控制台输出测试看看
#elasticsearch{
# hosts=>["127.0.0.1:9200"]
# index => "springboot-elk-%{+YYYY.MM.dd}"
#}
stdout{
codec => rubydebug
}
}

测试接口

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes; @RestController
public class ApiTests { protected final static Logger log = LoggerFactory.getLogger(ApiTests.class); @GetMapping("/api/log")
public Object log() {
ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
HttpServletRequest request = requestAttributes.getRequest();
String ip = request.getRemoteAddr();
String uri = request.getRequestURI();
String logStr = String.format("IP=[%s] send request URI = [%s]", ip, uri);
log.debug("[debug] "+logStr);
log.info("[info] "+logStr);
log.warn("[warn] "+logStr);
log.error("[error] "+logStr);
return "ok : "+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}

测试效果

先运行logstash

# linux:
bin/logstash -f config/springboot-log.conf # windows:
bin\logstash.bat -f config/springboot-log.conf

在运行springboot项目,然后调用测试接口:http://localhost:8080/api/log

观察logstash控制台输出:

{
"@timestamp" => 2021-04-28T15:40:43.182Z,
"level" => "DEBUG",
"port" => 57778,
"thread_name" => "http-nio-8080-exec-1",
"level_value" => 10000,
"@version" => "1",
"host" => "127.0.0.1",
"logger_name" => "com.bart.elk.ApiTests",
"message" => "[debug] IP=[127.0.0.1] send request URI = [/api/log]"
}
{
"@timestamp" => 2021-04-28T15:40:43.182Z,
"level" => "INFO",
"port" => 57778,
"thread_name" => "http-nio-8080-exec-1",
"level_value" => 20000,
"@version" => "1",
"host" => "127.0.0.1",
"logger_name" => "com.bart.elk.ApiTests",
"message" => "[info] IP=[127.0.0.1] send request URI = [/api/log]"
}
{
"@timestamp" => 2021-04-28T15:40:43.183Z,
"level" => "WARN",
"port" => 57778,
"thread_name" => "http-nio-8080-exec-1",
"level_value" => 30000,
"@version" => "1",
"host" => "127.0.0.1",
"logger_name" => "com.bart.elk.ApiTests",
"message" => "[warn] IP=[127.0.0.1] send request URI = [/api/log]"
}
{
"@timestamp" => 2021-04-28T15:40:43.183Z,
"level" => "ERROR",
"port" => 57778,
"thread_name" => "http-nio-8080-exec-1",
"level_value" => 40000,
"@version" => "1",
"host" => "127.0.0.1",
"logger_name" => "com.bart.elk.ApiTests",
"message" => "[error] IP=[127.0.0.1] send request URI = [/api/log]"
}

说明运行成功!

参考说明:

logstash-logback-encoder

参考博客-1

参考博客-2

logstash 文档

logstash收集springboot日志的更多相关文章

  1. logstash收集syslog日志

    logstash收集syslog日志注意:生产用syslog收集日志!!! 编写logstash配置文件 #首先我用rubydebug测试数据 [root@elk-node1 conf.d]# cat ...

  2. logstash收集的日志输出到elasticsearch中

    logstash收集的日志输出到elasticsearch中 一.需求 二.实现步骤 1.编写pipeline文件 1.`elasticsearch`配置参数解析: 2.可能会报的一个异常 2.准备测 ...

  3. logstash收集rsyslog日志

    (1)rsyslog配置 在192.168.1.31配置 #vim /etc/rsyslog.conf *.* @@192.168.1.32:514 //所有设备名,所有日志级别都发送到192.168 ...

  4. logstash收集java日志,多行合并成一行

    使用codec的multiline插件实现多行匹配,这是一个可以将多行进行合并的插件,而且可以使用what指定将匹配到的行与前面的行合并还是和后面的行合并. 1.java日志收集测试 input { ...

  5. 构建Logstash+tomcat镜像(让logstash收集tomcat日志)

    1.首先pull logstash镜像作为父镜像(logstash的Dockerfile在最下面): 2.构建my-logstash镜像,使其在docker镜像实例化时,可以使用自定义的logstas ...

  6. Logstash收集nginx日志之使用grok过滤插件解析日志

    grok作为一个logstash的过滤插件,支持根据模式解析文本日志行,拆成字段. nginx日志的配置: log_format main '$remote_addr - $remote_user [ ...

  7. logstash收集Nginx日志,转换为JSON格式

    Nginx日志处理为JSON格式,并放置在http区块: log_format json '{"@timestamp":"$time_iso8601",' '& ...

  8. logstash收集nginx日志

    (1)安装nginx 1.安装nginx yum install epel-release -y yum install nginx -y 2.修改日志文件格式为json #vim /etc/ngin ...

  9. Logstash 收集 IIS 日志

    日志样例 查看 IIS 日志配置,选择格式为 W3C(默认字段设置)保存生效. 2016-02-25 01:27:04 112.74.74.124 GET /goods/list/0/1.html - ...

随机推荐

  1. Django框架-cookie和session以及中间件

    目录 一.cookie 和 session 1.为什么会有这些技术 2. cookie 2.1 Django如何设置cookie 2.2 Django如何获取cookie 2.3 Django如何设置 ...

  2. 使用gitlab构建基于docker的持续集成(二)

    使用gitlab构建基于docker的持续集成(二) gitlab docker aspnetcore Centos配置gitlab镜像并且启动 Centos配置防火墙 windows上访问gitla ...

  3. 【死磕JVM】五年 整整五年了 该知道JVM加载机制了!

    类加载 Java虚拟机类加载过程是把Class类文件加载到内存,并对Class文件中的数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的java类型的过程 和那些编译时需要连接工作的语言不 ...

  4. 后端程序员之路 41、BlockingQueue

    BlockingQueue,阻塞队列,常用于实现生产者和消费者模型特点:1.队列为空时,取操作会等到队列有数据2.队列满时,存操作会等到队列可用 基于C++11的阻塞队列简单实现 - Cynric 的 ...

  5. C# 处理PPT水印(三)—— 在PPT中添加多行(平铺)文本水印效果

    在PPT幻灯片中,可通过添加形状的方式,来实现类似水印的效果,可添加单一文本水印效果,即幻灯片中只有一个文本水印:也可以添加多行(平铺)文本水印效果,即幻灯片中以一定方式平铺排列多个文本水印效果.本文 ...

  6. CCF(压缩编码):动态规划+平行四边形优化

    压缩编码 201612-4 一开始看这题还以为是哈夫曼编码的题目,结果是哈夫曼题目的变形. 哈夫曼编码是每次合并任意两堆石子,而这里的题目是合并相邻的两堆石子,而且这里的合并花费是合并两堆石子加上所有 ...

  7. 翻译:《实用的Python编程》04_04_Defining_exceptions

    目录 | 上一节 (4.3 特殊方法) | 下一节 (5 对象模型) 4.4 定义异常 用户可以通过类实现自定义异常: class NetworkError(Exception): pass **异常 ...

  8. python基础学习之深浅复制的概念

    1.深浅复制 浅复制,python自带,深复制需要导入模块包 import copy 使用深浅复制,根据id不同写出他们的区别a = [1,2,3]b = [6,7,8]s1 = [a,b]print ...

  9. 前端学习 node 快速入门 系列 —— 简易版 Apache

    其他章节请看: 前端学习 node 快速入门 系列 简易版 Apache 我们用 node 来实现一个简易版的 Apache:提供静态资源访问的能力. 实现 直接上代码. - demo - stati ...

  10. Hi3559AV100 NNIE开发(6)RFCN中NNIE实现关键线程函数->SAMPLE_SVP_NNIE_Rfcn_ViToVo()进行数据流分析

    前面随笔给出了NNIE开发的基本知识,下面几篇随笔将着重于Mobilefacenet NNIE开发,实现mobilefacenet.wk的chip版本,并在Hi3559AV100上实现mobilefa ...