实际中最好用的日志框架是logback,我们现在会直接使用logback通过tcp协议向logstash-shipper输入日志数据。在上一节的基础上修改!!!

一、代码

1、pom.xml

1         <!-- logstash-logback -->
2         <dependency>
3             <groupId>net.logstash.logback</groupId>
4             <artifactId>logstash-logback-encoder</artifactId>
5             <version>4.6</version>
6         </dependency>

2、application.properties

1 #set logstash shipper host
2 logstash.host=127.0.0.1
3 #set logstash shipper port
4 logstash.port=4560
5 logstash.level=info

3、LogstashProperties.java

package com.xxx.secondboot.logstash;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import lombok.Getter;
import lombok.Setter;

@Component
@ConfigurationProperties(prefix = "logstash")
@Getter
@Setter
public class LogstashProperties {
    private String host;
    private int    port;
    private String level;
}

4、LogstashConfig.java

package com.xxx.secondboot.logstash;

import java.net.InetSocketAddress;

import javax.annotation.PostConstruct;

import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import net.logstash.logback.appender.LogstashTcpSocketAppender;
import net.logstash.logback.encoder.LogstashEncoder;

/**
 * 该类是可以配置成xml配置文件的,但是那样的话,就不能由客户端指定参数了
 */
@Component
public class LogstashConfig {
    @Autowired
    private LogstashProperties logstashProperties;

    @PostConstruct
    public void init() {
        Logger rootLogger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
        LogstashTcpSocketAppender appender = new LogstashTcpSocketAppender();
        appender.setName("stash");
        appender.addDestinations(new InetSocketAddress(logstashProperties.getHost(), logstashProperties.getPort()));

        LogstashEncoder encoder = new LogstashEncoder();
        encoder.setCustomFields("{ \"service\":\"" + "myboot2" + "\"}");//服务名会在日志中显示(可以方便的知道该日志是哪个服务的)
        encoder.start();

        appender.setEncoder(encoder);
        appender.setContext(rootLogger.getLoggerContext());
        appender.start();
        rootLogger.addAppender(appender);
        rootLogger.setLevel(Level.toLevel(logstashProperties.getLevel()));
    }
}

