2015-05-31 23 views
10

Mặc dù tôi đã trao tiền thưởng cho người dùng bên dưới có đã cố gắng trợ giúp, câu hỏi ban đầu vẫn chưa được trả lời. Không tồn tại giải pháp thực tế để đảm bảo rằng logback.groovy được cấu hình ghi nhật ký được vinh danh trong các bài kiểm tra junit. Các bài kiểm tra tải lên cấu hình logback và nó báo cáo mức độ chính xác và chưa vẫn là đăng nhập kiểm tra thực tế (độc quyền thông qua slf4j) đang ở bất kỳ hoặc Trace mứcLogger slf4j không sử dụng mức cấu hình đăng nhập

Tôi biết những người khác đã gặp phải vấn đề này cùng và nó là rất gây phiền nhiễu khi kiểm tra các dự án lớn mất nhiều thời gian hơn do giao diện điều khiển ghi nhật ký quá nhiều chi tiết. Tôi không thể tiếp tục ném tiền thưởng tại số câu hỏi này. Tôi hy vọng một người nào đó đưa ra một giải pháp tốt là cho phép ghi nhật ký kiểm tra được định cấu hình đúng ở các cấp độ khác nhau thông qua thuộc tính hệ thống. Sau đó, các cấu hình khác nhau có thể được tạo cho dự án để các thử nghiệm có thể được định cấu hình ở các mức ngưỡng ghi khác nhau.

đăng nhập của tôi được cấu hình bởi logback thông qua một tập tin logback.groovy

Bây giờ, khi dự án POM Maven tôi rằng tập hợp tất cả các dự án khác bắt đầu, nó đi tất cả tài sản hệ thống để thiết lập mức độ khai thác gỗ đúng.

Tuy nhiên, khi kiểm tra junit chạy, vì lý do nào đó, trình ghi nhật ký không nhận được mức chính xác mặc dù các lớp thử nghiệm static @beforeClass đảm bảo rằng logback được cấu hình đúng.

Nó không phải là Logger trong các bài kiểm tra đó là vấn đề, - cũng - có họ quá--, vấn đề thực sự là logger trong phần mã chạy (tất cả các chương trình logger của tôi ở khắp mọi nơi) được thiết lập đến mức ghi sai. Họ không chọn những gì đăng nhập là khi các bài kiểm tra chương trình được cấu hình.

Tuy nhiên, các dự án đang báo cáo chính xác khi đăng nhập khởi tạo với tệp logback.goovy. Tuy nhiên, mức ghi nhật ký thực tế được đặt thành TRACE hoặc ALL

Từ đầu ra bên dưới, rõ ràng là nhật ký đã được định cấu hình thành INFO. Nhưng tuyên bố đăng nhập dự án đầu tiên tại TRACE (dòng cuối cùng) cho thấy rằng không được chọn.

Trợ giúp.

------------------------------------------------------- 
T E S T S 
------------------------------------------------------- 
Running groovy.text.StreamingTemplateEngineTest 
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.245 sec 
Running net.abcd.templating.InlinerTest 
01:22:15,265 |-INFO in [email protected] - Added status listener of type [ch.qos.logback.core.status.OnConsoleStatusListener] 
01:22:15,290 |-INFO in [email protected] - Setting ReconfigureOnChangeFilter scanning period to 5 minutes 
01:22:15,290 |-INFO in ReconfigureOnChangeFilter{invocationCounter=0} - Will scan for changes in [[C:\Users\ABDC\Dropbox\workspace\abcd\AbcdTemplating\conf\logback.groovy]] every 300 seconds. 
01:22:15,290 |-INFO in [email protected] - Adding ReconfigureOnChangeFilter as a turbo filter 
01:22:15,312 |-INFO in [email protected] - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender] 
01:22:15,316 |-INFO in [email protected] - Naming appender as [STDOUT] 
*********************************************************** 

LOGGING MODE PROPERTY 'net.abcd.logging.level' SET TO: [info] 
IT CAN BE SET TO: OFF, ERROR, WARN, INFO, DEBUG, TRACE, ALL, INFO 

*********************************************************** 
getLogLevel() returned 'INFO' 
01:22:15,496 |-INFO in [email protected] - Setting level of logger [ROOT] to INFO 
01:22:15,532 |-INFO in [email protected] - Attaching appender named [STDOUT] to Logger[ROOT] 
01:22:15.846 [main] TRACE net.abcd.templating.Inliner - Document: 

tập tin logback.groovy của tôi là:

displayStatusOnConsole() 
scan('5 minutes') // Scan for changes every 5 minutes. 
setupAppenders() 
setupLoggers() 

def displayStatusOnConsole() { 
    statusListener OnConsoleStatusListener 
} 

def setupAppenders() { 
    appender('STDOUT', ConsoleAppender) { 
     encoder(PatternLayoutEncoder) { 
      pattern = "%d{HH:mm:ss.SSS} [%thread] %-5level %-16logger{50} - %msg%n" 
     } 
    } 
} 


def setupLoggers() {  
    def loglevel = getLogLevel() 
    println("getLogLevel() returned '${loglevel}'") 
    root(loglevel, ['STDOUT']) 
} 

