33、SpringCloud分布式日志采集

 

    微服务的项目大多都有好几个工程,总的来说可以使用elk+logstash+elasticsearch+kibana做分布式日志处理,ogstash接收日志,elasticsearch 处理数据,kibana展示数据。

 

(1)打开防火墙

firewall-cmd --zone=public --add-port=5601/tcp --permanent

firewall-cmd --zone=public --add-port=9200/tcp --permanent

firewall-cmd --zone=public --add-port=5044/tcp --permanent

firewall-cmd --zone=public --add-port=9600/tcp --permanent

firewall-cmd --reload

 

(2)运行elk

elk使用现成的docker镜像

docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk

运行结果:

 

运行报错:

解决方案:

切换到root用户,之心命令:

sysctl -w vm.max_map_count=262144

查看结果:

sysctl -a|grep vm.max_map_count

上述方法修改后,重启虚拟机将失效,所以/etc/sysctl.conf文件最后添加一行

vm.max_map_count=262144

重启,删除容器docker rm 提示的容器id,重新启动

docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk

等待几分钟,后运行结果:

 

说明:

5601 - Kibana web 接口

9200 - Elasticsearch JSON 接口

5044 - Logstash 日志接收接口

 

(3)修改配置

枚举docker容器

docker ps

进入容器

docker exec -it 689da25080c0 sh

 

测试:

 

(1)执行命令:/opt/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["localhost"] } }'

如果看到这样的报错信息 Logstash could not be started because there is already another instance using the configured data directory.  If you wish to run multiple instances, you must change the "path.data" setting. 

请执行命令:service logstash stop 

然后在执行就可以了

(2)当命令成功被执行后,看到:Successfully started Logstash API endpoint {:port=>9600} 信息后,

输入:this is a dummy entry 然后回车,模拟一条日志进行测试

(3)打开浏览器,输入:http://<your-host>:9200/_search?pretty 如图,就会看到我们刚刚输入的日志内容

这里输入:http://192.168.12.106:9200/_search?pretty

 

(4)模拟数据成功后,创建index pattern(只有模拟数据才可以创建索引)

选择过滤属性名:

 

 

(5)配置springcloud项目的logstash

 

首先,引入logstash库:

<!-- 分布式日志采集 -->

    <dependency>

          <groupId>net.logstash.logback</groupId>

          <artifactId>logstash-logback-encoder</artifactId>

          <version>4.9</version>

     </dependency>

 

logback.xml配置

