【问题标题】:Embedded Tomcat logging over logback / sl4j通过 logback / sl4j 进行嵌入式 Tomcat 日志记录
【发布时间】:2016-12-22 10:56:27
【问题描述】:

如何让嵌入式 tomcat 通过 logback 写入日志?我找到了一些关于使用带有 log4j 的独立 tomcat 的信息。但是嵌入式 tomcat 和 logback 的设置如何?

这些是 Maven 依赖项:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>${logback.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
    <version>${tomcat.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-logging-juli</artifactId>
    <version>${tomcat.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-logging-log4j</artifactId>
    <version>${tomcat.version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    <version>${sl4j.version}</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
    <version>${sl4j.version}</version>
</dependency>

我知道 Spring Boot 会自动进行 tomcat 日志集成。但在这种情况下,我不能使用 Spring。

【问题讨论】:

    标签: tomcat logging logback embedded-tomcat-8


    【解决方案1】:

    Tomcat 8 有一个基于ServiceLoaderdiscovery mechanism,可让您部署自己的记录器实现。

    只需在委托给 Logback/SLF4J 的类中实现 org.apache.juli.logging.Log 并将类名放入类路径上的 META-INF/services/org.apache.juli.logging.Log 文件中。然后 Tomcat 将通过你的类登录。

    import org.apache.juli.logging.Log;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    
    public class DelegateToSlf4jLogger implements Log {
        private final Logger logger;
    
        // constructor required by ServiceLoader
        public DelegateToSlf4jLogger() {
            logger = null;
        }
    
        public DelegateToSlf4jLogger(String name){
            logger = LoggerFactory.getLogger(name);
        }
    
        @Override
        public boolean isDebugEnabled() {
            return logger.isDebugEnabled();
        }
    
        @Override
        public boolean isErrorEnabled() {
            return logger.isErrorEnabled();
        }
    
        @Override
        public boolean isFatalEnabled() {
            return logger.isErrorEnabled();
        }
    
        @Override
        public boolean isInfoEnabled() {
            return logger.isInfoEnabled();
        }
    
        @Override
        public boolean isTraceEnabled() {
            return logger.isTraceEnabled();
        }
    
        @Override
        public boolean isWarnEnabled() {
            return logger.isWarnEnabled();
        }
    
        @Override
        public void trace(Object message) {
            logger.debug(String.valueOf(message));
        }
    
        @Override
        public void trace(Object message, Throwable t) {
            logger.debug(String.valueOf(message), t);
        }
    
        @Override
        public void debug(Object message) {
            logger.debug(String.valueOf(message));
        }
    
        @Override
        public void debug(Object message, Throwable t) {
            logger.debug(String.valueOf(message), t);
        }
    
        @Override
        public void info(Object message) {
            logger.info(String.valueOf(message));
        }
    
        @Override
        public void info(Object message, Throwable t) {
            logger.info(String.valueOf(message), t);
        }
    
        @Override
        public void warn(Object message) {
            logger.warn(String.valueOf(message));
        }
    
        @Override
        public void warn(Object message, Throwable t) {
            logger.warn(String.valueOf(message), t);
        }
    
        @Override
        public void error(Object message) {
            logger.error(String.valueOf(message));
        }
    
        @Override
        public void error(Object message, Throwable t) {
            logger.error(String.valueOf(message), t);
        }
    
        @Override
        public void fatal(Object message) {
            logger.error(String.valueOf(message));
        }
    
        @Override
        public void fatal(Object message, Throwable t) {
            logger.error(String.valueOf(message), t);
        }
    }
    

    【讨论】:

    • 这个解决方案几乎对我有用,但没有使用服务加载器。我需要在类路径下放置一个commons-logging.properties 文件,内容为org.apache.juli.logging.Log=util.DelegateToSlf4jLogger
    【解决方案2】:

    尝试添加安装网桥的代码:

    SLF4JBridgeHandler.removeHandlersForRootLogger();
    SLF4JBridgeHandler.install();
    

    并移除依赖:

    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-logging-log4j</artifactId>
        <version>${tomcat.version}</version>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 2018-01-07
      • 1970-01-01
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 2012-03-25
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多