วิธีกำหนดค่า slf4j-simple


166

API 1.7 และ slf4j-simple เป็นการใช้งาน ฉันหาวิธีกำหนดระดับการบันทึกด้วยชุดค่าผสมนี้ไม่พบ

ใครช่วยได้บ้าง


ค่าเริ่มต้นคือ INFO to stdout, FWIW: saltnlight5.blogspot.com/2013/08/…
rogerdpack

คำตอบ:


218

มันอาจผ่านคุณสมบัติระบบ

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

หรือsimplelogger.propertiesไฟล์บน classpath

ดูhttp://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.htmlเพื่อดูรายละเอียด


ขอบคุณฉันตั้ง "org.slf4j.simpleLogger.defaultLogLevel" เป็น "ข้อผิดพลาด" ใน System.properties อย่างไรก็ตาม slf4j ยังคงบันทึกข้อความระดับ INFO ความคิดใด ๆ BTW ฉันควรใส่ simplelogger.properties ที่ไหน?
Gelin Luo

2
ลองใช้ org.slf4j.simplelogger.defaultlog แทน org.slf4j.simpleLogger.defaultLogLevel ไฟล์ต้องอยู่ใน classpath ซึ่งเป็นแพ็คเกจเริ่มต้น
Evgeniy Dorofeev

2
ที่จริงแล้วมัน ( defaultLogLevel) ใช้งานได้เพียงแค่พบว่าฉันกำลังแก้ไขโปรแกรมในโฟลเดอร์ที่ไม่ถูกต้อง ;-) และdefaultlogไม่ทำงาน ดังนั้นคุณอาจต้องการแก้ไขคำตอบของคุณแม้ว่าฉันจะยอมรับคำตอบแล้ว
Gelin Luo

11
แค่ทราบว่า: จริง ๆ แล้วทั้งสองคำตอบนั้นดีขึ้นอยู่กับเวอร์ชันของ SimpleLogger ที่คุณใช้ ตัวอย่างเช่น defaultLogLevel ใช้งานได้กับ 1.7.5 แต่ defaultlog ใช้งานได้กับ 1.6.6 ฉันพบสิ่งนี้เมื่อตั้งค่าการบันทึกโครงการของฉันและเข้ามาโพสต์นี้
Ken Shih

112

นี่คือตัวอย่างsimplelogger.propertiesที่คุณสามารถวางบน classpath (ไม่ใส่เครื่องหมายข้อคิดเห็นคุณสมบัติที่คุณต้องการใช้):

# 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 วิธีบันทึกไฟล์นี้เป็นไฟล์?
Devavrata

6
@Devavrata เพิ่มคุณสมบัติorg.slf4j.simpleLogger.logFile- เป้าหมายเอาต์พุตซึ่งสามารถเป็นพา ธ ไปยังไฟล์หรือค่าพิเศษ "System.out" และ "System.err" เริ่มต้นคือ "System.err" ดูslf4j.org/api/org/slf4j/impl/SimpleLogger.html
Robert Hunt

เป็นไปได้ไหมที่จะมีหลายค่า? ถ้าใช่เป็นอย่างไร เช่นฉันต้องการ org.slf4j.simpleLogger.logFile = test.log, System.err?
LOLWTFasdasd asdad

1
@LOLWTFasdasdasdad น่าเสียดายที่ไม่รองรับเฉพาะเป้าหมายเดียวไม่ว่าจะเป็น System.out, System.err หรือพา ธ ไปยังไฟล์ มันถูกออกแบบมาให้ง่ายคุณควรพิจารณาการใช้งานการบันทึกอย่างเต็มรูปแบบเช่น Log4J หรือ Logback หากคุณต้องการคุณสมบัติขั้นสูงเพิ่มเติม
Robert Hunt

75

คุณสามารถเปลี่ยนโปรแกรมได้โดยการตั้งค่าคุณสมบัติระบบ:

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");

    }
}