<configuration>

    <!--配置常量,在后面的配置中使用 -->

    <property name="PROJECT_NAME" value="dys" />

    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->

    <property name="LOG_HOME" value="/app/logs/${PROJECT_NAME}" />

    <!--定义日志输出格式 -->  

    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{ip}] [%thread] %-5level %logger{60} - %msg%n" />

    <!-- 定义日志输出字符集 -->

    <property name="LOG_CHARSET" value="UTF-8" />

    <!-- <include resource="org/springframework/boot/logging/logback/base.xml"/> -->

    <!-- 控制台输出 -->

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

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

    </appender>

   

    <!-- 全量日志 -->

    <appender name="PROJECT-COMMON" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-common.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-common_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

   

    <!-- 错误日志 -->

    <appender name="PROJECT-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-error.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">

            <level>ERROR</level>

        </filter>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-error_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

   

     <!-- 业务日志 -->

    <appender name="PROJECT-BIZ" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-biz.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-biz_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

   

    <!-- 持久层日志 -->

    <appender name="PROJECT-DAL" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-dal.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-dal_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

   

    <!-- 调用dubbo日志 -->

    <appender name="PROJECT-INTEG" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-integ.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-integ_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

   

     <appender name="PROJECT-SHIRO" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-shiro.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-shiro_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

    <appender name="PROJECT-CAS" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-cas.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-cas_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

    <appender name="PROJECT-MYBATIS" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-mybatis.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-mybatis_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

    <appender name="PROJECT-DUBBO" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-dubbo.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-dubbo_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

    <appender name="PROJECT-APACHECOMMON" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-apachecommon.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-apachecommon_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

    <appender name="PROJECT-ZOOKEEPER" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-zookeeper.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-zookeeper_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

    <appender name="PROJECT-SPRING" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-spring.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-spring_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

    <appender name="PROJECT-QUARTZ" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-quartz.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-quartz_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

   

    <appender name="PROJECT-APACHEHTTP" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-apachehttp.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-apachehttp_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

   

    <appender name="PROJECT-OTHER" class="ch.qos.logback.core.rolling.RollingFileAppender">

        <file>${LOG_HOME}/${PROJECT_NAME}-other.log</file>

        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

            <pattern>${LOG_PATTERN}</pattern>

            <charset>${LOG_CHARSET}</charset>

        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">

            <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}-other_%d{yyyy-MM-dd}.log

            </fileNamePattern>

            <maxHistory>15</maxHistory>

        </rollingPolicy>

    </appender>

     <!-- 为logstash输出的JSON格式的Appender -->

    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">

        <destination>192.168.12.106:5044</destination>

        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />

        <keepAliveDuration>5 minutes</keepAliveDuration>

        <!-- 日志输出编码

        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">

            <providers>

                <timestamp>

                    <timeZone>UTC</timeZone>

                </timestamp>

                <pattern>

                    <pattern>

                        {

                             "severity": "%level",

                             "service": "${springAppName:-}",

                             "trace": "%X{X-B3-TraceId:-}",

                             "span": "%X{X-B3-SpanId:-}",

                             "exportable": "%X{X-Span-Export:-}",

                             "pid": "${PID:-}",

                             "thread": "%thread",

                             "class": "%logger{40}",

                             "rest": "%message"

                        }

                    </pattern>

                </pattern>

            </providers>

        </encoder>

        -->

    </appender>

   

     <!-- (1)root中只配置控制台日志,其他所有的日志把additivity设置为true都打到控制台,方便开发阶段定位问题。 -->

    <!-- (2)第三方框架的日志抽取到单独的文件中,并且级别为ERROR。 -->

    <!-- root -->

    <root level="INFO">

        <appender-ref ref="CONSOLE" />

        <appender-ref ref="PROJECT-COMMON" />

        <appender-ref ref="PROJECT-ERROR" />

        <appender-ref ref="logstash" />

    </root>

   

     <!-- 项目自己的日志 -->

    <!-- 业务日志 -->

    <logger name="com.donwait.controller" level="debug" additivity="false">

        <appender-ref ref="PROJECT-BIZ" />

        <appender-ref ref="PROJECT-ERROR" />

        <appender-ref ref="logstash" />

    </logger>

    <!-- 其他开源框架的日志不打印到PROJECT-COMMON,但错误级别的会打印到PROJECT-ERROR -->

    <!-- shiro日志 -->

    <logger name="org.apache.shiro" level="debug" additivity="false">

        <appender-ref ref="PROJECT-SHIRO" />

        <appender-ref ref="PROJECT-ERROR" />

    </logger>

    <!-- jasig.cas的日志,error级别 -->

    <logger name="org.jasig.cas" level="debug" additivity="false">

        <appender-ref ref="PROJECT-CAS" />

        <appender-ref ref="PROJECT-ERROR" />

    </logger>

    <!-- mybatis的日志 -->

    <logger name="org.mybatis" level="debug" additivity="false">

        <appender-ref ref="PROJECT-MYBATIS" />

        <appender-ref ref="PROJECT-ERROR" />

    </logger>

    <!-- zookeeper的日志,因为会比较多所以是error级别 -->

    <logger name="org.apache.zookeeper" level="debug" additivity="false">

        <appender-ref ref="PROJECT-ZOOKEEPER" />

        <appender-ref ref="PROJECT-ERROR" />

    </logger>

    <logger name="org.I0Itec.zkclient" level="debug" additivity="false">

        <appender-ref ref="PROJECT-ZOOKEEPER" />

        <appender-ref ref="PROJECT-ERROR" />

    </logger>

    <!-- dubbo的日志,error级别 -->

    <logger name="com.alibaba.dubbo" level="debug" additivity="false">

        <appender-ref ref="PROJECT-DUBBO" />

        <appender-ref ref="PROJECT-ERROR" />

    </logger>

    <!-- apache-common的日志,error级别 -->

    <logger name="org.apache.commons" level="debug" additivity="false">

        <appender-ref ref="PROJECT-APACHECOMMON" />

        <appender-ref ref="PROJECT-ERROR" />

    </logger>

    <!-- spring的日志,error级别 -->

    <logger name="org.springframework" level="debug" additivity="false">

        <appender-ref ref="PROJECT-SPRING" />

        <appender-ref ref="PROJECT-ERROR" />

    </logger>

    <!-- quartz的日志,error级别 -->

    <logger name="org.quartz" level="debug" additivity="false">

        <appender-ref ref="PROJECT-QUARTZ" />

        <appender-ref ref="PROJECT-ERROR" />

    </logger>

    <logger name="org.apache.http" level="debug" additivity="false">

        <appender-ref ref="PROJECT-APACHEHTTP" />

        <appender-ref ref="PROJECT-ERROR" />

    </logger>

    <logger name="com.baidu.disconf" level="info" additivity="false">

        <appender-ref ref="PROJECT-COMMON" />

        <appender-ref ref="PROJECT-ERROR" />

    </logger>

