Winston日志框架使用

winston日志框架使用

原來一直是使用log4js做日志輸出爹谭,原來只是輸出到標準輸出中枷邪,用了3年了,一直沒換過∨捣玻現(xiàn)在為了將詳細的日志都記錄下來东揣,不光輸出到標準出,而且根據(jù)服務的分層輸出到不同的文件中腹泌。如:全部的log都輸出到debug文件及標準輸出中嘶卧,service層的log輸出service.log文件中,dao層的log輸出到dao.log文件中凉袱,為了防止log文件過大芥吟,需按日期切分,如:按天专甩。

為何選擇winston

  1. github start數(shù)多钟鸵,夠直接把。
  2. 更加靈活涤躲,可以靈活的組織transport棺耍,來完成比較復雜的日志輸出任務。
  3. 日志格式為json字符串种樱,方便后期分析蒙袍,當然可以自定義format.
  4. 支持簡單的log分析,Profiling缸托。
  5. 支持stream Api左敌。
  6. 簡單Log Query Api,當然無法和專業(yè)的日志分析工具比俐镐。

我要達到的效果

  1. 按天生成日志文件矫限。
  2. 根據(jù)不同的代碼分層來產(chǎn)生不同的log輸出到不同的文件。
  3. 所有分層產(chǎn)生的log不光輸出到log文件還要輸出到標準輸出佩抹。
  4. 自定義格式化日志輸出叼风,輸出到標準輸出的格式便于讀取,輸出到log文件的格式便于分析棍苹。
  5. 可以捕獲系統(tǒng)崩潰異常无宿。

日志輸出方法

整合多個transport及封裝

格式化輸出到標準輸出的日志格式。

格式為

[2017-09-21 23:41:05.122] [DEBUG] - 輸出日志的module 日志詳細信息

但是在winston中沒有可以像log4js一樣可以定義category枢里,為了達到這個效果孽鸡,我們利用winston的 meta 特性來實現(xiàn)這一功能蹂午。winston中log方法輸出的最后一個參數(shù)為對象的話,會被解析成 meta彬碱,我們在meta中自定義一個
module字段來標記日志來自哪個模塊豆胸。

const myLogFormatter = function (options) {
    const timestamp = options.timestamp();
    const level = options.level.toUpperCase();
    const message = options.message || '';
    let module = 'default';
    // meta中module,標記日志來自哪個模塊
    if (options.meta && options.meta.module) {
      module = options.meta.module;
    }
    const formatted = `[${timestamp}] [${level}] ${module} - `;
    if (options.colorize) {
      const colorStr = winston.config.colorize(options.level, formatted);
      return `${colorStr}${message}`;
    }
    return `${formatted}${message}`;
};

創(chuàng)建標準輸出的transport

const transportConsole = new winston.transports.Console({
    json: false,
    prettyPrint:true,
    colorize: true,
    level:'debug',
    timestamp: function () {
        return moment().format('YYYY-MM-DD HH:MM:ss.SSS');
    },
    formatter: myLogFormatter,
});

創(chuàng)建所有日志輸出到文件的transport巷疼,日志輸出到debug.log

const debugTransportFile = new winston.transports.File({
    name: 'full',
    filename: __dirname + '/logs/debug.log',
    json: true,
    level:'debug',
    maxsize: 1024 * 1024 * 10 // 10MB
});

service模塊專用輸出到文件的transport晚胡,日志輸出到service.log

const serviceTransportFile = new winston.transports.File({
    name: 'service',
    filename: __dirname + '/logs/service.log',
    json: true,
    level:'debug',
    maxsize: 1024 * 1024 * 10 // 10MB
});

dao模塊專用輸出到文件的transport,日志輸出到dao.log

const daoTransportFile = new winston.transports.File({
    name: 'dao',
    filename: __dirname + '/logs/dao.log',
    json: true,
    level:'debug',
    maxsize: 1024 * 1024 * 10 // 10MB
});

為各個container添加transport嚼沿。

// default container輸出日志到標準輸出及debug.log文件中
winston.loggers.add('default', {
  transports: [
    transportConsole,
    debugTransportFile
  ],
});
// service container輸出日志到標準輸出估盘、debug.log及service.log文件中
winston.loggers.add('service', {
    transports: [
        transportConsole,
        serviceTransportFile,
        debugTransportFile
    ],
});
// dao container輸出日志到標準輸出、debug.log及dao.log文件中
winston.loggers.add('dao', {
    transports: [
        transportConsole,
        daoTransportFile,
        debugTransportFile
    ],
});

代理各個containerdebug骡尽、info等方法遣妥,達到可以顯示日志來自哪個module的功能。