ระดับการบันทึกคือ ERROR> WARN> INFO> DEBUG> TRACE

โปรดทราบว่าเมื่อตัวบันทึกถูกสร้างขึ้นระดับการบันทึกจะไม่สามารถเปลี่ยนแปลงได้ หากคุณต้องการเปลี่ยนระดับการบันทึกแบบไดนามิกคุณอาจต้องการใช้log4jกับ SLF4J


3
"โปรดทราบว่าเมื่อตัวสร้างถูกสร้างขึ้นระดับการบันทึกจะไม่สามารถเปลี่ยนแปลงได้" - สิ่งนี้ระบุไว้ที่ไหน?
ksl

2
ksl ใน org.slf4j.impl.SimpleLogger เมื่อตัวบันทึกแรกถูกสร้างขึ้นเมธอด init () จะถูกเรียกใช้และดึงระดับการบันทึกเริ่มต้นจากคุณสมบัติระบบ สิ่งนี้ไม่ได้รีเฟรชในทุกจุด นอกจากนี้ org.slf4j.impl.SimpleLoggerFactory สร้างตัวบันทึกสำหรับคลาสเพียงครั้งเดียวดังนั้นตัวบันทึกเดียวกันจะถูกส่งกลับเสมอสำหรับคลาสที่กำหนด (หรือชื่อ) อย่างไรก็ตามมันเป็นไปได้ที่จะมีคนตัดไม้ที่มีระดับที่แตกต่างกัน วิธีแก้ปัญหาที่เป็นไปได้คือคุณสามารถกำหนดตัวบันทึกระดับต่าง ๆ เหล่านี้ให้กับตัวแปร "บันทึก" ของคุณเมื่อคุณต้องการเปลี่ยนระดับการบันทึก มันไม่ได้เป็นวิธีที่เรียบร้อยมาก แต่ควรทำงาน
eemelipa

@Eemuli org.slf4j.impl.SimpleLoggerคุณหมายถึงซอร์สโค้ดจริงมากกว่า doc ใช่หรือไม่
ksl

เป็นจริงหรือไม่ที่LOG_FILE_KEYคุณสมบัติไม่สามารถเปลี่ยนแปลงได้เมื่อสร้างตัวบันทึกแล้วหรือไม่
ksl

1
ใช่ฉันหมายถึงซอร์สโค้ดจริง ฉันไม่แน่ใจเกี่ยวกับ LOG_FILE_KEY
eemelipa

4

ฉันสังเกตเห็นว่า Eemuli บอกว่าคุณไม่สามารถเปลี่ยนระดับการบันทึกหลังจากที่พวกเขาสร้างขึ้น - และในขณะที่อาจเป็นการออกแบบ แต่ก็ไม่เป็นความจริงเลย

ฉันวิ่งเข้าไปในสถานการณ์ที่ฉันใช้ห้องสมุดที่บันทึกไปยัง slf4j - และฉันใช้ห้องสมุดขณะที่เขียนปลั๊กอิน mjo mojo

Maven ใช้งาน SimpleLogger รุ่น slf4j (แฮ็ค) และฉันไม่สามารถรับรหัสปลั๊กอินของฉันเพื่อเปลี่ยนเส้นทางการบันทึกไปยังสิ่งที่ต้องการเช่น log4j ซึ่งฉันสามารถควบคุมได้

และฉันไม่สามารถเปลี่ยนการตั้งค่าการบันทึก maven

ดังนั้นเพื่อเงียบข้อความเสียงรบกวนฉันพบว่าฉันสามารถใช้การสะท้อนเช่นนี้เพื่อ futz กับ SimpleLogger ในขณะใช้งานจริง

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);
    }

แน่นอนว่านี่ไม่ใช่ทางออกที่เสถียร / น่าเชื่อถือมาก ... เพราะมันจะทำลายในครั้งต่อไปที่คนเปลี่ยนเครื่องบันทึกของพวกเขา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.