一尘不染

如何使用SLF4J获取Liquibase进行日志记录?

java

许多不确定如何将Liquibase的日志记录修复到控制台或文件中。

是否可以将liquibase日志记录到slf4j?


阅读 345

收藏
2020-12-03

共1个答案

一尘不染

有,但是有点模糊。使用SLF4J和Log4J引用修复的liquibase日志记录

简单的方法 ,通过在依赖下降:

<!-- your own standard logging dependencies -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.5</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId><!-- or log4j2 or logback or whatever-->
    <version>1.7.5</version>
</dependency>

<!-- special dependency to fix liquibase's logging fetish -->
<dependency>
    <groupId>com.mattbertolini</groupId>
    <artifactId>liquibase-slf4j</artifactId>
    <version>1.2.1</version>
</dependency>

现在,前两个是您的日常日志记录框架(slf4j
api和log4j实现)。这些是您对标准log4j依赖项的补充,因为它们所做的只是路由到物理日志记录框架。没有log4j / logback /
etc。本身,他们仍然无法路由任何内容。

然而,最后一个有趣,因为它在liquibase将扫描Logger实现的特定程序包中提供了单个类。它是由Matt
Bertolini开源的,因此您可以在GitHub上找到它

如果您想自己做,还有The Hard Way

package liquibase.ext.logging; // this is *very* important

import liquibase.changelog.ChangeSet;
import liquibase.changelog.DatabaseChangeLog;
import liquibase.logging.core.AbstractLogger;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Liquibase finds this class by itself by doing a custom component scan (sl4fj wasn't generic enough).
 */
public class LiquibaseLogger extends AbstractLogger {
    private static final Logger LOGGER = LoggerFactory.getLogger(LiquibaseLogger.class);
    private String name = "";

    @Override
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public void severe(String message) {
        LOGGER.error("{} {}", name, message);
    }

    @Override
    public void severe(String message, Throwable e) {
        LOGGER.error("{} {}", name, message, e);
    }

    @Override
    public void warning(String message) {
        LOGGER.warn("{} {}", name, message);
    }

    @Override
    public void warning(String message, Throwable e) {
        LOGGER.warn("{} {}", name, message, e);
    }

    @Override
    public void info(String message) {
        LOGGER.info("{} {}", name, message);
    }

    @Override
    public void info(String message, Throwable e) {
        LOGGER.info("{} {}", name, message, e);
    }

    @Override
    public void debug(String message) {
        LOGGER.debug("{} {}", name, message);
    }

    @Override
    public void debug(String message, Throwable e) {
        LOGGER.debug("{} {}", message, e);
    }

    @Override
    public void setLogLevel(String logLevel, String logFile) {
    }

    @Override
    public void setChangeLog(DatabaseChangeLog databaseChangeLog) {
    }

    @Override
    public void setChangeSet(ChangeSet changeSet) {
    }

    @Override
    public int getPriority() {
        return Integer.MAX_VALUE;
    }
}

此实现有效,但仅应作为示例。例如,我不是在使用Liquibase的名称来进行日志记录,而是使用此类Logger本身。Matt的版本也执行一些
null 检查,因此这可能是使用起来更成熟的实现,而且它是开源的。

2020-12-03