How to get trace id and span id in the log4j2, not the in the [traceId, spanId ] ?
Expected Output : [APPNAME,5a59b2372d9a3814,5a59b2372d9a3814]
Actual Output : [logLevel=ERROR] — 2021-01-21 11:30:32,489 +0530 — http-nio-8080-exec-1 com.springboot.test.aspect.MyAspect — asnId= – message=”Logging key:”, traceId=f19556b82d98bf86, executionTimeSeconds=23
My log4j2 : tried adding below commented property but not seeing trace id in logs
<Property name="LOG_PATTERN">[logLevel=%-5p] -- %d %d{Z} -- %t %c -- asnId=%X{ASN} - %m%n</Property> <property name="log.level">${bundle:DEV:logLevel}</property> <!-- <property name="rolling.file.encoder.pattern" value="%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %-5level : loggerName="%logger{36}" threadName="%thread" appName="${springAppName:-}" trace="%X{X-B3-TraceId:-}" span="%X{X-B3-SpanId:-}" spanName="%X{X-Span-Name:-}" parent="%X{X-B3-ParentSpanId:-}" exportable="%X{X-Span-Export:-}" pid="${PID:-}" txnId="%X{txnId}" %msg%n"/> --> <!-- <property name="PATTERN" value="%h %l %u [%date{dd/MMM/yyyy:HH:mm:ss.SSS}] "%r" %s %b " "%i{User-Agent}" [trace=%responseHeader{X-B3-TraceId},span=%i{X-B3-SpanId}] %D"/> --> </Properties>
Aspect class :
In the log of my Aspect class however I can see the trace id
public class MyAspect { private final static Logger logger = LogManager.getLogger(MyAspect.class); long startTime = new Date().getTime(); @Autowired Tracer tracer; @Around("allControllerMethods() && args(..,@annotation(org.springframework...RequestBody) requestBody) ") public Object controllerEvents(ProceedingJoinPoint jp, Object requestBody) throws Throwable { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); MethodSignature signature = (MethodSignature) jp.getSignature(); Method method = signature.getMethod(); Object resObject = jp.proceed(); logger.error("traceId", tracer.currentSpan().context().traceIdString()); } }
pom :
<dependency> <groupId>io.zipkin.brave</groupId> <artifactId>brave</artifactId> <version>5.12.6</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-sleuth-zipkin</artifactId> <version>2.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> <version>1.4.2.RELEASE</version> </dependency>
ConfigHandler :
@Bean public RestTemplate restTemplate() { return new RestTemplate(); }
Please see that in the test project where I am not using log4j it comes as expected.
Advertisement
Answer
I was able to get the traceId and spanId by making below changes : 1)Add to log4j
<Property name="LOG_PATTERN">[logLevel=%-5p]-- [%X{traceId}/%X{spanId}] -- %d %d{Z} -- %t %c - %m%n</Property>
2)Add property :
request.logging.shouldLog=true
3)Add
@Value("${request.logging.shouldLog}") private boolean shouldLog; // @Override protected boolean shouldLog(HttpServletRequest request) { return shouldLog; }