2015-03-29 15 views
7

Grails 3 sử dụng logback làm hệ thống ghi nhật ký.Sử dụng logback trong grails 3

Tôi cần một ví dụ về cách sử dụng logback trong grails 3 theo hình thức này

log.info("some Info") 
+1

Bạn đã thấy điều này? http://jdpgrailsdev.github.io/blog/2014/03/24/grails_logback.html – dsharew

Trả lời

2
import org.slf4j.Logger 
import org.slf4j.LoggerFactory 

static Logger log = LoggerFactory.getLogger(SomeClass.class) 

này hoạt động nhưng tôi cũng đang tự hỏi nếu grails 3 ô tô có thể tiêm log.

4

Tôi chỉ xem xét điều này, bởi vì tôi đã có một câu hỏi tương tự. Grails 3 không sử dụng Logback cho cấu hình đăng nhập, nhưng biến đổi AST vẫn sử dụng Apache Commons Logging.

https://github.com/grails/grails-core/blob/master/grails-logging/src/main/groovy/org/grails/compiler/logging/LoggingTransformer.java

Sau đó sử dụng cây cầu JCL-over-slf4j để lập bản đồ tất cả trở lại tất cả trở lại vào Logback.

Theo danh sách gửi thư, http://grails.1312388.n4.nabble.com/Grails-2-1-1-Is-it-possible-to-replace-the-injected-log-object-td4638834.html, để thay thế cho tiêm log trên toàn cầu, bạn phải loại trừ sự phụ thuộc khai thác gỗ và thay thế AST Transformer với riêng bạn.

Plugin Logback mà bài đăng trên blog trong nhận xét ở trên đề cập đến điều này: https://github.com/grails-plugins/grails-logback/blob/master/src/java/org/codehaus/groovy/grails/compiler/logging/Slf4jTransformer.java. Tuy nhiên, nó có vẻ như rất nhiều dự phòng, vì Grails 3 đã có hỗ trợ Logback.

Nếu bạn không muốn thực hiện công việc đó để thay đổi quá trình ghi nhật ký, bạn có thể ghi đè lên trình ghi nhật ký bằng cách chú thích lớp học với @Slf4j và sẽ ghi đè nhật ký cho lớp đó.

0

cần thiết này cũng trong Grails 3. Tìm thấy bài này bằng cách mrhaki:

grails 3 logging

tôi thử nghiệm này trên một công việc Quartz. Tôi thêm vào dòng sau trong logback.groovy

logger("grails.app.jobs", INFO, ['STDOUT']) 

Sử dụng đăng nhập thử nghiệm trong công việc thạch anh:

log.info "test " + new Date() 

chương trình đăng nhập thông tin trong giao diện điều khiển

INFO grails.app.jobs.myapp.TestJob - test Tue Oct 20 10:07:31 CEST 2015 

Funny điều đang xảy ra. Tôi thấy 2 dòng trùng lặp cho mỗi log.info

log.info "test" 
log.info "test2" 
System.out.println("test"3) 

Cung cấp cho tôi:

INFO grails.app.jobs.myapp.TestJob - test 
INFO grails.app.jobs.myapp.TestJob - test 
INFO grails.app.jobs.myapp.TestJob - test2 
INFO grails.app.jobs.myapp.TestJob - test2 
test3 
+1

Thêm 'false' vào' logger ("grails.app.jobs", INFO, ['STDOUT'], false) 'sẽ xóa các mục nhập nhật ký trùng lặp. – Guus

14

Bạn cần phải thiết lập các tham số thứ tư của cấu hình logger để false:

logger('grails.app.controllers', INFO, ['STDOUT'], false) 

thì khai thác gỗ là không hiển thị hai lần.

Tôi nghĩ đó là do máy ghi root cũng bắt được INFO.

+3

Bạn không phải thêm 'false' (tức là cờ bổ sung) nếu bạn cũng xóa phần '['STDOUT']'. Bạn nhận được đăng nhập trùng lặp bởi vì (không có sai), bạn đang nói logback để nối thêm thông qua logger gốc (để STDOUT) VÀ thông qua logger cụ thể này. Loại bỏ STDOUT có nghĩa là nó sẽ chỉ nối thêm thông qua bộ ghi gốc. Xem [tài liệu] (http://logback.qos.ch/manual/architecture.html) để biết giải thích về cờ bổ sung. – GreenGiant

+0

Nhận xét của @GreenGiant là giải pháp cho tôi trong Grails 3.2.1. Ghi nhật ký hoạt động tốt cho "ứng dụng chạy" nhưng không hoạt động cho "ứng dụng thử nghiệm". Sau đó, tôi nhận thấy rằng cấu hình root logger được xử lý "dev" đặc biệt. Tôi chỉ cần mở rộng logic để bao gồm 'test' env, sau đó đăng nhập xuất hiện mà không có bản sao: 'if ((Environment.isDevelopmentMode() || Environment.currentEnvironment == Environment.TEST) ...) { .. .' – jerryb

+0

Ví dụ về tính năng ghi lại ví dụ → https://examples.javacodegeeks.com/enterprise-java/logback/logback-additivity-example/ – pinei

1

Tôi đã thử như thế này và nó hoạt động tốt. Đây là ví dụ từ petclinic.

chi tiết bổ sung avalable tại logback docs

import grails.util.BuildSettings 
import grails.util.Environment 


appender('STDOUT', ConsoleAppender) { 
    encoder(PatternLayoutEncoder) { 
     pattern = "%level %logger - %msg%n" 
    } 
} 

root(ERROR, ['STDOUT']) 

if(Environment.current == Environment.DEVELOPMENT) { 
    def targetDir = BuildSettings.TARGET_DIR 
    if(targetDir) { 

     appender("FULL_STACKTRACE", FileAppender) { 

      file = "${targetDir}/stacktrace.log" 
      append = true 
      encoder(PatternLayoutEncoder) { 
       pattern = "%level %logger - %msg%n" 
      } 
     } 
     logger("StackTrace", ERROR, ['FULL_STACKTRACE'], false) 
    } 
} 
+0

Tôi đã gặp sự cố khiến tôi đặt câu hỏi về mã này: bạn đã xác nhận dữ liệu đó chưa thực sự đang đi vào tệp stacktrace.log? Nó có thể trông giống như nó đang làm việc vì stacktraces nhấn stdout, nhưng kinh nghiệm của tôi đã được rằng nó không thực sự nhấn stacktrace.log tập tin. Vì vậy, tôi đang cố gắng tìm ra nếu nó chỉ là tôi hoặc nếu đây là một vấn đề với hầu như tất cả các ví dụ trên internet. –

+0

Xem [câu hỏi này] (http://stackoverflow.com/questions/36723285/why-does-stacktrace-log-not-fill-with-logback-in-grails-3) - có vẻ như điều này sẽ không ghi lại vào tệp stacktrace.log. –

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