ありますが、少しあいまいです。引用 SLF4JとLog4Jを使用したliquibaseロギングの修正 :
簡単な方法があります、依存関係をドロップします:
<!-- 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>
最初の2つは、日常のロギングフレームワーク(slf4j apiおよびlog4j実装)です。これらは、物理的なログフレームワークにルーティングするだけなので、標準のlog4j依存関係に追加されます。 log4j/logback/etcなし。それ自体、まだ何もルーティングできません。
ただし、最後の1つは興味深いものです。これは、特定のパッケージで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のバージョンはいくつかのnull-checksも行うので、これはおそらくより成熟した実装であり、オープンソースです。
私はあなたの要件についてはあまりわかりませんが、SLF4J APIを使用してすべてのliquibaseログを記録したいということを理解しています。私が正しければ、あなたはそれを行うことができると思います。
まず、次の依存関係を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" />
コマンドラインから実行したときにliquibase 3.5.3をWindowsのファイルにログインさせるための私のレシピを次に示します。それは正確に「slf4j」を使用しませんが、liquibaseにJava.util.loggingを使用させることにより、db更新のログファイルを取得する問題を解決します。
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
私のliquibaseラッパーバッチファイルの例:
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バージョンに切り替えました。 liquibase 3.6.2の場合、次の設定を使用してWindowsコマンドラインから実行します。
1)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/
私のアプリケーションでも同じことを試しましたが、うまく機能しているようです。ログファイルにliquibaseログが表示されます。
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