2012-12-07 21 views
13

Tôi đang làm việc trên một ứng dụng node.js với vài chục mô-đun và sử dụng bunyan để ghi nhật ký (đầu ra JSON, nhiều luồng có thể cấu hình). Tôi đã tìm kiếm các ví dụ tốt về cách thực hiện một cá thể trên tất cả các mô-đun, nhưng chưa thấy những gì dường như là một ví dụ thực sự rõ ràng mà tôi có thể học hỏi được.Ghi nhật ký chung cho nút, ứng dụng nhanh - thực tiễn tốt nhất?

Dưới đây minh họa cách tiếp cận hoạt động, nhưng có vẻ khá không phù hợp (xấu xí) đối với tôi. Tôi mới vào nút & commonjs javascript nói chung, vì vậy, tìm kiếm đề xuất về cách cải thiện nó.

mô-đun: ./lib/logger

// load config file (would like this to be passed in to the constructor) 
nconf.file({ file: fileConfig}); 
var logSetting = nconf.get('log'); 

// instantiate the logger 
var Bunyan = require('bunyan'); 
var log = new Bunyan({ 
    name: logSetting.name, 
streams : [ 
     { stream : process.stdout, 
     level : logSetting.stdoutLevel}, 
     { path : logSetting.logfile, 
      level : logSetting.logfileLevel} 
    ], 
serializers : Bunyan.stdSerializers 
}); 

function Logger() { 
}; 

Logger.prototype.info = function info(e) { log.info(e) }; 
Logger.prototype.debug = function debug(e) { log.debug(e) }; 
Logger.prototype.trace = function trace(e) { log.trace(e) }; 
Logger.prototype.error = function error(e) { log.error(e) }; 
Logger.prototype.warn = function warn(e) { log.warn(e) }; 

module.exports = Logger; 

mô-đun: ứng dụng chính

// create the logger 
var logger = require('./lib/logger) 
var log = new logger(); 

// note: would like to pass in options --> new logger(options) 


module: any project module using logger 
// open the logger (new, rely on singleton...) 
var logger = require('./lib/logger'); 
var log = new logger(); 

hoặc view the gist

bất kỳ đề xuất?

EDIT:.

Tôi đã sửa đổi các nhà xây dựng, làm cho mô hình singleton rõ ràng (chứ không phải ngầm như là một phần của 'đòi hỏi' hành vi

var log = null; 
function Logger(option) { 

// make the singleton pattern explicit 
if (!Logger.log) { 
    Logger.log = this; 
} 
    return Logger.log; 
}; 

và sau đó thay đổi khởi tạo để có một thông số tùy chọn

// initialize the logger 
Logger.prototype.init = function init(options) { 
log = new Bunyan({ 
    name: options.name, 
    streams : [ 
     { stream : process.stdout, 
      level : options.stdoutLevel}, 
     { path : options.logfile, 
      level : options.logfileLevel} 
    ], 
    serializers : Bunyan.stdSerializers  
    }); 
}; 
+0

Những gì bạn có vẻ giống như một singleton cơ bản được xây dựng bằng chức năng của yêu cầu. Bạn có thể thực hiện singleton của riêng bạn, nhưng nó sẽ không nhất thiết phải tốt hơn. Việc tiêm phụ thuộc có thể được thực hiện, có thể? – mtsr

+0

Cảm ơn bạn đã trả lời - có, đó là một singleton cơ bản. Một vài điều làm phiền tôi về nó (a) hành vi singleton được ngụ ý, chứ không phải là rõ ràng, (b) tôi đã không tìm thấy một cách sạch cho constructor để lấy các đối số (nói một tùy chọn JSON) mà không cần phải xác định xem chúng đã được nạp bởi một mô-đun trước đó, và (c) thay thế việc truyền tham chiếu (làm đối số) cho mỗi mô-đun đơn có vẻ lộn xộn/tiết. – dewd

+0

Cảm ơn bạn đã trả lời! Vâng, nó là một singleton cơ bản, mặc dù nó có vẻ là một hành vi ngụ ý hơn là một định nghĩa. Tôi đã xem [thực hành xấu?] (Http://stackoverflow.com/questions/9733201/is-it-a-bad-practice-to-use-the-requirejs-module-as-a-singleton), [singleton pattern] (http://jasonwyatt.tumblr.com/post/8087061585/singleton-pattern-with-requirejs) cộng [sử dụng yêu cầu cho người độc thân] (http://stackoverflow.com/questions/5608685/using-requirejs -how-do-i-pass-trong-toàn cầu-đối tượng-hoặc-singletons-xung quanh) và họ dường như địa chỉ hành vi xây dựng tốt hơn so với ở trên. – dewd

Trả lời

1

nếu bạn đang sử dụng Express với node.js thì bạn có thể dùng thử này Theo mặc định, ghi nhật ký bị tắt trong Express. phải thực hiện một số nội dung nhất định để nhận nhật ký hoạt động cho ứng dụng của bạn. Đối với các bản ghi truy cập, chúng ta cần sử dụng phần mềm trung gian Logger; cho các bản ghi lỗi chúng tôi sẽ sử dụng Forever.Hope nó sẽ giúp bạn .. Dưới đây là một ví dụ tốt How to Logging Access và lỗi trong Node.js

+1

cảm ơn, đây là một tài liệu tham khảo hữu ích.Tôi đã sử dụng một mô hình tương tự cho phần mềm trung gian ghi nhật ký bằng cách sử dụng Bunyan, nơi tôi đang vật lộn trong việc tạo ra một lớp trình bao bọc sạch cho phép tôi sử dụng cùng một cá thể trên tất cả các mô-đun, với phương pháp khởi tạo cho phép các tùy chọn được chuyển vào. Sẽ đăng những gì tôi đã đưa ra ... – dewd

23

Singleton pattern in nodejs - is it needed? Trên thực tế, singleton có lẽ là không cần thiết trong môi trường Node của. Tất cả bạn cần làm là tạo ra một logger trong một tệp riêng nói, logger.js:

 
var bunyan = require("bunyan"); // Bunyan dependency 
var logger = bunyan.createLogger({name: "myLogger"}); 

module.exports = logger; 

Sau đó, lấy logger này từ mô-đun khác:

 
var logger = require("./logger"); 
logger.info("Anything you like"); 
+0

Tôi thích cách tiếp cận này, nhưng làm thế nào để cấu hình logger trước khi sử dụng lần đầu tiên? Tôi muốn sử dụng nó theo cách này, nhưng tôi muốn thiết lập đường dẫn đầu ra. Tôi đã cố gắng để bao gồm "init" chức năng trong logger.js và thiết lập "module.exports" trong nó, nhưng nó không phải là tốt đẹp. –

+0

@lixiang Điều này không tạo ra một bản ghi mới mỗi lần nó được yêu cầu? – PixMach

+1

@PixMach, Không, Mô-đun yêu cầu sẽ lưu vào bộ nhớ đối tượng – lixiang

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