Helpex - Trao đổi & giúp đỡ Đăng nhập
31

Rất nhiều người không chắc chắn như thế nào để sửa chữa khai thác gỗ cho liquibase, hoặc là để giao diện điều khiển hoặc tập tin.

Có thể tạo nhật ký liquibase cho slf4j không?

31 hữu ích 0 bình luận 21k xem chia sẻ
45

Có, nhưng nó là một chút mờ mịt. Trích dẫn Sửa lỗi ghi nhật ký liquibase với SLF4J và Log4J :

Có một cách dễ dàng , bằng cách giảm bớt sự phụ thuộc:

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

Bây giờ hai cái đầu tiên là khung ghi nhật ký hàng ngày của bạn (triển khai api slf4j và log4j). Chúng bổ sung cho sự phụ thuộc log4j tiêu chuẩn của bạn, vì tất cả những gì chúng làm là định tuyến đến khung ghi nhật ký vật lý. Không có log4j / logback / etc. chính nó, họ vẫn không thể định tuyến bất cứ điều gì.

Tuy nhiên, cái cuối cùng là một cái thú vị, vì nó cung cấp một lớp duy nhất trong một gói cụ thể mà liquibase sẽ quét để Loggertriển khai. Nó là mã nguồn mở của Matt Bertolini, vì vậy bạn có thể tìm thấy nó trên GitHub .

Nếu bạn muốn tự mình làm điều này, cũng có 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;
    }
}

Việc triển khai này hoạt động, nhưng chỉ nên được sử dụng làm ví dụ. Ví dụ: tôi không sử dụng tên của Liquibase để yêu cầu ghi nhật ký, mà sử dụng Loggerchính lớp này để thay thế. Các phiên bản của Matt cũng thực hiện một số kiểm tra null , vì vậy đó có thể là một triển khai hoàn thiện hơn để sử dụng, cộng với nó là nguồn mở.

45 hữu ích 1 bình luận chia sẻ
7

Tôi không chắc chắn lắm về yêu cầu của bạn nhưng điều tôi hiểu là Bạn muốn ghi lại tất cả nhật ký liquibase bằng SLF4J API. Nếu tôi đúng thì tôi đoán bạn có thể làm được.

Trước tiên, hãy thêm phần phụ thuộc sau vào tệp pom.xml của bạn:

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

và vào tệp logback.xml của bạn, Thêm trình ghi nhật ký cho liquibase và đặt LEVEL theo yêu cầu của bạn.

  <logger name="liquibase" level="DEBUG" />
7 hữu ích 3 bình luận chia sẻ
2

Đây là công thức của tôi để làm cho liquibase 3.5.3 đăng nhập vào tệp trong cửa sổ khi chạy từ dòng lệnh. Nó không sử dụng chính xác 'slf4j' nhưng giải quyết vấn đề lấy tệp nhật ký của các bản cập nhật db, bằng cách làm cho liquibase sử dụng java.util.logging.

1) tải liquibase-javalogger-3.0.jar từ đây https://github.com/liquibase/liquibase-javalogger/releases/

2) đặt nó vào thư mục% LIQUIBASE_HOME% / lib

3) tạo tệp logger.properties với nội dung sau:

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) thêm tùy chọn java vào liquibase (ví dụ qua set JAVA_OPTS = ...):

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

Ví dụ về tệp lô trình bao bọc liquibase của tôi:

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

CẬP NHẬT:

Tôi đã chuyển sang phiên bản liquibase mới đang sử dụng đăng nhập theo mặc định. Đối với liquibase 3.6.2, sử dụng thiết lập sau để chạy từ dòng lệnh windows:

1) Đảm bảo có thể truy cập được slfj trong java classpath. Đặt slf4j-api-1.7.25.jar vào thư mục liquibase / lib. Tệp jar có thể được tìm thấy trong gói phân phối slfj chính thức: https://www.slf4j.org/download.html

2) Đặt tham số đường dẫn tệp cấu hình đăng nhập:

JAVA_OPTS=-Dlogback.configurationFile=logback.xml

3) Thêm tệp cấu hình logback.xml. Ví dụ ở đây: https://www.mkyong.com/logging/logback-xml-example/

2 hữu ích 2 bình luận chia sẻ
0

Tôi đã thử tương tự trong ứng dụng của mình và có vẻ như nó đang hoạt động tốt. Tôi có thể thấy nhật ký liquibase trong tệp nhật ký của mình.

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 hữu ích 1 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ java logging log4j slf4j liquibase , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading