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