许多人不确定如何将Liquibase的日志记录修复到控制台或文件中。
是否可以将liquibase日志记录到slf4j?
有,但是有点模糊。使用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上找到它。
Logger
如果您想自己做,还有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 检查,因此这可能是使用起来更成熟的实现,而且它是开源的。