it-swarm.com.de

Wie bekomme ich Liquibase mit slf4j zum loggen?

Viele Personen sind sich nicht sicher, wie - sie beheben ob sie nach liquibase suchen, entweder auf der Konsole oder in einer Datei.

Ist es möglich, liquibase log zu slf4j zu machen?

27
Benny Bottema

Es gibt, aber es ist ein wenig dunkel. Zitieren Fixieren der Protokollierung von Liquibase mit SLF4J und Log4J :

Es gibt Der einfache Weg , indem Sie in eine Abhängigkeit fallen:

<!-- 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>

Nun sind die ersten beiden Ihre täglichen Logging-Frameworks (Implementierung von slf4j api und log4j). Diese sind zusätzlich zu Ihrer standardmäßigen log4j-Abhängigkeit vorhanden, da sie lediglich zum physischen Protokollierungs-Framework routen. Ohne log4j/logback/etc. selbst können sie immer noch nichts routen.

Die letzte ist jedoch interessant, da sie eine einzelne Klasse in einem bestimmten Paket enthält, die liquibase nach Logger-Implementierungen durchsucht. Es ist Open Source von Matt Bertolini, also können Sie finden Sie es auf GitHub .

Wenn Sie dies selbst tun möchten, gibt es auch 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;
    }
}

Diese Implementierung funktioniert, sollte aber nur als Beispiel verwendet werden. Zum Beispiel verwende ich keine Liquibase-Namen, um eine Protokollierung zu erfordern, sondern benutze stattdessen diese Logger-Klasse. Die Versionen von Matt führen auch einige null - Prüfungen durch, daher ist dies wahrscheinlich eine ausgereiftere Implementierung und außerdem Open Source.

42
Benny Bottema

Ich bin mir nicht ganz sicher, was Ihre Anforderung angeht, aber ich verstehe, dass Sie alle Liquibase-Protokolle mithilfe der SLF4J-API protokollieren möchten. Wenn ich recht habe, können Sie es wohl schaffen.

Fügen Sie zunächst folgende Abhängigkeit in Ihre Datei pom.xml ein:

<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>

fügen Sie in Ihrer Datei logback.xml den Logger für liquibase hinzu, und legen Sie LEVEL gemäß Ihren Anforderungen fest.

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

Hier ist mein Rezept, mit dem sich liquibase 3.5.3 in der Datei unter Windows anmelden lässt, wenn es von der Befehlszeile aus ausgeführt wird. Es verwendet nicht genau 'slf4j', sondern löst das Problem des Abrufs von Protokolldateien von Datenbankupdates, indem es liquibase erstellt Verwenden Sie Java.util.logging.

1) Holen Sie sich hier die Datei liquibase-javalogger-3.0.jar https://github.com/liquibase/liquibase-javalogger/releases/

2) Legen Sie es in das Verzeichnis% LIQUIBASE_HOME%/lib

3) Erstellen Sie die Datei logger.properties mit folgendem Inhalt:

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-Option zu liquibase hinzufügen (z. B. über das Set Java_OPTS = ...):

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

Beispiel für eine Liquibase-Wrapper-Batchdatei:

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

AKTUALISIEREN:

Ich habe auf eine neue Liquibase-Version umgestellt, die standardmäßig Logback verwendet. Für liquibase 3.6.2 verwenden Sie das folgende Setup, um von der Windows-Befehlszeile aus zu laufen:

1) Stellen Sie sicher, dass slfj im Java-Klassenpfad erreichbar ist. Legen Sie die Datei slf4j-api-1.7.25.jar im Ordner liquibase/lib ab. Die JAR-Datei finden Sie im offiziellen slfj-Distributionspaket: https://www.slf4j.org/download.html

2) Legen Sie den Pfadparameter für die Logback-Konfigurationsdatei fest: 

Java_OPTS=-Dlogback.configurationFile=logback.xml

3) Fügen Sie die Konfigurationsdatei logback.xml hinzu. Beispiel ist hier: https://www.mkyong.com/logging/logback-xml-example/

2
vrogach

Ich habe das Gleiche in meiner Anwendung ausprobiert und scheint gut zu funktionieren. Ich kann das liquibase-Protokoll in meiner Protokolldatei sehen. 

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
0
Waheed