Springboot 使用logback直接將日誌寫入Elasticsearch
阿新 • • 發佈:2020-12-13
正常情況下,一般組合為elk 即日誌會通過logstash寫入es,但本文主要為輕量級專案直接利用appender寫入es
首先需要引入包
<dependency> <groupId>com.internetitem</groupId> <artifactId>logback-elasticsearch-appender</artifactId> <version>1.6</version> </dependency>
新增logback-spring.xml到resource目錄的根目錄下
<?xml version="1.0" encoding="UTF-8"?> <configuration> <property name="LOGS" value="./logs"/> <appender name="Console" class="ch.qos.logback.core.ConsoleAppender"> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern> %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable </Pattern> </layout> </appender> <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOGS}/spring-boot-logger.log</file> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <Pattern>%d %p %C{1.} [%t] %m%n</Pattern> </encoder> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- rollover daily and when the file reaches 10 MegaBytes --> <fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log </fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> </appender> <appender name="ELASTIC" class="com.internetitem.logback.elasticsearch.ElasticsearchAppender"> <url>ES連線字串</url> <index>linkanyway-logs-%date{yyyy-MM-dd}</index> <type>tester</type> <loggerName>linkanyway-logger</loggerName> <!-- optional --> <errorLoggerName>linkanyway-error-logger</errorLoggerName> <!-- optional --> <connectTimeout>30000</connectTimeout> <!-- optional (in ms, default 30000) --> <errorsToStderr>false</errorsToStderr> <!-- optional (default false) --> <includeCallerData>false</includeCallerData> <!-- optional (default false) --> <logsToStderr>false</logsToStderr> <!-- optional (default false) --> <maxQueueSize>104857600</maxQueueSize> <!-- optional (default 104857600) --> <maxRetries>3</maxRetries> <!-- optional (default 3) --> <readTimeout>30000</readTimeout> <!-- optional (in ms, default 30000) --> <sleepTime>250</sleepTime> <!-- optional (in ms, default 250) --> <rawJsonMessage>false</rawJsonMessage> <!-- optional (default false) --> <includeMdc>false</includeMdc> <!-- optional (default false) --> <maxMessageSize>100</maxMessageSize> <!-- optional (default -1 --> <authentication class="com.internetitem.logback.elasticsearch.config.BasicAuthentication"/> <!-- optional --> <properties> <property> <name>host</name> <value>${HOSTNAME}</value> <allowEmpty>false</allowEmpty> </property> <property> <name>severity</name> <value>%level</value> </property> <property> <name>thread</name> <value>%thread</value> </property> <property> <name>stacktrace</name> <value>%ex</value> </property> <property> <name>logger</name> <value>%logger</value> </property> </properties> <headers> <header> <name>Content-Type</name> <value>application/json</value> </header> </headers> </appender> <!-- LOG everything at INFO level --> <root level="info"> <appender-ref ref="RollingFile"/> <appender-ref ref="Console"/> <!--所有的日誌都會通過ELASTIC為名的appender計入es--> <appender-ref ref="ELASTIC"/> </root> <!-- LOG "com.baeldung*" at TRACE level --> <logger name="com.baeldung" level="trace" additivity="false"> <appender-ref ref="RollingFile"/> <appender-ref ref="ELASTIC"/> </logger> <logger name="es-logger" level="INFO" additivity="false"> <appender-ref ref="ELASTIC"/> </logger> </configuration>
在application.yml中設定日誌level
logging:
level:
root: info
另外我們也可以在root部分不適用es記錄日誌而在需要的程式碼中用如下方式記錄日誌
package com.linkanyway.portal.controllers; import com.linkanyway.sdk.exception.ApiResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @author linkanyway * @version 1.0 * @name EsLoggerController * @description TODO * @date 2020/12/13 13:14 */ @RestController @RequestMapping("log") public class EsLoggerController { private Logger logger = LoggerFactory.getLogger("es-logger"); @GetMapping("log") public ApiResult<String> log() { logger.warn ("eslogger"); return ApiResult.success ("done!"); } }