Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 30 additions & 27 deletions examples/log4j2-custom-format-example/src/main/resources/log4j2.xml
Original file line number Diff line number Diff line change
@@ -1,47 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Configuration status="DEBUG" monitorInterval="30">
<Properties>
<Property name="INSTANCE_IP">192.168.1.100</Property>
<Property name="APP_NAME" value="${spring:spring.application.name:-log4j2-custom-format-example}"/>
<Property name="VER" value="${spring:spring.application.version:-1.0.0}"/>
<Property name="INSTANCE_IP" value="${sys:instanceIp:-192.168.1.100}"/>
<Property name="LOG_HOME">${sys:log.dir:-logs}</Property>
<Property name="LOG_NAME">${APP_NAME}</Property>
<Property name="FILE_NAME">${LOG_HOME}/${APP_NAME}.log</Property>
<Property name="CONSOLE_PATTERN_FORMAT"
value='{"%d{yyyy-MM-dd HH:mm:ss.SSS}","%highlight{%-5level}","%thread","${INSTANCE_IP}","%highlight{%X{trace-id}}","%X{trace-ip}","%highlight{%logger{0}}","%highlight{%method}",%jm}%n'/>
<Property name="JSON_PATTERN_FORMAT"
value='{"dateTime":"%d{yyyy-MM-dd HH:mm:ss.SSS}","level":"%-5level","thread":"%thread","instanceIp":"${INSTANCE_IP}","traceId":"%X{trace-id}","requestIp":"%X{trace-ip}","class":"%logger{0}","method":"%method","message":%jm}%n'/>
</Properties>

<Appenders>
<!-- Console Appender -->
<Console name="CONSOLE" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
<Console name="Console" target="SYSTEM_OUT">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<Pattern>${CONSOLE_PATTERN_FORMAT}</Pattern>
</PatternLayout>
</Console>

<!-- File Appender with Custom JSON Pattern -->
<!-- This pattern will be merged with TraceRoot required fields -->
<!-- User's custom fields: dateTime, thread, class, method, instanceIp, requestIp -->
<!-- Conflicting fields (level, message) will use TraceRoot values -->
<RollingFile name="FILE" fileName="logs/traceroot-sdk.log"
filePattern="logs/traceroot-sdk.%d{yyyy-MM-dd}.%i.log">
<!-- Custom pattern with user-defined fields -->
<PatternLayout pattern='{"dateTime":"%d{yyyy-MM-dd HH:mm:ss.SSS}","level":"%-5level","thread":"%thread","instanceIp":"${INSTANCE_IP}","traceId":"%X{trace-id}","requestIp":"%X{trace-ip}","class":"%logger{0}","method":"%method","message":%jm}%n'/>
<RollingFile name="rollingFile" fileName="${FILE_NAME}"
filePattern="${LOG_HOME}/${LOG_NAME}.%d{yyyy-MM-dd}.log.%i">
<ThresholdFilter level="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout>
<Pattern>${JSON_PATTERN_FORMAT}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="100MB"/>
<SizeBasedTriggeringPolicy size="200MB"/>
</Policies>
<DefaultRolloverStrategy max="30">
<Delete basePath="logs" maxDepth="1">
<IfFileName glob="traceroot-sdk.*.log"/>
<IfLastModified age="30d"/>
</Delete>
</DefaultRolloverStrategy>
<DefaultRolloverStrategy max = "50" />
</RollingFile>
</Appenders>

<Loggers>
<!-- Root logger configuration -->
<Root level="INFO">
<AppenderRef ref="CONSOLE"/>
<AppenderRef ref="FILE"/>
<!-- LOG everything at DEBUG level -->
<Root level="DEBUG">
<AppenderRef ref="Console"/>
<AppenderRef ref="rollingFile"/>
</Root>

<!-- TraceRoot SDK specific logger -->
<Logger name="ai.traceroot.sdk" level="WARN" additivity="false">
<AppenderRef ref="CONSOLE"/>
<AppenderRef ref="FILE"/>
<AppenderRef ref="Console"/>
<AppenderRef ref="rollingFile"/>
</Logger>

<!-- Reduce noise in logs -->
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
<!-- Logging (updated to latest secure version 1.5.18) -->
<logback.version>1.5.18</logback.version>
<slf4j.version>2.0.16</slf4j.version>
<log4j2.version>2.24.3</log4j2.version>
<log4j2.version>2.23.1</log4j2.version>

<!-- AWS SDK (updated to latest) -->
<aws-sdk.version>2.29.15</aws-sdk.version>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,26 +59,28 @@ public static void initialize(TraceRootConfigImpl config) {
}
}

/** Wrap FILE appenders to add TraceRoot JSON format */
/** Wrap all RollingFileAppender instances to add TraceRoot JSON format */
private static void wrapFileAppenders(LoggerContext context, TraceRootConfigImpl config) {
try {
// Get root logger
org.apache.logging.log4j.core.Logger rootLogger =
context.getLogger(LogManager.ROOT_LOGGER_NAME);

// Wrap FILE appenders to add TraceRoot JSON format
org.apache.logging.log4j.core.Appender fileAppender = rootLogger.getAppenders().get("FILE");
if (fileAppender != null && !(fileAppender instanceof Log4j2FileAppenderWrapper)) {
// Remove the original appender
rootLogger.removeAppender(fileAppender);
// Iterate through all appenders and wrap any RollingFileAppender instances
for (org.apache.logging.log4j.core.Appender appender : rootLogger.getAppenders().values()) {
if (appender instanceof org.apache.logging.log4j.core.appender.RollingFileAppender
&& !(appender instanceof Log4j2FileAppenderWrapper)) {
// Remove the original appender
rootLogger.removeAppender(appender);

// Create wrapper with TraceRoot format
Log4j2FileAppenderWrapper wrapper = Log4j2FileAppenderWrapper.wrap(fileAppender);
wrapper.setConfig(config);
wrapper.start();
// Create wrapper with TraceRoot format
Log4j2FileAppenderWrapper wrapper = Log4j2FileAppenderWrapper.wrap(appender);
wrapper.setConfig(config);
wrapper.start();

// Add the wrapped appender
rootLogger.addAppender(wrapper);
// Add the wrapped appender
rootLogger.addAppender(wrapper);
}
}

} catch (Exception e) {
Expand Down