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
});
};
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
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
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