Comment faire pour que liquibase se connecte avec slf4j?

beaucoup de les gens doute comment à fix la journalisation pour liquibase, soit sur la console ou d'un fichier.

est-il possible de faire de la liquibase log en slf4j?

24
demandé sur Community 2014-01-02 14:23:35

4 réponses

il y en a, mais c'est un peu obscur. Citation fixation de l'enregistrement liquibase avec SLF4J et Log4J :

il y a la voie facile , en tombant dans une dépendance:

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

maintenant les deux premiers sont vos cadres de journalisation quotidiens (api slf4j et mise en œuvre de log4j). Ceux-ci s'ajoutent à votre dépendance log4j standard, car tout ce qu'ils font, c'est se diriger vers le cadre de journalisation physique. Sans log4j / logback / etc. lui-même, ils ne peuvent toujours pas la route quoi que ce soit.

la dernière est cependant intéressante, car elle fournit une classe unique dans un paquet spécifique que liquibase scannera pour les implémentations Logger . C'est open source, par Matt Bertolini, donc vous pouvez le trouver sur GitHub .

Si vous voulez le faire vous-même, il y a aussi à La Dure :

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

cette implémentation fonctionne, mais ne doit être utilisée qu'à titre d'exemple. Par exemple, je n'utilise pas les noms de Liquibase pour exiger une journalisation, mais utilise cette classe Logger à la place. Les versions de Matt font quelques null - vérifications aussi, donc c'est probablement une implémentation plus mature à utiliser, plus c'est open source.

39
répondu Benny Bottema 2014-08-21 15:08:09

Je ne suis pas très sûr de votre exigence, mais ce que je comprends c'est que vous voulez enregistrer tous les journaux liquibase en utilisant L'API SLF4J. Si je suis à droite, puis-je suppose que vous pouvez en mesure de le faire.

ajoutez D'abord la dépendance suivante dans votre pom.fichier 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>

et dans votre logback.fichier xml, ajouter logger pour liquibase et définir le niveau selon votre exigence.

  <logger name="liquibase" level="DEBUG" />
4
répondu Waheed 2014-01-09 05:45:16

j'ai essayé la même chose dans ma demande et il semble que cela fonctionne bien. Je peux voir le log de liquibase dans mon fichier log.

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
répondu Waheed 2014-01-08 05:52:57

voici ma recette pour faire liquibase 3.5.3 ouvrir une session sous windows lorsque vous utilisez la ligne de commande. Il n'utilise pas exactement 'slf4j' mais résout le problème d'obtenir des fichiers journaux des mises à jour de db, en faisant liquibase utiliser java.util.journalisation.

1) Obtenir le liquibase-javalogger-3.0.jar à partir d'ici https://github.com/liquibase/liquibase-javalogger/releases /

2) Mettez-le à %LIQUIDASE_HOME % / lib directory

3) Créer logger.fichier de propriétés avec le contenu suivant:

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) Ajouter l'option java à liquibase (par exemple via set JAVA_OPTS=...):

-Djava.util.logging.config.file=logger.properties
0
répondu vrogach 2018-04-28 16:41:07