Mac下ELK日志中心环境的搭建以及spring boot集成logback与ELK对接

          最近由于的公司业务系统出现问题,而排查问题只能从生产服务器拷贝日志到测试机,然后我们再去测试机上查看生成服务器的日志,排查问题,有时

由于日志的量太大,生产环境报错了,常常等拷贝完成就要十几分钟,到查到问题就要半小时以上,还好这段时间没有什么人用,要不然早就有人投诉了,所

以就想升级一下日志系统。  

        于是先调研了ELK,并且是用logback传输json的数据到logstash, 再给elasticsearch处理后,最后统计好交给kibana展示。具体架构图如

         ELK的下载地址  https://www.elastic.co/downloads

    默认本机装好java的环境,查看java的版本,

          下载好了三个安装包,本次安装的ELK的版本都是是6.0.0版本,

         首先,在 logstash-6.0.0 的目录下,新建一个文件名为 logstash.conf,然后写入以下配置:

input {
   tcp {
    host => "localhost"
    port => 4560
    mode => "server"
    tags => ["tags"]
    codec => json_lines
  }
}

output {
   elasticsearch {
        hosts => "localhost:9200"
        index => "%{[appname]}"
        user => "elastic"
        password => "@hvL9ni2Eu8^ohv0^gTD"
    }
    stdout{
        codec=>rubydebug
    }
}

           然后用命令:

 logstash -f logstash.conf 

 

       启动 logstash, 启动截图如下:

   接下来进入elasticsearch目录,安装安全控制的插件x-pack,通过命令:

   bin/elasticsearch-plugin install x-pack 

         安装完后,输入以下命令:

bin/x-pack/setup-passwords auto

       会出现如下截图:

       这样生成了三个用户的随机密码,只用elastic的用户是超级用户,这里生成的elastic用户名和密码在logstash里logstash.conf配置文件中user和password,这样logstash才能将数据写入

到 elasticsearch. 这里注意一下,我之前在网上找到的都是默认用户名是elastic,密码: changeme,总是不对,最后在官网找到的命令,生成的默认的以个密码。

       接下启动elasticsearch, 使用命令: 

bin/elasticsearch

           接下来安装kibana的x-pack,使用以下命令:

    bin/kibana-plugin install x-pack

         这个过程需要时间长一点。安装完后 ,用vim打开kibana的配置文件,

   vim config/kibana.yml   

        加入以下配置:

elasticsearch.username: "kibana"
elasticsearch.password: "#qP6~Q@ow#jzWMgfy3PT"

 

         接下启动kibana,进入kibana目录后,使用命令 bin/kibana, 启动截图如下

              完成后,访问本地的 http://localhost:5601  ,进入如下图:              

            

     使用再安装elasticsearch初始化的账号和密码, 就可以登录了。这时候,我们还看不奥日志,因为我使用的 logback 以tcp方式的传送json日志到 logstash. 那么接下来

  在ideal中会创建一个maven工程。本demo是基于spring boot的,首先在pom.xml中添加一下依赖。

<dependencies>

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

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

 

          然后新建的一个配置文件application.yml, 添加一个配置

logging:
  config: classpath:logback.xml

 

         再新建一个logback.xml的文件,添加以下配置

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

    <logger name="org.springframework" level="WARN"/>

    <logger name="org.hibernate.validator" level="INFO"/>

    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>127.0.0.1:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <customFields>{"appname":"gateway-service"}</customFields>
        </encoder>
    </appender>

    <!-- 彩色日志依赖的渲染类 -->
    <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">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="STDOUT" />
        <appender-ref ref="LOGSTASH" />
    </root>

</configuration>

         然后新建一个java启动类Application。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class LogApplication implements CommandLineRunner{

    private final static Logger logger= LoggerFactory.getLogger(LogApplication.class);


    public static void main(String[] args) {
        SpringApplication.run(LogApplication.class, args);
    }

    @Override
    public void run(String... arg0) throws Exception {
        logger.error("=========hello World========");

        logger.debug("=========hello World========");
    }
}

然后启动该项目后,具体代码也可以直接参考这里的:https://github.com/xjz1842/spring-cloud-learning/tree/master/logback

         然后再返回kibana页面,新建一个index-pattern为gateway-service, 注意:这个是在 logback.xml中配置的 <customFields>{"appname":"gateway-service"}</customFields> 而这个是个变量,要和logstash.conf的配置文件中 index => "%{[appname]}"的key对应, 

         这样就可以看到如下图,

            如果多个系统需要搜集日志,我们只需要改变的logback的配置的文件的 <customFields>{"appname":"gateway-service"}</customFields>里面的gateway-service,改为xxx-service,

就可以将各个系统的日志分开,如下图点击你要的index-pattern,就可以看到你想要的配置。

          到此,日志系统算是搭建完了,但是还要很多优化的点,比如日志要存储多久,打日志配置成异步的,等等。如果上生产了,有问题再写出来,再交流下。

 

posted on 2017-12-14 15:32  xjz1842  阅读(506)  评论(0编辑  收藏  举报

导航