Cách cấu hình slf4j-đơn giản


Câu trả lời:


218

Đó là thông qua tài sản hệ thống

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

hoặc simplelogger.propertiestập tin trên đường dẫn lớp

xem http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html để biết chi tiết


cảm ơn tôi đã đặt "org.slf4j.simpleLogger.defaultLogLevel" thành "lỗi" trong System.properations, tuy nhiên slf4j vẫn ghi thông báo mức INFO. Bất kỳ ý tưởng? BTW, tôi nên đặt Simplelogger.properies ở đâu?
Gelin Luo

2
thử org.slf4j.simplelogger.defaultlog thay vì org.slf4j.simpleLogger.defaultLogLevel. Tệp phải nằm trên đường dẫn lớp, gói mặc định
Evgeniy Dorofeev

2
Trên thực tế nó ( defaultLogLevel) hoạt động. Chỉ cần tìm thấy tôi đã sửa đổi chương trình trong một thư mục sai ;-) Và defaultlogkhông hoạt động. Vì vậy, bạn có thể muốn chỉnh sửa câu trả lời của mình mặc dù tôi đã chấp nhận nó
Gelin Luo

11
Chỉ cần một lưu ý: thực sự cả hai câu trả lời đều tốt, tùy thuộc vào phiên bản SimpleLogger bạn đang sử dụng. Ví dụ: defaultLogLevel hoạt động cho 1.7.5, nhưng defaultlog hoạt động cho 1.6.6. Tôi đã tìm thấy điều này khi định cấu hình ghi nhật ký dự án của tôi và đến bài đăng này
Ken Shih

112

Đây là một mẫu simplelogger.propertiesmà bạn có thể đặt trên đường dẫn lớp (bỏ ghi chú các thuộc tính bạn muốn sử dụng):

# SLF4J's SimpleLogger configuration file
# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err.

# Default logging detail level for all instances of SimpleLogger.
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, defaults to "info".
#org.slf4j.simpleLogger.defaultLogLevel=info

# Logging detail level for a SimpleLogger instance named "xxxxx".
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, the default logging detail level is used.
#org.slf4j.simpleLogger.log.xxxxx=

# Set to true if you want the current date and time to be included in output messages.
# Default is false, and will output the number of milliseconds elapsed since startup.
#org.slf4j.simpleLogger.showDateTime=false

# The date and time format to be used in the output messages.
# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat.
# If the format is not specified or is invalid, the default format is used.
# The default format is yyyy-MM-dd HH:mm:ss:SSS Z.
#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z

# Set to true if you want to output the current thread name.
# Defaults to true.
#org.slf4j.simpleLogger.showThreadName=true

# Set to true if you want the Logger instance name to be included in output messages.
# Defaults to true.
#org.slf4j.simpleLogger.showLogName=true

# Set to true if you want the last component of the name to be included in output messages.
# Defaults to false.
#org.slf4j.simpleLogger.showShortLogName=false

1
@RobertHunt Làm thế nào để lưu nhật ký này vào tập tin?
Devavrata

6
@Devavrata thêm thuộc tính org.slf4j.simpleLogger.logFile- Mục tiêu đầu ra có thể là đường dẫn đến tệp hoặc các giá trị đặc biệt "System.out" và "System.err". Mặc định là "System.err". Xem slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Robert Hunt

Có thể có nhiều giá trị? Nếu có thì thế nào? Giống như tôi muốn org.slf4j.simpleLogger.logFile = test.log, System.err?
LOLWTFasdasd vào

1
@LOLWTFasdasdasdad Thật không may, nó chỉ hỗ trợ các mục tiêu duy nhất, System.out, System.err hoặc đường dẫn đến một tệp. Nó được thiết kế đơn giản, bạn nên xem xét triển khai ghi nhật ký đầy đủ như Log4J hoặc Logback nếu bạn muốn các tính năng nâng cao hơn.
Robert Hunt

74