const defaultLog = winston.loggers.get('default');
const serviceLog = winston.loggers.get('service');
const daoLog = winston.loggers.get('dao');
// 封裝default
const getDefaultLogger = (module) => {
  return {
    debug: (...args) => {
      const meta = { module };
      const fullParams = args.concat(meta);
      defaultLog.debug.apply(defaultLog, fullParams);
    },
    info: (...args) => {
      const meta = { module };
      const fullParams = args.concat(meta);
      defaultLog.info.apply(defaultLog, fullParams);
    },
    warn: (...args) => {
      const meta = { module };
      const fullParams = args.concat(meta);
      defaultLog.warn.apply(defaultLog, fullParams);
    },
    error: (...args) => {
      const meta = { module };
      const fullParams = args.concat(meta);
      defaultLog.error.apply(defaultLog, fullParams);
    }
  };
};
// 封裝service
const getServiceLogger = (module) => {
  return {
    debug: (...args) => {
      const meta = { module };
      const fullParams = args.concat(meta);
      serviceLog.debug.apply(serviceLog, fullParams);
    },
    info: (...args) => {
      const meta = { module };
      const fullParams = args.concat(meta);
      serviceLog.info.apply(serviceLog, fullParams);
    },
    warn: (...args) => {
      const meta = { module };
      const fullParams = args.concat(meta);
      serviceLog.warn.apply(serviceLog, fullParams);
    },
    error: (...args) => {
      const meta = { module };
      const fullParams = args.concat(meta);
      serviceLog.error.apply(serviceLog, fullParams);
    }
  };
};
// 封裝dao
const getDaoLogger = (module) => {
  return {
    debug: (...args) => {
      const meta = { module };
      const fullParams = args.concat(meta);
      daoLog.debug.apply(daoLog, fullParams);
    },
    info: (...args) => {
      const meta = { module };
      const fullParams = args.concat(meta);
      daoLog.info.apply(daoLog, fullParams);
    },
    warn: (...args) => {
      const meta = { module };
      const fullParams = args.concat(meta);
      daoLog.warn.apply(daoLog, fullParams);
    },
    error: (...args) => {
      const meta = { module };
      const fullParams = args.concat(meta);
      daoLog.error.apply(daoLog, fullParams);
    }
  };
};

封裝后如何使用爆阶?

比如在我們代碼代碼的service層中的userService中打印日志“登錄成功”燥透,日志級別為info

getServiceLogger('userService').info('登錄成功');

控制臺輸出為:

[2017-09-22 00:09:45.026] [INFO] userService - 登錄成功

此日志會輸出在標準輸出中辨图、debug.log中及service.log中班套,日志中寫入的控制臺輸出的略有不同。

寫入的日志格式為:

{"module":"userService","level":"info","message":"登錄成功","timestamp":"2017-09-21T16:01:45.026Z"}

更多功能

我寫了幾個demo故河,包括基本使用吱韭,多個輸出源,捕獲系統(tǒng)崩潰錯誤鱼的,按天生成日志文件理盆。代碼地址為:

winstonDemo

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凑阶,隨后出現(xiàn)的幾起案子猿规,更是在濱河造成了極大的恐慌,老刑警劉巖宙橱,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姨俩,死亡現(xiàn)場離奇詭異,居然都是意外死亡师郑,警方通過查閱死者的電腦和手機环葵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宝冕,“玉大人张遭,你說我怎么就攤上這事〉乩妫” “怎么了菊卷?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵缔恳,是天一觀的道長。 經(jīng)常有香客問我的烁,道長褐耳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任渴庆,我火速辦了婚禮,結(jié)果婚禮上雅镊,老公的妹妹穿的比我還像新娘襟雷。我一直安慰自己,他們只是感情好仁烹,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布耸弄。 她就那樣靜靜地躺著,像睡著了一般卓缰。 火紅的嫁衣襯著肌膚如雪计呈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天征唬,我揣著相機與錄音捌显,去河邊找鬼。 笑死总寒,一個胖子當著我的面吹牛扶歪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摄闸,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼善镰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了年枕?” 一聲冷哼從身側(cè)響起炫欺,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎熏兄,沒想到半個月后品洛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡霍弹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年毫别,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片典格。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡岛宦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耍缴,到底是詐尸還是另有隱情砾肺,我是刑警寧澤挽霉,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站变汪,受9級特大地震影響侠坎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜裙盾,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一实胸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧番官,春花似錦庐完、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至酷师,卻和暖如春讶凉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背山孔。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工懂讯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人饱须。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓域醇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蓉媳。 傳聞我的和親對象是個殘疾皇子譬挚,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn)酪呻,斷路器减宣,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 在應用程序中添加日志記錄總的來說基于三個目的:監(jiān)視代碼中變量的變化情況,周期性的記錄到文件中供其他應用進行統(tǒng)計分析...
    時待吾閱讀 4,961評論 0 6
  • 在應用程序中添加日志記錄總的來說基于三個目的:監(jiān)視代碼中變量的變化情況玩荠,周期性的記錄到文件中供其他應用進行統(tǒng)計分析...
    時待吾閱讀 4,951評論 1 13
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,510評論 25 707
  • Ch.1 做自己的女神 自信漆腌、愛自己、贊美自己阶冈、樹立自己的風格 自信的女人愛自己闷尿,沒有一處不愛,包括缺憾女坑。 有了自...
    ThatLight閱讀 619評論 0 5