diff --git a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java index be2693c52cd..b6bc45c7b67 100644 --- a/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java +++ b/spring-ai-client-chat/src/main/java/org/springframework/ai/chat/client/advisor/SimpleLoggerAdvisor.java @@ -34,9 +34,11 @@ import org.springframework.lang.Nullable; /** - * A simple logger advisor that logs the request and response messages. + * A configurable logger advisor that logs the request and response messages at + * configurable log levels. * * @author Christian Tzolov + * @author Engineer Zhong */ public class SimpleLoggerAdvisor implements CallAdvisor, StreamAdvisor { @@ -52,19 +54,26 @@ public class SimpleLoggerAdvisor implements CallAdvisor, StreamAdvisor { private final int order; + private final LogLevel requestLogLevel; + + private final LogLevel responseLogLevel; + public SimpleLoggerAdvisor() { - this(DEFAULT_REQUEST_TO_STRING, DEFAULT_RESPONSE_TO_STRING, 0); + this(DEFAULT_REQUEST_TO_STRING, DEFAULT_RESPONSE_TO_STRING, 0, LogLevel.DEBUG, LogLevel.DEBUG); } public SimpleLoggerAdvisor(int order) { - this(DEFAULT_REQUEST_TO_STRING, DEFAULT_RESPONSE_TO_STRING, order); + this(DEFAULT_REQUEST_TO_STRING, DEFAULT_RESPONSE_TO_STRING, order, LogLevel.DEBUG, LogLevel.DEBUG); } public SimpleLoggerAdvisor(@Nullable Function requestToString, - @Nullable Function responseToString, int order) { + @Nullable Function responseToString, int order, LogLevel requestLogLevel, + LogLevel responseLogLevel) { this.requestToString = requestToString != null ? requestToString : DEFAULT_REQUEST_TO_STRING; this.responseToString = responseToString != null ? responseToString : DEFAULT_RESPONSE_TO_STRING; this.order = order; + this.requestLogLevel = requestLogLevel; + this.responseLogLevel = responseLogLevel; } @Override @@ -89,11 +98,41 @@ public Flux adviseStream(ChatClientRequest chatClientRequest } private void logRequest(ChatClientRequest request) { - logger.debug("request: {}", this.requestToString.apply(request)); + logMessage(requestLogLevel, "request: {}", this.requestToString.apply(request)); } private void logResponse(ChatClientResponse chatClientResponse) { - logger.debug("response: {}", this.responseToString.apply(chatClientResponse.chatResponse())); + logMessage(responseLogLevel, "response: {}", this.responseToString.apply(chatClientResponse.chatResponse())); + } + + private void logMessage(LogLevel level, String format, Object arg) { + switch (level) { + case TRACE: + if (logger.isTraceEnabled()) { + logger.trace(format, arg); + } + break; + case DEBUG: + if (logger.isDebugEnabled()) { + logger.debug(format, arg); + } + break; + case INFO: + if (logger.isInfoEnabled()) { + logger.info(format, arg); + } + break; + case WARN: + if (logger.isWarnEnabled()) { + logger.warn(format, arg); + } + break; + case ERROR: + if (logger.isErrorEnabled()) { + logger.error(format, arg); + } + break; + } } @Override @@ -115,6 +154,12 @@ public static Builder builder() { return new Builder(); } + public enum LogLevel { + + TRACE, DEBUG, INFO, WARN, ERROR + + } + public static final class Builder { private Function requestToString; @@ -123,6 +168,10 @@ public static final class Builder { private int order = 0; + private LogLevel requestLogLevel = LogLevel.DEBUG; + + private LogLevel responseLogLevel = LogLevel.DEBUG; + private Builder() { } @@ -141,8 +190,25 @@ public Builder order(int order) { return this; } + public Builder requestLogLevel(LogLevel logLevel) { + this.requestLogLevel = logLevel; + return this; + } + + public Builder responseLogLevel(LogLevel logLevel) { + this.responseLogLevel = logLevel; + return this; + } + + public Builder logLevel(LogLevel logLevel) { + this.requestLogLevel = logLevel; + this.responseLogLevel = logLevel; + return this; + } + public SimpleLoggerAdvisor build() { - return new SimpleLoggerAdvisor(this.requestToString, this.responseToString, this.order); + return new SimpleLoggerAdvisor(this.requestToString, this.responseToString, this.order, + this.requestLogLevel, this.responseLogLevel); } }