背景:
springboot微服务应用需要使用logback+elk统一日志管理。
配合nacos使用:
springboot读取配置文件是有优先级的,如果使用默认的logback.xml或者logback-spring.xml为配置文件名则会读取不到nacos上的配置。命名为logback-spring.xml程序只会在运行后一段时间内报错,一段时间后读取到nacos上的配置文件之后会正常,但是有瑕疵。logback.xml直接运行失败。所以得使用自定义命名logback配置名称。如:logback-logstash.xml
1.在nacos上配置
logging:
config: classpath:logback-logstash.xml
classpath的默认路径为resources目录下
2.自定义一些配置
log:
level: info
path: logs/
logstash:
server-addr: 192.168.78.129:9601,192.168.78.129:9602
这里你可以注意到logstash的server-addr可以配置多台节点以”,”分隔
log.level是动态可变的,如果在nacos上改变level,那么运行中的应用也会改变level
3.在新建文件logback-logstash.xml并配置
<?xml version="1.0" encoding="UTF-8"?>
<!--scan自动扫描重新加载配置 scanPeriod重新加载配置的周期-->
<configuration debug="true" scan="true" scanPeriod="10 seconds">
<contextName>logback</contextName>
<!--定义参数,后面可以通过${app.name}使用-->
<!--<property name="app-name" value="provider"/>-->
<!--凡是springProperty的配置都将出现在生成的json中,如果原json中已有相同key则将覆盖-->
<springProperty scope="context" name="spring.application.name" source="spring.application.name"/>
<springProperty scope="context" name="server.port" source="server.port"/>
<springProperty scope="context" name="logstash.server-addr" source="logstash.server-addr"/>
<springProperty scope="context" name="log.level" source="log.level"/>
<springProperty scope="context" name="log.path" source="log.path"/>
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>${logstash.server-addr}</destination>
<!-- encoder必须配置,有多种可选 -->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
<!--在生成的json中会加这个字段-->
<!--<customFields>{"appname":"${spring.application.name}"}</customFields>-->
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${log.level}</level>
</filter>
<connectionStrategy>
<roundRobin>
<!-- 轮询时间间隔-->
<connectionTTL>5 minutes</connectionTTL>
<!--<connectionTTL>5 seconds</connectionTTL>-->
</roundRobin>
</connectionStrategy>
</appender>
<!--ConsoleAppender 用于在屏幕上输出日志-->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--定义了一个过滤器,在LEVEL之下的日志输出不会被打印出来-->
<!--这里定义了 DEBUG,也就是控制台不会输出比ERROR级别小的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${log.level}</level>
</filter>
<!-- encoder 默认配置为PatternLayoutEncoder -->
<!--定义控制台输出格式-->
<encoder>
<!--<pattern>%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n</pattern>-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>${log.level}</level>
</filter>
<!--定义日志输出的路径-->
<!--通过 java -Dscheduler.manager.server.home=/path/to XXXX 配置该属性-->
<file>${log.path}/${spring.application.name}.log</file>
<!--定义日志滚动的策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--定义文件滚动时的文件名的格式-->
<fileNamePattern>
${log.path}/${spring.application.name}.%d{yyyy-MM-dd.HH}.log.gz
</fileNamePattern>
<!--60天的时间周期,日志量最大20GB-->
<maxHistory>60</maxHistory>
<!-- 该属性在 1.1.6版本后 才开始支持-->
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<!--每个日志文件最大100MB-->
<maxFileSize>100MB</maxFileSize>
</triggeringPolicy>
<!--定义输出格式-->
<encoder>
<!-- <pattern>%d [%thread] %-5level %logger{36} [%file : %line] - %msg%n</pattern>-->
<!--<pattern>%d{yyyy-MM-dd HH:mm:ss} %contextName %-5level %logger{50} -%msg%n</pattern>-->
<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="stdout"/>
<appender-ref ref="LOGSTASH"/>
<appender-ref ref="file"/>
</root>
<!--对于类路径以 com.example.logback 开头的Logger,输出级别设置为warn,并且只输出到控制台-->
<!--这个logger没有指定appender,它会继承root节点中定义的那些appender-->
<!--<logger name="com.example.logback" level="warn"/>-->
<!--通过 LoggerFactory.getLogger("mytest") 可以获取到这个logger-->
<!--由于这个logger自动继承了root的appender,root中已经有stdout的appender了,自己这边又引入了stdout的appender-->
<!--如果没有设置 additivity="false" ,就会导致一条日志在控制台输出两次的情况-->
<!--additivity表示要不要使用rootLogger配置的appender进行输出-->
<!-- <logger name="mytest" level="info" additivity="false">-->
<!-- <appender-ref ref="stdout"/>-->
<!-- </logger>-->
</configuration>
4.logstash配置:
input {
tcp {
##host:port就是上面appender中的 destination,这里其实把logstash作为服务,开启9601端口接收logback发出的消息
host => "192.168.78.129"
port => 9601
#模式选择为server
mode => "server"
tags => ["tags"]
##格式json
codec => json_lines
}
}
output {
elasticsearch {
#ES地址
hosts => "192.168.78.129:9200"
#指定索引名字,不适用默认的,用来区分各个项目
index => "%{[spring.application.name]}-%{+YYYY.MM.dd}"
}
stdout { codec => rubydebug}
}
图示:
nacos上的配置:
bootstrap.yml配置:
logstash日志:
es索引数据:
kibana仪表盘demo:
版权声明:本文为DPnice原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。