2013-12-10 23 views
7

Các tài liệu Winston có một phần trên streaming logs mà nói:Dòng nhật ký của Winston hoạt động như thế nào?

streaming cho phép bạn truyền các bản ghi của bạn trở lại từ chọn vận chuyển của bạn.

và đưa ra ví dụ mã sau:

// 
// Start at the end. 
// 
winston.stream({ start: -1 }).on('log', function(log) { 
    console.log(log); 
}); 

đọc My của việc này là mỗi tin nhắn đăng nhập mới được thêm vào sẽ là đầu ra cửa sổ Console. Cấu hình {start: -1} yêu cầu luồng bắt đầu ở cuối tệp, vì vậy chỉ các mục nhập nhật ký mới là đầu ra. Tôi hy vọng đoạn mã Node sau sẽ dẫn đến mỗi dòng hiện có của tệp test.log là đầu ra cho bảng điều khiển và sau đó một đối tượng mới sẽ xuất sau mỗi 500ms sau đó.

var winston = require('winston'); 
winston.add(winston.transports.File, { 
    filename: 'test.log' 
}); 
winston.remove(winston.transports.Console); 
winston.stream().on('log', function(log) { 
    console.log(log); 
}); 

setInterval(function(){ 
    winston.log('info', 'help'); 
}, 500); 

tôi sẽ mong đợi để xem một cái gì đó giống như đầu ra sau đây:

{"level":"info","message":"help","timestamp":"2013-12-10T05:55:15.806Z"} 
{"level":"info","message":"help","timestamp":"2013-12-10T05:55:16.307Z"} 
{"level":"info","message":"help","timestamp":"2013-12-10T05:55:16.809Z"} 
{"level":"info","message":"help","timestamp":"2013-12-10T05:55:17.309Z"} 
{"level":"info","message":"help","timestamp":"2013-12-10T05:56:48.316Z"} 

gì thực sự xảy ra là khai thác gỗ làm việc như mong đợi với việc vận chuyển File (tập tin được một bản ghi mới mỗi 500ms) nhưng không có đầu ra cho bàn điều khiển. Đường dây console.log(log) không bao giờ được gọi.

Tôi đã bỏ lỡ điều gì đó hiển nhiên hoặc hiểu nhầm mục đích của luồng nhật ký của Winston?

+0

có thể họ sử dụng sự kiện '' dữ liệu'' thông thường? – bevacqua

+0

Tôi đã gặp vấn đề tương tự, và tôi nghi ngờ nó không hoạt động với File hoặc Console vận chuyển vì đây là hai cái tôi đã thử và cuộc gọi lại không bao giờ được gọi. @Nico, Mã này trực tiếp từ README của winston và trong mã: .phát ra ('log', log); Vấn đề là, không có gì tôi đã thử dường như để làm cho công việc này: ( –

+1

Cảm ơn bạn đã xác nhận sự nghi ngờ của tôi @RobinDuckett.Tôi muốn tập tin này như là một lỗi, nhưng Winston trông nhiều hơn hoặc ít hơn chết: https: // github. com/flatiron/winston/issues/294 Có thể cần phải ngã ba – drzax

Trả lời

9

Tôi đã trải qua cùng một loại lỗi mà bạn mô tả. Kết luận của tôi là trình ghi nhật ký mặc định var winston = require('winston') không hoạt động với các chức năng query, stream cũng không phải là EventEmitter để bạn có thể sử dụng winston.on('logging', function() {...}).

Các giải pháp cần thiết để sử dụng là để nhanh chóng logger của riêng bạn như vậy:

var logger = new (winston.Logger)({ 
    transports: [ 
     new (winston.transports.Console)({ level: 'info' }), 
     new (winston.transports.File)({ filename: 'app.log' }) 
    ] 
    }); 

và sau đó bạn làm một số logging:

setInterval(function(){ 
    logger.log('info', 'logging some stuff..'); 
    }, 500); 

sau đó bạn có thể truyền các đã đăng mục bằng cách sử dụng stream:

logger.stream().on('log', function(log) { 
    console.log('>>> ', log); 
    }); 

Tôi nghĩ bạn đã hiểu sai stream bởi vì nó không stream các entry-log khi đang di chuyển, nó chỉ stream tất cả các entry mà bạn đã đăng nhập. Để treo lên một sự kiện để logger của bạn, bạn có thể sử dụng các sự kiện 'ghi' trên đối tượng logger:

logger.on('logging', function (transport, level, msg, meta) { 
    // [msg] and [meta] have now been logged at [level] to [transport] 
    console.log("[%s] and [%s] have now been logged at [%s] to [%s]", 
       msg, JSON.stringify(meta), level, transport.name); 
    }); 

Tôi không biết tại sao điều này không được hỗ trợ bởi các logger mặc định và như tôi đã nói ở đầu bài này tôi nhận được lỗi bên trong của thư viện async (phụ thuộc vào winston) khi sử dụng các hàm query hoặc stream với trình ghi nhật ký mặc định.

+0

Vì vậy, nó giống như một địa điểm hậu xử lý tập trung cho các bản ghi? –

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