def getLogLevel() { 
    def mode = System.getProperty('net.abcd.logging.level', '') 
    println("***********************************************************") 
    println("") 
    println("LOGGING MODE PROPERTY 'net.abcd.logging.level' SET TO: [${mode}]") 
    println("IT CAN BE SET TO: OFF, ERROR, WARN, INFO, DEBUG, TRACE, ALL, INFO") 
    println("") 
    println("***********************************************************") 
    switch(mode.toLowerCase()){ 
    case 'off': 
     return OFF 
    case 'error': 
     return ERROR 
    case 'warn': 
     return WARN 
    case 'info': 
     return INFO 
    case 'debug': 
     return DEBUG 
    case 'trace': 
     return TRACE 
    case 'all': 
     return ALL 
    default: 
     return INFO 
    } 
} 
+1

Tôi không biết liệu nó có hữu ích hay không, nhưng JUnit cài đặt trình nạp lớp của chính nó, được biết là can thiệp vào khung ghi nhật ký. – llogiq

+0

@llogiq Tôi biết. .... Sau đó, tại sao doe cấu hình bắt đầu bởi junit báo cáo chính xác mặc dù các xét nghiệm cá nhân không. Và cách khắc phục điều đó? –

Trả lời

3

tôi gặp một vấn đề tương tự trên các xét nghiệm junit của tôi là tốt. Tôi không thể tìm được giải pháp tốt. Tôi sử dụng dưới đây làm việc xung quanh:

import ch.qos.logback.classic.Level; 
import ch.qos.logback.classic.Logger; 
import org.slf4j.LoggerFactory; 
... 
static Logger logger; 
static{ 
    // Logger.ROOT_LOGGER_NAME == "ROOT" 
    logger = ((Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME)); 
    logger.setLevel(Level.INFO); 
} 

...

Tôi nghĩ rằng trong trường hợp của bạn, bằng cách nào đó thư viện sử dụng nó dụ ConsoleAppender riêng có tên không phải là 'STDOUT'. Tôi hy vọng thiết lập cấp độ nhật ký gốc nên giải quyết vấn đề.

root(loglevel, ['ROOT']); 
+0

Điều đó hữu ích. Tôi không chắc chắn nó giải quyết vấn đề mặc dù bởi vì tôi làm kiểm tra đăng nhập ở các cấp độ khác nhau tùy thuộc vào thuộc tính được cung cấp bởi xây dựng lò phản ứng. Nhưng cảm ơn cho chiming. –

+0

đã thử. không hoạt động. –

1

Chúng tôi thường định tuyến mọi lần đăng nhập thông qua slf4j và sau đó định cấu hình ghi nhật ký với logback. Vì vậy, phụ thuộc Maven của chúng tôi như sau:

<dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jcl-over-slf4j</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>log4j-over-slf4j</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jul-to-slf4j</artifactId> 
     <version>${slf4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-core</artifactId> 
     <version>${logback.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>${logback.version}</version> 
    </dependency> 

Vì vậy, nếu một số phụ thuộc sử dụng java-commons-đăng (JCL), log4j, hoặc java.util.logging (tháng bảy) so với khai thác gỗ của nó được bắc cầu để SLF4J. Ghi nhật ký ứng dụng cũng sử dụng slf4j và điều đó được cấu hình với logback.

Vì vậy, bạn có thể cần phải sử dụng một trong các cầu (như jcl-over-slf4j) để ghi nhật ký các phụ thuộc bên ngoài dưới sự kiểm soát.

Chỉnh sửa: Pavel Horal, cảm ơn bạn, và vâng, bạn nói đúng. Người ta cần làm nhiều hơn một chút so với việc chỉ thêm phụ thuộc. Chúng tôi cũng có một trình cấu hình logback gọi SLF4JBridgeHandler.install() một cách rõ ràng. Trình cấu hình của chúng tôi cũng tải tệp cấu hình đăng nhập và tôi đã quên cuộc gọi này. Nhưng tôi chủ yếu muốn chỉ theo hướng của một vấn đề với nhiều thư viện khai thác gỗ được sử dụng bởi các phụ thuộc bên ngoài và các bridge này có thể đặt các thư viện đăng nhập khác nhau dưới mái logback.

+0

* "Tôi thậm chí không biết" * -> ['java.util.logging'] (http://docs.oracle.com/javase/7/docs/api/java/util/logging/package-summary .html) ... và nó không phải là dễ dàng như * chỉ sử dụng phụ thuộc đúng * - http://stackoverflow.com/questions/9117030/jul-to-slf4j-bridge –

+0

Mọi thứ đều sử dụng SLF4J. Đó là lý do tại sao nó là một bí ẩn đối với tôi tại sao cấu hình đăng nhập đăng ký chính xác nhưng các bài kiểm tra tất cả đăng nhập như thể cấp là TRACE hoặc BẤT K.. –

+0

Cảm ơn bạn đã chơi. Tôi đã cho bạn tiền thưởng, mặc dù điều này không giải quyết được vấn đề. Nó là một bổ sung có giá trị. –

Các vấn đề liên quan