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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

记⼀次logback传输⽇志到logstash根据⾃定义设置动态创建
ElasticSearch索引
先说背景,由于本⼈⼯作需要创建很多⼩应⽤程序,⽽且在微服务的⼤环境下,服务越来越多,然后就导致⽇志四分五裂,到处都有,然后就有的elk,那么问题来了不能每个⼩应⽤都配置⼀个 logstash 服务来传输⽇志吧,把所有的⽇志都输送到⼀个logstash⾥⾯然后logstash 会都输送到⼀个索引下(之前不知道怎么配),输送到同⼀个所以下那么问题⼜来了,⾸先每个⼩服务程序⽇志量不⼤希望持续监控,也不需要⽤时间来分割(因为⽇志量不⼤),⼜希望查询⽅便(不要告诉我查询的时候多⼀个筛选条件就可以了,俺就是不想那样嫌乱不好找)。

所有有了下⾯的解决⽅案
⾸先本⼈⽤的⽇志框架是logback,使⽤
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.11</version>
</dependency>
这个包进⾏ socket向lostash进⾏⽇志输送
以下为重点
看完之后马上回来,就会明⽩我下⾯说的
⾸先配置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>:4560</destination>
<destination>:4560</destination>
<destination>: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或端⼝可以轮询负载各端⼝
以上就是这次问题的记录,希望对有需要的有所帮助。

相关文档
最新文档