1. Dependence
Since the json format log output is used in the configuration, the following dependencies need to be introduced
":logstash-logback-encoder:4.11",
2. Configuration instructions
1. Log output path
<property name="LOG_PATH" value="phantom-log" />
2. Read the properties in the spring container, here is to get the project name and the server IP to run
<springProperty scope="context" name="appName" source="" /> <springProperty scope="context" name="ip" source="" />
3. Set the format of the log
<property name="CONSOLE_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:} ${ip} ${appName} %highlight(%-5level) %yellow(%X{X-B3-TraceId}),%green(%X{X-B3-SpanId}),%blue(%X{X-B3-ParentSpanId}) %yellow(%thread) %green(%logger) %msg%n"/>
4. Add an output and scroll the output
<appender name="FILEERROR" class="">
5. Specify the output file location
<file>../${LOG_PATH}/${appName}/${appName}-</file>
6. Specify the strategy for scrolling output, segment by number of days, or file size exceeds 2M
<rollingPolicy class=""> <fileNamePattern>../${LOG_PATH}/${appName}/${appName}-error-%d{yyyy-MM-dd}.%</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class=""> <maxFileSize>2MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy>
7. There are four appenders, FILEERROR, FILEEWARN, FILEINFO, and logstash in the following file.
Among them, FILEERROR, FILEEWARN, and FILEINFO are similar, but they only print log information at different levels.
logstash is used to generate log files in json format, which is convenient for integration with the ELK log system.
3. Complete configuration
<?xml version="1.0" encoding="UTF-8"?> <configuration> <contextName>${HOSTNAME}</contextName> <property name="LOG_PATH" value="phantom-log" /> <springProperty scope="context" name="appName" source="" /> <springProperty scope="context" name="ip" source="" /> <property name="CONSOLE_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:} ${ip} ${appName} %highlight(%-5level) %yellow(%X{X-B3-TraceId}),%green(%X{X-B3-SpanId}),%blue(%X{X-B3-ParentSpanId}) %yellow(%thread) %green(%logger) %msg%n"/> <appender name="FILEERROR" class=""> <file>../${LOG_PATH}/${appName}/${appName}-</file> <rollingPolicy class=""> <fileNamePattern>../${LOG_PATH}/${appName}/${appName}-error-%d{yyyy-MM-dd}.%</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class=""> <maxFileSize>2MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <append>true</append> <encoder class=""> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf-8</charset> </encoder> <filter class=""> <level>error</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="FILEWARN" class=""> <file>../${LOG_PATH}/${appName}/${appName}-</file> <rollingPolicy class=""> <fileNamePattern>../${LOG_PATH}/${appName}/${appName}-warn-%d{yyyy-MM-dd}.%</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class=""> <maxFileSize>2MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <append>true</append> <encoder class=""> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf-8</charset> </encoder> <filter class=""> <level>warn</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="FILEINFO" class=""> <file>../${LOG_PATH}/${appName}/${appName}-</file> <rollingPolicy class=""> <fileNamePattern>../${LOG_PATH}/${appName}/${appName}-info-%d{yyyy-MM-dd}.%</fileNamePattern> <timeBasedFileNamingAndTriggeringPolicy class=""> <maxFileSize>2MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <append>true</append> <encoder class=""> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf-8</charset> </encoder> <filter class=""> <level>info</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <appender name="logstash" class=""> <file>../${LOG_PATH}/${appName}/${appName}.json</file> <rollingPolicy class=""> <fileNamePattern>../${LOG_PATH}/${appName}/${appName}-%d{yyyy-MM-dd}.json</fileNamePattern> <maxHistory>7</maxHistory> </rollingPolicy> <encoder class=""> <providers> <timestamp> <timeZone>UTC</timeZone> </timestamp> <pattern> <pattern> { "ip": "${ip}", "app": "${appName}", "level": "%level", "trace": "%X{X-B3-TraceId:-}", "span": "%X{X-B3-SpanId:-}", "parent": "%X{X-B3-ParentSpanId:-}", "thread": "%thread", "class": "%logger{40}", "message": "%message", "stack_trace": "%exception{10}" } </pattern> </pattern> </providers> </encoder> </appender> <appender name="STDOUT" class=""> <encoder> <pattern>${CONSOLE_LOG_PATTERN}</pattern> <charset>utf-8</charset> </encoder> <filter class=""> <level>debug</level> </filter> </appender> <logger name="" level="INFO" /> <logger name="" level="INFO" /> <logger name="" level="DEBUG" /> <root level="INFO"> <appender-ref ref="FILEERROR" /> <appender-ref ref="FILEWARN" /> <appender-ref ref="FILEINFO" /> <appender-ref ref="logstash" /> <appender-ref ref="STDOUT" /> </root> </configuration>
The above is the complete logback configuration example ELK integration includes detailed contents of generating json logs. For more information about OGB configuration ELK integration and generating json logs, please pay attention to my other related articles!