</configuration>

 

测试日志:

查看日志(并筛选,查看所有用*)

 

可以按左边任意选项搜索:

 

 

 

注意如果根据如下操作将配置配置在vim 02-beats-input.conf是无效的!!!(经过测试无效,暂时没有去查找其原因),仅供参考!

 

进入配置目录

cd /etc/logstash/conf.d

编辑配置文件02-beats-input.conf

vim 02-beats-input.conf

将如下配置:

修改为:

或:

output {

  elasticsearch {

     hosts => ["192.168.160.66:9200","192.168.160.88:9200","192.168.160.166:9200"]

     index => "applog"

  }

stdout { codec => rubydebug }  //若不需要在控制台中输出,此行可以删除

}

 

 

redis读取配置:

input {

redis {

  codec => json

  host => "192.168.2.246"

  port => 56379

  key => "data-mgr"

  data_type => "list"

}

}

 

注意:

(1)其中port为端口号,codec表示通过json格式,elasticsearch.hosts表示elasticsearch的地址,这里可以是集群。index为日志存储的elasticsearch索引。

(2)由于sebp/elk中logstash的input的方式默认是filebeat,首先们需要进入elk容器中修改input方式。logstash默认会将etc/logstash/conf.d/中的配置文件进行整合然后启动,修改完成后重新启动容器:

docker restart elk

 

也可以自己将配置文件test.conf:

input {

    tcp {

    ##host:port就是上面appender中的 destination,这里其实把logstash作为服务,开启9250端口接收logback发出的消息

    host => "127.0.0.1"

    port => 9100

    mode => "server"

    tags => ["tags"]

    codec => json_lines

    }

}

output {

    stdout { codec => rubydebug }

    #输出到es

    elasticsearch { hosts => "127.0.0.1:9200" }

        #输出到一个文件中

    file {

       path => "D:/study/springcloud_house/ELK/logstash-6.1.1/out"

       codec => line

    }

}

 

然后启动使用自己的配置:.\bin\logstash -f test.conf

 

访问界面:http://192.168.12.106:5601,进入进入kibana界面

docker images

docker push 

 

快来成为我的朋友或合作伙伴,一起交流,一起进步!
QQ群:961179337
微信:lixiang6153
邮箱:lixx2048@163.com
公众号:IT技术快餐
更多资料等你来拿!

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贝壳里的沙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值