Skip to content

Instantly share code, notes, and snippets.

@ololx
Created July 14, 2021 09:44
Show Gist options
  • Save ololx/6ae29bc3cbaa30b93a0ccc245981ea48 to your computer and use it in GitHub Desktop.
Save ololx/6ae29bc3cbaa30b93a0ccc245981ea48 to your computer and use it in GitHub Desktop.
This is a short code examples for realizing log tracing && log marking in Spring-Boot Applications
import feign.RequestInterceptor;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
/**
* @project some-api
* @created 2021-07-09 15:37
* <p>
* @author Alexander A. Kropotin
*/
@Slf4j
@Component("FeignLogFiltering")
public class FeignLogFiltering implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
String requestId = MDC.get("traceId");
if(requestId != null) {
requestTemplate.header("traceId", requestId);
}
}
}
<configuration >
<include resource="/org/springframework/boot/logging/logback/base.xml" />
<variable name="log-file-path" value="./log" />
<variable name="application-name" value="vtd-dc-api" />
<variable name="log-server-address" value="172.17.0.1" />
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%green(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %yellow([traceId=%X{traceId}, spanId=%X{spanId}]) %green(%logger{36}) : %msg%n%throwable
</Pattern>
</layout>
</appender>
<appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log-file-path}/${application-name}.log</file>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<Pattern>%d %level %logger{36} [%mdc] : %msg%n%throwable</Pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log-file-path}/archived/${application-name}-%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2048MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<root level="INFO">
<appender-ref ref="Console" />
<appender-ref ref="RollingFile" />
</root>
</configuration>
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.UUID;
/**
* @project some-api
* @created 2021-07-09 15:37
* <p>
* @author Alexander A. Kropotin
*/
@Slf4j
@Component("LogFiltering")
public class LogFiltering extends OncePerRequestFilter {
private static final String REQUEST_ID = "traceId";
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
String requestId = request.getHeader(REQUEST_ID);
if (requestId == null) {
requestId = UUID.randomUUID().toString();
}
MDC.put(REQUEST_ID, requestId);
try {
log.trace("Started process request with {} : {}", REQUEST_ID, requestId);
filterChain.doFilter(request, response);
} finally {
MDC.clear();
}
}
}
@ololx
Copy link
Author

ololx commented Jul 14, 2021

logback example for Loki Appender

<configuration >
    <include resource="/org/springframework/boot/logging/logback/base.xml" />

    <variable name="log-file-path" value="./log" />
    <variable name="application-name" value="vtd-dc-api" />
    <variable name="log-server-address" value="172.17.0.1" />

    <appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %green(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %yellow([traceId=%X{traceId}, spanId=%X{spanId}]) %green(%logger{36}) : %msg%n%throwable
            </Pattern>
        </layout>
    </appender>

    <appender name="RollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log-file-path}/${application-name}.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d %level %logger{36} [%mdc] : %msg%n%throwable</Pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log-file-path}/archived/${application-name}-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2048MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <appender name="LOKI" class="com.github.loki4j.logback.Loki4jAppender">
        <http class="com.github.loki4j.logback.ApacheHttpSender">
            <url>http://${log-server-address}:3100/loki/api/v1/push</url>
        </http>
        <format>
            <label>
                <pattern>service=${application-name}, host=${HOSTNAME}, level=%level, thread=%thread</pattern>
            </label>
            <message>
                <pattern>dt=%d lvl=%level traceId=%X{traceId} class=%logger{36} : msg=%msg%n%throwable</pattern>
            </message>
            <sortByTime>true</sortByTime>
        </format>
    </appender>

    <root level="INFO">
        <appender-ref ref="Console" />
        <appender-ref ref="RollingFile" />
        <appender-ref ref="LOKI" />
    </root >

</configuration>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment