首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以编程方式向Tomcat添加AccessLogValve?

如何以编程方式向Tomcat添加AccessLogValve?
EN

Stack Overflow用户
提问于 2016-10-21 08:59:31
回答 3查看 4.7K关注 0票数 5

我正在开发一个Spring应用程序,我希望通过我的slf4j日志系统并最终将Tomcat的访问日志路由到一个远程syslog。

因为是Spring,所以我想避免接触tomcat的server.xml文件。

我的AccessLogValve非常简单:

代码语言:javascript
复制
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连接起来:

代码语言:javascript
复制
@Component
public class LogConfig {

    @Autowired
    private ServletContext servletContext;

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

}

除了addValve()方法不存在.

所以..。有谁知道我怎样才能加入我的AccessLogValve呢?

我也愿意接受完全不同的建议,让访问日志进入远程syslog,但是我们正在开发数十个微服务,所以它必须是一种非常标准化的方法,对于每个微服务来说都很容易实现。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-19 13:05:34

将这些答案组合成与springboot 2.0一起工作的东西

代码语言:javascript
复制
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());
        }

    }
}
票数 4
EN

Stack Overflow用户

发布于 2017-08-30 22:21:05

此外,我建议用AbstractAccessLogValve而不是AccessLogValve来扩展AccessLogValve。它不会初始化AccessLogValve与文件访问日志文件相关的功能。

例如:

代码语言:javascript
复制
import java.io.CharArrayWriter;
import org.apache.catalina.valves.AbstractAccessLogValve;

public class Log4JAccessLogValve extends AbstractAccessLogValve {

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

}
票数 2
EN

Stack Overflow用户

发布于 2016-10-21 10:30:01

使用EmbeddedServletContainerCustomizer接口。添加一个自定义阀门到你的嵌入式猫。

例如

代码语言:javascript
复制
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter implements EmbeddedServletContainerCustomizer {

   @Override
   public void customize(ConfigurableEmbeddedServletContainer container) {
       if (container instanceof TomcatEmbeddedServletContainerFactory) {
           TomcatEmbeddedServletContainerFactory factory = (TomcatEmbeddedServletContainerFactory) container;
           AccessLogValve accessLogValve = new Log4JAccessLogValve();
           accessLogValve.setDirectory("/var/log/access_log");
           accessLogValve.setPattern("%h %u %t &quot;%r&quot; %s %b - %T");
           accessLogValve.setSuffix(".log");
           factory.addContextValves(accessLogValve);
       } else {
           logger.error("WARNING! this customizer does not support a custom configured container");
       }
   }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40172395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档