Bạn có thể lập trình thay đổi nó bằng cách đặt thuộc tính hệ thống:

public class App {

    public static void main(String[] args) {

        System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "TRACE");

        final org.slf4j.Logger log = LoggerFactory.getLogger(App.class);

        log.trace("trace");
        log.debug("debug");
        log.info("info");
        log.warn("warning");
        log.error("error");

    }
}

Các mức nhật ký là LRI> WARN> INFO> DEBUG> TRACE.

Xin lưu ý rằng một khi trình ghi nhật ký được tạo, mức độ nhật ký không thể thay đổi. Nếu bạn cần thay đổi động mức ghi nhật ký, bạn có thể muốn sử dụng log4j với SLF4J.


3
"Xin lưu ý rằng một khi trình ghi nhật ký được tạo, mức độ nhật ký không thể thay đổi." - Điều này thực sự được chỉ định ở đâu?
ksl

2
ksl, trong org.slf4j.impl.SimpleLogger. Khi logger đầu tiên được tạo, phương thức init () được chạy và nó tìm nạp mức ghi nhật ký mặc định từ các thuộc tính hệ thống. Điều này không được làm mới tại bất kỳ điểm nào. Ngoài ra, org.slf4j.impl.SimpleLoggerFactory tạo một trình ghi nhật ký cho một lớp chỉ một lần, do đó, cùng một trình ghi nhật ký luôn được trả về cho lớp (hoặc tên) nhất định. Tuy nhiên, có thể có logger với mức độ khác nhau. Vì vậy, cách giải quyết có thể là bạn chỉ định các logger cấp khác nhau này cho biến "log" của bạn khi bạn muốn thay đổi mức ghi nhật ký. Đó không phải là giải pháp rất gọn gàng nhưng nên làm việc.
eemelipa

@Eemuli Ý org.slf4j.impl.SimpleLoggerbạn là mã nguồn thực tế chứ không phải doc?
ksl

Có phải cũng đúng là LOG_FILE_KEYtài sản không thể thay đổi sau khi logger được tạo không?
ksl

1
Vâng, ý tôi là mã nguồn thực tế. Tôi không chắc chắn về LOG_FILE_KEY.
eemelipa

4

Tôi nhận thấy rằng Eemuli nói rằng bạn không thể thay đổi cấp độ nhật ký sau khi chúng được tạo - và mặc dù đó có thể là thiết kế, nhưng điều đó không hoàn toàn đúng.

Tôi gặp phải một tình huống khi tôi đang sử dụng một thư viện đã đăng nhập vào slf4j - và tôi đang sử dụng thư viện trong khi viết một plugin mjo mojo.

Maven sử dụng phiên bản (đã hack) của slf4j SimpleLogger và tôi không thể lấy mã plugin của mình để định tuyến lại việc ghi nhật ký của nó đến một cái gì đó như log4j, mà tôi có thể kiểm soát.

Và tôi không thể thay đổi cấu hình đăng nhập maven.

Vì vậy, để làm dịu một số thông tin thông tin ồn ào, tôi thấy rằng tôi có thể sử dụng sự phản chiếu như thế này, để futz với SimpleLogger khi chạy.

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.spi.LocationAwareLogger;
    try
    {
        Logger l = LoggerFactory.getLogger("full.classname.of.noisy.logger");  //This is actually a MavenSimpleLogger, but due to various classloader issues, can't work with the directly.
        Field f = l.getClass().getSuperclass().getDeclaredField("currentLogLevel");
        f.setAccessible(true);
        f.set(l, LocationAwareLogger.WARN_INT);
    }
    catch (Exception e)
    {
        getLog().warn("Failed to reset the log level of " + loggerName + ", it will continue being noisy.", e);
    }

Tất nhiên, lưu ý, đây không phải là một giải pháp rất ổn định / đáng tin cậy ... vì nó sẽ phá vỡ vào lần tới khi những người maven thay đổi logger của họ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.