注意:

  • init()方法在LogstashConfig bean构建之后执行,之后的日志信息都会写入到LogstashTcpSocketAppender中去
  • 2、3、4其实也可以没有,直接使用xml配置即可(参考:https://github.com/logstash/logstash-logback-encoder/tree/logstash-logback-encoder-4.7),但是这样的话,就无法有我们自己指定logstash参数了,或者需要在xml中指定(这里的配置不在consul中配置),而配在application.properties中(实际上就是配在了consul中)

5、AdviceController.java

private static final Logger LOGGER = LoggerFactory.getLogger(AdviceController.class);

    @RequestMapping(value = "/testLog", method = RequestMethod.GET)
    public String testLog() {
        LOGGER.info("test info");
        LOGGER.debug("test debug");
        LOGGER.error("test error");
        LOGGER.warn("test warn");
        return "test logstash-logback";
    }

二、测试

在上一节的基础上修改logstash-shipper的配置文件:(输入为tcp,配置参考:https://github.com/logstash/logstash-logback-encoder/tree/logstash-logback-encoder-4.7

input {
    tcp {
        mode => "server"
        host => "127.0.0.1"
        port => 4560
        codec => "json_lines"
    }
}

filter {

}

output {
    redis{
        data_type => "list"
        host => ["127.0.0.1:6379"]
        key => "microservice:logstash:redis"
    }
}

之后运行启动程序,这时候kibana就会打印出启动日志了,在日志中有servicename的体现,之后访问swagger,我们会发现3条不同级别的日志都进入kibana进行展示了。

【第三十二章】 elk(3)- broker架构 + 引入logback的更多相关文章

  1. 第三十二章 elk(3)- broker架构 + 引入logback

    实际中最好用的日志框架是logback,我们现在会直接使用logback通过tcp协议向logstash-shipper输入日志数据.在上一节的基础上修改!!! 一.代码 1.pom.xml < ...

  2. Gradle 1.12用户指南翻译——第三十二章. JDepend 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  3. “全栈2019”Java多线程第三十二章:显式锁Lock等待唤醒机制详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. “全栈2019”Java第三十二章:增强for循环Foreach语法

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. 第三十二章、使用splitDockWidget和tabifyDockWidget嵌套布局QDockWidget的PyQt人机对话案例

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 一.引言 在第<第三十一章.containers容器类部件QDo ...

  6. SpringBoot | 第三十二章:事件的发布和监听

    前言 今天去官网查看spring boot资料时,在特性中看见了系统的事件及监听章节.想想,spring的事件应该是在3.x版本就发布的功能了,并越来越完善,其为bean和bean之间的消息通信提供了 ...

  7. 【WPF学习】第三十二章 执行命令

    前面章节已经对命令进行了深入分析,分析了基类和接口以及WPF提供的命令库.但尚未例举任何使用这些命令的例子. 如前所述,RoutedUICommand类没有任何硬编码的功能,而是只表达命令,为触发命令 ...

  8. 第三十二章 Linux常规练习题(一)

    一.练习题一 1.超级用户(管理员用户)提示符是____,普通用户提示符是____.2.linux关机重启的命令有哪些 ?3.bash是什么?4.bash特性, 常见的bash特性有哪些?5.网卡的配 ...

  9. 《FPGA全程进阶---实战演练》第三十二章 Signal Tap II 应用实例

    还有几天就要交文章终稿了,三年的研究生生活也快要结束了,时间飞快,岁月如梭,但学习技术的热情仍然不能松懈,不懂的东西太多,需要实时保持奋斗!!过些天会继续更新<FPGA全程进阶---实战演练&g ...

随机推荐

  1. python2.X编码

    1.Python文件的编码 在Python文件中,可以在第一或第二行指定文件的编码格式(以注释的形式加),这也是Python语法规定的,见http://www.python.org/peps/pep- ...

  2. mysql 数据库数据订正

    mysql 数据库数据订正 http://blog.itpub.net/22664653/viewspace-717175/ 工作过程中时常遇到数据订正的需求,该操作本身不难.操作时要求能够保持回滚~ ...

  3. 十天精通CSS3(3)

    颜色之RGBA RGB是一种色彩标准,是由红(R).绿(G).蓝(B)的变化以及相互叠加来得到各式各样的颜色.RGBA是在RGB的基础上增加了控制alpha透明度的参数. 语法: color:rgba ...

  4. 十天精通CSS3(2)

    圆角效果 border-radius border-radius是向元素添加圆角边框. 使用方法: border-radius:10px; /* 所有角都使用半径为10px的圆角 */ border- ...

  5. 十天精通CSS3(1)

    什么是CSS3? CSS3是CSS2的升级版本,3只是版本号,它在CSS2.1的基础上增加了很多强大的新功能. 目前主流浏览器chrome.safari.firefox.opera.甚至360都已经支 ...

  6. 去掉IntelliJ IDEA 中 mybatis 对应的 xml 文件警告

    https://blog.csdn.net/aubdiy/article/details/68485336 IntelliJ IDEA 打开 mybatis 的 xml 文件时,对应的 xml 文件中 ...

  7. [py]GIL(全局解释器锁):多线程模式

    在多线程 时同一时刻只允许一个线程来访问CPU,直到解释器遇到I/O操作或者操作次数达到一定数目时才会释放GIL 参考 Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务.多个P ...

  8. 畅通工程续 (SPFA模板Floy模板)

    http://acm.hdu.edu.cn/showproblem.php?pid=1874 SPFA #include <iostream> #include <stdio.h&g ...

  9. unittest数据驱动

    所谓的数据驱动就是将数据单独存放,在写方法将数据读取,然后将读取的数据放在testcase里面. 当然如果这种testcase都是一样的,只有需要的数据不一样,也可以将testcase写成一个方法,把 ...

  10. Qt setMargin()和setSpacing() 的含义

    mainLayout=newQVBoxLayout(this); mainLayout->setMargin(30); //表示控件与窗体的左右边距 mainLayout->setSpac ...