您的位置:首页 > 其它

记一次logback传输日志到logstash根据自定义设置动态创建ElasticSearch索引

2017-07-11 17:36 886 查看
先说背景,由于本人工作需要创建很多小应用程序,而且在微服务的大环境下,服务越来越多,然后就导致日志四分五裂,到处都有,然后就有的elk,那么问题来了 不能每个小应用都配置一个 logstash 服务来传输日志吧,把所有的日志都 输送到一个logstash里面 然后logstash会都输送到一个索引下(之前不知道怎么配),输送到同一个所以下 那么问题又来了,首先每个小服务程序日志量不大希望持续监控,也不需要用时间来分割(因为日志量不大),又希望查询方便(不要告诉我查询的时候多一个筛选条件就可以了,俺就是不想那样嫌乱不好找)。所有有了下面的解决方案

首先本人用的日志框架是logback,使用

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


这个包进行 socket向lostash进行日志输送

以下为重点

首先通读上面pom文件依赖的开源包文档net.logstash.logback,连接地址为:https://github.com/logstash/logstash-logback-encoder

看完之后马上回来,就会明白我下面说的

首先配置logback.xml日志

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
<include resource="org/springframework/boot/logging/logback/base.xml" />
<!-- <jmxConfigurator/> -->
<contextName>logback</contextName>

<property name="log.path" value="E:\\123456\\logback.log" />

<property name="log.pattern"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID} --- [%15.15t] %-40.40logger{39} : %m%n" />

<appender name="file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}</file>

<encoder>
<pattern>${log.pattern}</pattern>
</encoder>

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

<fileNamePattern>info-%d{yyyy-MM-dd}-%i.log
</fileNamePattern>

<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">

<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>

</appender>

<appender name="socket"
class="net.logstash.logback.appender.LogstashSocketAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<host>10.10.129.35</host>
<port>4569</port>
<customFields>{"appname":"myapp"}</customFields>
</appender>
<appender name="LOGSTASH"
class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>IP:PORT</destination>
<!-- encoder必须配置,有多种可选 -->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"appname":"myapp"}</customFields>
</encoder>
<!-- <destination>destination1.domain.com:4560</destination>
<destination>destination2.domain.com:4560</destination>
<destination>destination3.domain.com:4560</destination> -->
<connectionStrategy>
<roundRobin>
<connectionTTL>5 minutes</connectionTTL>
</roundRobin>
</connectionStrategy>
</appender>

<root level="info">
<!-- <appender-ref ref="file" /> -->
<appender-ref ref="socket" />
<!-- <appender-ref ref="LOGSTASH" /> -->
</root>

</configuration>


上面的配置文件主要有以下几点不同
首先我们采用了tcp的方式将日志发送给ElasticSearch搜索引擎
然后多了一个这个

<customFields>{"appname":"myapp"}</customFields>
这个配置是我自定义的看了 跳转的文档之后就会明白 这个是扩展字段,每条日志信息都会带有这个信息
如下:




从而我们就可以区分每条日志
接下来我们看 logstash配置文件应如何配置


input {
tcp {
port => 4569
codec => "json"
}
}

output {

elasticsearch {
action => "index"
hosts => ["IP:prot"]
index => "%{[appname]}"
}

}


上面就是我们的配置 是不是很简单,简单解释一下

net.logstash.logback 这个框架默认输出日志是json 所以一定要有codec => "json" 这个配置

index => "%{[appname]}" 这个配置就是获取日志中的 appname字段的值做为索引的名称

哦忘了解释一下

<connectionStrategy>
  <roundRobin>
    <connectionTTL>5 minutes</connectionTTL>
  </roundRobin>
</connectionStrategy>

这个配置是 向logstash输出日志如果有多个logstash IP或端口可以轮询负载各端口

以上就是这次问题的记录,希望对有需要的有所帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: