1. 拉取elk
docker pull sebp/elk:740
2. 以window平台为例,在磁盘上新建ELK文件夹,然后在该目录下依次新建以下目录,其中elasticsearch 文件下还有data文件夹,如图:
3. 编写docker-compose.yml
version: '2'
services:
elasticsearch:
image: elasticsearch
environment:
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- ./elasticsearch/data:/usr/share/elasticsearch/data
hostname: elasticsearch
restart: always
ports:
- "9200:9200"
- "9300:9300"
kibana:
image: kibana
environment:
- ELASTICSEARCH_URL=http://elasticsearch:9200 #elasticsearch查询接口地址
hostname: kibana
depends_on:
- elasticsearch #后于elasticsearch启动
restart: always
ports:
- "5601:5601"
logstash:
image: logstash
command: logstash -f /etc/logstash/conf.d/logstash.conf #logstash 启动时使用的配置文件
volumes:
- ./logstash/conf.d:/etc/logstash/conf.d #logstash 配文件位置
- ./logst:/tmp
hostname: logstash
restart: always
depends_on:
- elasticsearch #后于elasticsearch启动
ports:
- "7001-7005:7001-7005"
- "4560:4560"
- "9600:9600"
编写 logstash.conf 文件:
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
}
output{
elasticsearch {
hosts => ["elasticsearch:9200"]
manage_template=>false
}
stdout {
codec => rubydebug
}
}
4. 运行,进入ELK目录下
docker-compose up -d
5. 浏览器输入:http://126.0.0.1:5601/
6. springboot 引入 logstash
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>RELEASE</version>
</dependency>
7.logback.xml 文件配置 logstash
<!-- 为logstash输出的JSON格式的Appender -->
<appender name="logstash"
class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:4560</destination>
<!-- <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />-->
<encoder charset="UTF-8"
class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"severity": "%level",
"service": "autho-api",
"trace": "%X{X-B3-TraceId:-}",
"span": "%X{X-B3-SpanId:-}",
"exportable": "%X{X-Span-Export:-}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"message": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<root level="error">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
<appender-ref ref="FILE-ERROR"/>
<appender-ref ref="FILE-INFO"/>
<appender-ref ref="logstash"/>
</root>
logback.xml文件的完整配置:
<configuration>
<property resource="logback.properties"/>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
<!--<property name="LOG_HOME" value="/home" />-->
<!-- 控制台输出 -->
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr"
converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<property name="SPRING_CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="SPRING_FILE_LOG_PATTERN"
value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%25.25t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(--){faint} %clr([%15.50t]){faint} %clr([%X{OperateId}]){blue} %clr(%-40.200logger{200}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<property name="CUSTOM_CONSOLE_LOG_PATTERN"
value="${CUSTOM_CONSOLE_LOG_PATTERN:-%clr(%d{${CUSTOM_CONSOLE_LOG_PATTERN:-HH:mm:ss.SSS}}){faint} %clr(${CUSTOM_CONSOLE_LOG_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${CUSTOM_CONSOLE_LOG_PATTERN:-%wEx}}"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CUSTOM_CONSOLE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${file.path}/${file.name}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>${file.path}/${file.name}.log%i.zip</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>3</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<encoder>
<!--<pattern>%-4relative [%thread] %-5level %logger{35} -%msg%n</pattern>-->
<pattern>${SPRING_FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${file.path}/${file.name}-error.log</file>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${file.path}/${file.name}-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${file.expires}</maxHistory>
<maxFileSize>${file.maxSize}</maxFileSize>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<!--<pattern>%-4relative [%thread] %-5level %logger{35} -%msg%n</pattern>-->
<pattern>${SPRING_FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${file.path}/${file.name}-info.log</file>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${file.path}/${file.name}-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${file.expires}</maxHistory>
<maxFileSize>${file.maxSize}</maxFileSize>
<totalSizeCap>20GB</totalSizeCap>
</rollingPolicy>
<encoder>
<!--<pattern>%-4relative [%thread] %-5level %logger{35} -%msg%n</pattern>-->
<pattern>${SPRING_FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 为logstash输出的JSON格式的Appender -->
<appender name="logstash"
class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:4560</destination>
<!-- <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />-->
<encoder charset="UTF-8"
class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"severity": "%level",
"service": "autho-api",
"trace": "%X{X-B3-TraceId:-}",
"span": "%X{X-B3-SpanId:-}",
"exportable": "%X{X-Span-Export:-}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"message": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<!-- <appender name="SOCKET" class="com.xgs.socket.XgsSocketAppender">
<formatter class="com.xgs.socket.formatter.JsonFormatter">
<expectJson>false</expectJson>
</formatter>
<RemoteHost>${socket.host}</RemoteHost>
<Port>${socket.port}</Port>
<ReconnectionDelay>${socket.delay}</ReconnectionDelay>
<IncludeCallerData>${socket.caller}</IncludeCallerData>
<queueSize>${socket.queue}</queueSize>
</appender>
<appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
<connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
<dataSource class="${jdbc.dataSource}">
<driverClass>${jdbc.clazz}</driverClass>
<jdbcUrl>${jdbc.url}</jdbcUrl>
<user>${jdbc.user}</user>
<password>${jdbc.password}</password>
</dataSource>
</connectionSource>
</appender> -->
<root level="error">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
<appender-ref ref="FILE-ERROR"/>
<appender-ref ref="FILE-INFO"/>
<appender-ref ref="logstash"/>
</root>
<logger name="ch.qos.logback.core.rolling" level="ERROR"/>
<logger name="ch.qos.logback.core.joran" level="ERROR"/>
<logger name="ch.qos.logback.classic.joran.action" level="ERROR"/>
<logger name="io.netty.util" level="ERROR"/>
<logger name="io.netty.buffer" level="ERROR"/>
<logger name="org.apache.commons.beanutils.converters" level="ERROR"/>
<logger name="org.springframework" level="info"/>
<logger name="org.apache.camel" level="INFO"/>
<logger name="io.lettuce" level="ERROR"/>
</configuration>
8. 打印日志:
@ApiOperation(value = "测试")
@GetMapping(value = "/findUser")
public ResultMsg findUserInfo() {
log.error("hi,cn_yaojin.");
return new ResultMsg();
}
9.查看结果: