From 7680a08ee7e0dca234eb38722ffc10a38b2e9870 Mon Sep 17 00:00:00 2001 From: engineer Date: Fri, 4 Jul 2025 22:06:54 +0800 Subject: [PATCH 1/2] feat(SimpleLoggerAdvisor): Add log level configuration function Signed-off-by: engineer --- .../client/advisor/SimpleLoggerAdvisor.java | 89 +++++++++++++++---- 1 file changed, 74 insertions(+), 15 deletions(-) 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..ffa4a73b20b 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,37 +34,42 @@ 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 { public static final Function DEFAULT_REQUEST_TO_STRING = ChatClientRequest::toString; - public static final Function DEFAULT_RESPONSE_TO_STRING = ModelOptionsUtils::toJsonStringPrettyPrinter; private static final Logger logger = LoggerFactory.getLogger(SimpleLoggerAdvisor.class); private final Function requestToString; - private final Function responseToString; - 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 @@ -80,7 +85,7 @@ public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAd @Override public Flux adviseStream(ChatClientRequest chatClientRequest, - StreamAdvisorChain streamAdvisorChain) { + StreamAdvisorChain streamAdvisorChain) { logRequest(chatClientRequest); Flux chatClientResponses = streamAdvisorChain.nextStream(chatClientRequest); @@ -89,11 +94,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,13 +150,17 @@ public static Builder builder() { return new Builder(); } + public enum LogLevel { + TRACE, DEBUG, INFO, WARN, ERROR + } + public static final class Builder { private Function requestToString; - private Function responseToString; - private int order = 0; + private LogLevel requestLogLevel = LogLevel.DEBUG; + private LogLevel responseLogLevel = LogLevel.DEBUG; private Builder() { } @@ -141,10 +180,30 @@ public Builder order(int order) { return this; } - public SimpleLoggerAdvisor build() { - return new SimpleLoggerAdvisor(this.requestToString, this.responseToString, this.order); + 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, + this.requestLogLevel, + this.responseLogLevel + ); + } + } } From e7b2eb7af0459cb3197fce5175e592164dc994a5 Mon Sep 17 00:00:00 2001 From: engineer Date: Tue, 8 Jul 2025 19:41:23 +0800 Subject: [PATCH 2/2] =?UTF-8?q?refactor(spring-ai-client-chat):=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20SimpleLoggerAdvisor=20=E7=B1=BB=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84=E5=92=8C=E5=8F=AF=E8=AF=BB?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 调整代码格式,提高可读性 - 优化导入语句,移除冗余导入 - 重构构造函数和 Builder 类,提高代码清晰度 - 添加必要的空行,改善代码组织 --- .../client/advisor/SimpleLoggerAdvisor.java | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) 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 ffa4a73b20b..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,7 +34,8 @@ import org.springframework.lang.Nullable; /** - * A configurable logger advisor that logs the request and response messages at configurable log levels. + * A configurable logger advisor that logs the request and response messages at + * configurable log levels. * * @author Christian Tzolov * @author Engineer Zhong @@ -42,14 +43,19 @@ public class SimpleLoggerAdvisor implements CallAdvisor, StreamAdvisor { public static final Function DEFAULT_REQUEST_TO_STRING = ChatClientRequest::toString; + public static final Function DEFAULT_RESPONSE_TO_STRING = ModelOptionsUtils::toJsonStringPrettyPrinter; private static final Logger logger = LoggerFactory.getLogger(SimpleLoggerAdvisor.class); private final Function requestToString; + private final Function responseToString; + private final int order; + private final LogLevel requestLogLevel; + private final LogLevel responseLogLevel; public SimpleLoggerAdvisor() { @@ -61,10 +67,8 @@ public SimpleLoggerAdvisor(int order) { } public SimpleLoggerAdvisor(@Nullable Function requestToString, - @Nullable Function responseToString, - int order, - LogLevel requestLogLevel, - LogLevel responseLogLevel) { + @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; @@ -85,7 +89,7 @@ public ChatClientResponse adviseCall(ChatClientRequest chatClientRequest, CallAd @Override public Flux adviseStream(ChatClientRequest chatClientRequest, - StreamAdvisorChain streamAdvisorChain) { + StreamAdvisorChain streamAdvisorChain) { logRequest(chatClientRequest); Flux chatClientResponses = streamAdvisorChain.nextStream(chatClientRequest); @@ -151,15 +155,21 @@ public static Builder builder() { } public enum LogLevel { + TRACE, DEBUG, INFO, WARN, ERROR + } public static final class Builder { private Function requestToString; + private Function responseToString; + private int order = 0; + private LogLevel requestLogLevel = LogLevel.DEBUG; + private LogLevel responseLogLevel = LogLevel.DEBUG; private Builder() { @@ -197,13 +207,10 @@ public Builder logLevel(LogLevel logLevel) { } public SimpleLoggerAdvisor build() { - return new SimpleLoggerAdvisor( - this.requestToString, - this.responseToString, - this.order, - this.requestLogLevel, - this.responseLogLevel - ); + return new SimpleLoggerAdvisor(this.requestToString, this.responseToString, this.order, + this.requestLogLevel, this.responseLogLevel); } + } + }