tutorial curso create java logging log4j slf4j liquibase

java - curso - ¿Cómo hacer que liquibase registre usando slf4j?



liquibase tutorial (4)

Aquí está mi receta para hacer que liquibase 3.5.3 inicie sesión en el archivo bajo Windows cuando se ejecuta desde la línea de comandos. No usa exactamente ''slf4j'' pero resuelve el problema de obtener archivos de registro de actualizaciones de db, haciendo que liquibase use java.util.logging.

1) obtenga el liquibase-javalogger-3.0.jar desde aquí https://github.com/liquibase/liquibase-javalogger/releases/

2) póngalo en el directorio% LIQUIBASE_HOME% / lib

3) cree el archivo logger.properties con el siguiente contenido:

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

4) agregue la opción java a liquibase (por ejemplo, a través de set JAVA_OPTS = ...):

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

Ejemplo de mi archivo batch de liquibase wrapper:

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

Mucha people no está segura de how fix registro de liquibase, ya sea en la consola o en el archivo.

¿Es posible hacer registro de liquibase a slf4j?


Hay, pero es un poco oscuro. Cotización Fixing liquibase logging con SLF4J y Log4J :

Ahí está The Easy Way , al dejar caer una dependencia:

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

Ahora los dos primeros son sus marcos de registro diarios (slf4j api y log4j implementación). Estos son adicionales a su dependencia log4j estándar, ya que todo lo que hacen es enrutar al marco de registro físico. Sin log4j / logback / etc. En sí, todavía no pueden enrutar nada.

El último, sin embargo, es interesante, ya que proporciona una clase única en un paquete específico que liquibase buscará en las implementaciones de Logger . Es de código abierto, por Matt Bertolini, para que lo puedas encontrar en GitHub .

Si deseas hacer esto por ti mismo, también está 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; } }

Esta implementación funciona, pero solo debe usarse como ejemplo. Por ejemplo, no estoy usando los nombres de Liquibase para requerir un registro, pero en su lugar usa esta clase Logger . Las versiones de Matt también tienen algunos controles nulos , por lo que probablemente sea una implementación más madura para usar, además de que es de código abierto.


Intenté lo mismo en mi aplicación y parece que está funcionando bien. Puedo ver el registro de liquibase en mi archivo de registro.

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


No estoy muy seguro de su requerimiento pero lo que entiendo es que desea registrar todo el registro de liquibase utilizando la API de SLF4J. Si tengo razón, entonces supongo que puedes hacerlo.

Primero agregue la siguiente dependencia en su archivo 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>

y en su archivo logback.xml, agregue el registrador para liquibase y establezca NIVEL según sus requisitos.

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