Подтвердить что ты не робот

Как получить Liquibase для регистрации с помощью slf4j?

Многие люди не уверены, как исправить журналирование для liquibase, либо на консоли, либо в файле.

Можно ли сделать журнал жидкости на slf4j?

4b9b3361

Ответ 1

Есть, но это немного неясно. Цитирование Фиксация регистрации липибазы с помощью SLF4J и Log4J:

Там есть простой способ: сбросив зависимость:

<!-- 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 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 также выполняется несколько нулевых проверок, поэтому, возможно, более зрелая реализация, плюс ее открытый источник.

Ответ 2

Я не очень уверен в ваших требованиях, но я понимаю, что вы хотите зарегистрировать весь журнал Liquibase с использованием API SLF4J. Если я прав, я думаю, вы сможете это сделать.

Сначала добавьте следующую зависимость в свой файл pom.xml:

<dependency>
    <groupId>com.mattbertolini</groupId>
    <artifactId>liquibase-slf4j</artifactId>
    <version>1.2.1</version>
</dependency>

<dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.6.6</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>log4j-over-slf4j</artifactId>
        <version>1.6.6</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>1.0.7</version>
    </dependency>

    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.0.7</version>
    </dependency>

и в файл logback.xml, добавьте регистратор для Liquibase и установите LEVEL в соответствии с вашим требованием.

  <logger name="liquibase" level="DEBUG" />

Ответ 3

Вот мой рецепт, чтобы заставить liquibase 3.5.3 войти в файл под windows при запуске из командной строки. Он не использует точно "slf4j", но решает проблему получения файлов журнала обновлений базы данных, заставляя liquibase использовать java.util.logging.

1) получите liquibase-javalogger-3.0.jar отсюда https://github.com/liquibase/liquibase-javalogger/releases/

2) поместите его в каталог% LIQUIBASE_HOME%/lib

3) создать файл logger.properties следующего содержания:

handlers=java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level=FINEST
java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.FileHandler.pattern=liquibase.log
java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append=true
#2018-04-28 17:29:44 INFO Example logging record
java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS %4$s %5$s%6$s%n

4) добавить опцию java в liquibase (например, через set JAVA_OPTS =...):

-Djava.util.logging.config.file=logger.properties

Пример моего пакетного файла обёрточной жидкости:

set username=%USER%
set password="%PASSWORD%"

set URL="jdbc:db2://mydbserver:50000/MYDB"

set JAVA_OPTS=-Djava.util.logging.config.file=db2/logger.properties

call liquibase.bat ^
    --driver="com.ibm.db2.jcc.DB2Driver" ^
    --defaultSchemaName=MYSCHEMA ^
    --liquibaseSchemaName=MYSCHEMA ^
    --changeLogFile=db2/changelog.xml ^
    --url=%URL% ^
    --username=%USER% ^
    --password="%PASSWORD%" ^
    --logLevel=debug

ОБНОВИТЬ:

Я перешел на новую версию liquibase, которая по умолчанию использует logback. Для liquibase 3.6.2 используйте следующую настройку для запуска из командной строки Windows:

1) Убедитесь, что slfj доступен в java classpath. Поместите файл slf4j-api-1.7.25.jar в папку liquibase/lib. Файл jar можно найти в официальном дистрибутиве slfj: https://www.slf4j.org/download.html

2) Задайте параметр пути файла конфигурации logback:

JAVA_OPTS=-Dlogback.configurationFile=logback.xml

3) Добавьте файл конфигурации logback.xml. Пример здесь: https://www.mkyong.com/logging/logback-xml-example/

Ответ 4

Я попробовал то же самое в своем приложении и, похоже, работает нормально. Я вижу, что липибаза регистрируется в моем файле журнала.

2014-01-08 11:16:21,452 [main] DEBUG liquibase - Computed checksum for addColumn:[
    columns=[
        column:[
            name="IS_NEW"
            type="BIT"
        ]
    ]
    tableName="TENANT"
] as e2eb1f5cb8dcfca7d064223044d06de9
2014-01-08 11:16:21,452 [main] DEBUG liquibase - Computed checksum for 3:e2eb1f5cb8dcfca7d064223044d06de9: as 549852ffb531de4929ae433ff0be2742
2014-01-08 11:16:21,455 [main] DEBUG liquibase - Release Database Lock
2014-01-08 11:16:21,456 [main] DEBUG liquibase - Executing UPDATE database command: UPDATE `DATABASECHANGELOGLOCK` SET `LOCKED` = 0, `LOCKEDBY` = NULL, `LOCKGRANTED` = NULL WHERE `ID` = 1
2014-01-08 11:16:21,518 [main] INFO  liquibase - Successfully released change log lock