gpt4 book ai didi

java - 如何以编程方式将 AccessLogValve 添加到 Tomcat?

转载 作者:行者123 更新时间:2023-11-28 22:11:29 25 4
gpt4 key购买 nike

我正在开发一个 Spring 启动应用程序,我想通过我的 slf4j 日志系统将 Tomcat 的访问日志路由到远程系统日志。

既然是Spring,我想避免接触tomcat的server.xml文件。

我的 AccessLogValve 非常简单:

import java.io.CharArrayWriter;
import org.apache.catalina.valves.AccessLogValve;

public class Log4JAccessLogValve extends AccessLogValve {
@Override
public void log(CharArrayWriter message) {
log.info(message.toString());
}
}

我希望可以使用类似这样的东西将它连接到 Tomcat:

@Component
public class LogConfig {

@Autowired
private ServletContext servletContext;

@PostConstruct
public void setAccessLogValve() {
((ApplicationContextFacade)servletContext).addValve(new Log4JAccessLogValve());
}

}

除了 addValve() 方法不存在...

那么...有人知道我如何连接我的 AccessLogValve 吗?


我也对将访问日志获取到远程系统日志中的完全不同的建议持开放态度,但我们正在制作数十种微服务,因此它必须是一种非常标准化的方法,并且对于每个微服务都易于实现。

最佳答案

将这些答案组合成适用于 springboot 2.0 的东西

import org.apache.catalina.valves.AbstractAccessLogValve;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.stereotype.Component;

import java.io.CharArrayWriter;

/**
* see https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot
*
*/
@Component
@Slf4j
public class CustomizeEmbeddedTomcatContainer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

@Override
public void customize(TomcatServletWebServerFactory factory) {

log.info("configuring embedded Tomcat");
TomcatSlf4jAccessValve accessLogValve = new TomcatSlf4jAccessValve();
accessLogValve.setEnabled(true);

/**
* for pattern format see https://tomcat.apache.org/tomcat-7.0-doc/api/org/apache/catalina/valves/AccessLogValve.html
*/
accessLogValve.setPattern("request: method=%m uri=\"%U\" response: statuscode=%s bytes=%b duration=%D(ms) client: remoteip=%a user=%u useragent=\"%{User-Agent}i\"");

factory.addContextValves(accessLogValve);
}


public static class TomcatSlf4jAccessValve extends AbstractAccessLogValve {

Logger httpAccessLogLogger = LoggerFactory.getLogger("http_access_log");

@Override
protected void log(CharArrayWriter message) {
httpAccessLogLogger.info(message.toString());
}

}
}

关于java - 如何以编程方式将 AccessLogValve 添加到 Tomcat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40172395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com