2010-10-01 132 views
103

Tôi có tập tin logback.xml sau:Làm thế nào để thay đổi mức độ khai thác gỗ gốc lập trình

<configuration debug="true"> 

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
<encoder> 
    <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> 
</encoder> 
</appender> 

<root level="debug"> 
    <appender-ref ref="STDOUT" /> 
</root> 
</configuration> 

Bây giờ, khi xảy ra một sự kiện cụ thể, tôi muốn lập trình thay đổi mức độ của logger gốc từ debug đến lỗi. Tôi không thể sử dụng thay thế biến, nó là bắt buộc mà tôi làm điều này trong mã.

Làm cách nào để thực hiện? Cảm ơn.

Trả lời

181

Hãy thử điều này:

import org.slf4j.LoggerFactory; 
import ch.qos.logback.classic.Level; 
import ch.qos.logback.classic.Logger; 

Logger root = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); 
root.setLevel(Level.INFO); 

Lưu ý rằng bạn cũng có thể nói với logback định kỳ quét tập tin cấu hình của bạn như thế này:

<configuration scan="true" scanPeriod="30 seconds" > 
    ... 
</configuration> 
+46

Cần lưu ý rằng mục đích của slf4j là trừu tượng xa khung đăng nhập, nhưng điều đó phương pháp đầu tiên không đi với điều đó bằng cách tham khảo khung đăng nhập trực tiếp. –

+3

Nếu bạn làm điều này và nhận được một ClassCastException, nó rất có thể do có nhiều ràng buộc SLF4J trên classpath. Đầu ra bản ghi sẽ cho biết điều này và các ràng buộc nào có mặt để cho phép bạn xác định (các) thứ bạn cần loại trừ. – icfantv

+1

Để trả lời nhận xét của Tim, cũng cần lưu ý rằng đôi khi bạn chỉ đang phát triển và trình ghi nhật ký đang tiết ra những thứ bạn không quan tâm và bạn tạm thời muốn tắt nó đi, vì vậy trong trường hợp đó không phải một cái gì đó phải lo lắng. –

9

Tôi giả sử bạn đang sử dụng logback (từ tệp cấu hình).

Từ logback manual, tôi thấy

Logger rootLogger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);

Có lẽ điều này có thể giúp bạn thay đổi giá trị?

2

Như đã chỉ ra bởi những người khác, bạn chỉ cần tạo mockAppender và sau đó tạo một cá thể LoggingEvent chủ yếu lắng nghe sự kiện ghi nhật ký đã đăng ký/xảy ra bên trong mockAppender.

Sau đây là cách nó trông giống như trong thử nghiệm:

import org.slf4j.LoggerFactory; 
import ch.qos.logback.classic.Level; 
import ch.qos.logback.classic.Logger; 
import ch.qos.logback.classic.spi.ILoggingEvent; 
import ch.qos.logback.classic.spi.LoggingEvent; 
import ch.qos.logback.core.Appender; 

@RunWith(MockitoJUnitRunner.class) 
public class TestLogEvent { 

// your Logger 
private Logger log = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); 

// here we mock the appender 
@Mock 
private Appender<ILoggingEvent> mockAppender; 

// Captor is generic-ised with ch.qos.logback.classic.spi.LoggingEvent 
@Captor 
private ArgumentCaptor<LoggingEvent> captorLoggingEvent; 

/** 
* set up the test, runs before each test 
*/ 
@Before 
public void setUp() { 
    log.addAppender(mockAppender); 
} 

/** 
* Always have this teardown otherwise we can stuff up our expectations. 
* Besides, it's good coding practise 
*/ 
@After 
public void teardown() { 
    log.detachAppender(mockAppender); 
} 


// Assuming this is your method 
public void yourMethod() { 
    log.info("hello world"); 
} 

@Test 
public void testYourLoggingEvent() { 

    //invoke your method 
    yourMethod(); 

    // now verify our logging interaction 
    // essentially appending the event to mockAppender 
    verify(mockAppender, times(1)).doAppend(captorLoggingEvent.capture()); 

    // Having a generic captor means we don't need to cast 
    final LoggingEvent loggingEvent = captorLoggingEvent.getValue(); 

    // verify that info log level is called 
    assertThat(loggingEvent.getLevel(), is(Level.INFO)); 

    // Check the message being logged is correct 
    assertThat(loggingEvent.getFormattedMessage(), containsString("hello world")); 
} 
} 
+0

Bạn có thể bao gồm các báo cáo nhập khẩu của mình không? Bây giờ, bạn không thể thấy việc triển khai trình ghi nhật ký nào bạn đã sử dụng. –

+1

@AndreasLundgren - xin lỗi vì ban đầu không bao gồm các câu lệnh nhập. Bây giờ tôi đã thêm chúng. Chúc mừng –

7

sử dụng logback 1.1.3 tôi phải làm như sau (Scala code):

import ch.qos.logback.classic.Logger 
import org.slf4j.LoggerFactory  
... 
val root: Logger = LoggerFactory.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME).asInstanceOf[Logger] 
1

Tôi nghĩ rằng bạn có thể sử dụng để MDC thay đổi mức ghi nhật ký theo chương trình. Mã dưới đây là một ví dụ để thay đổi mức ghi nhật ký trên chuỗi hiện tại. Cách tiếp cận này không tạo ra sự phụ thuộc vào việc thực thi logback (API SLF4J chứa MDC).

<configuration> 
    <turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter"> 
    <Key>LOG_LEVEL</Key> 
    <DefaultThreshold>DEBUG</DefaultThreshold> 
    <MDCValueLevelPair> 
     <value>TRACE</value> 
     <level>TRACE</level> 
    </MDCValueLevelPair> 
    <MDCValueLevelPair> 
     <value>DEBUG</value> 
     <level>DEBUG</level> 
    </MDCValueLevelPair> 
    <MDCValueLevelPair> 
     <value>INFO</value> 
     <level>INFO</level> 
    </MDCValueLevelPair> 
    <MDCValueLevelPair> 
     <value>WARN</value> 
     <level>WARN</level> 
    </MDCValueLevelPair> 
    <MDCValueLevelPair> 
     <value>ERROR</value> 
     <level>ERROR</level> 
    </MDCValueLevelPair> 
    </turboFilter> 
    ...... 
</configuration> 
MDC.put("LOG_LEVEL", "INFO"); 
Các vấn đề liên quan