簡體   English   中英

如何將Winston限制為每個日志文件僅1個文件描述符

[英]How to limit Winston to only 1 file descriptor per log file

我目前在我的項目中使用Winston來登錄少數日志文件-確切地說是4個不同的文件。 每個文件都被大量的類用來組合特定功能-這是應用程序的一種非常典型的用例。 我的問題是,到目前為止,Winston甚至在每次使用該類時,都為每個單個類為同一日志文件打開一個單獨的文件描述符。 我正在最新版本的Amazon Linux上運行,基准是使用了470個文件描述符。 一旦啟動應用程序,我便跳到1700多個。從那里開始,在應用程序運行並實例化利用記錄器的新類時,會使用成千上萬的其他文件描述符。 我們所有的日志都是使用Winston的容器提取的(請參見下面的代碼)。

更新:我只是用Winston創建了一個准系統應用程序,並用它來創建1個父記錄器和成千上萬個子記錄器。 我還使用子記錄器在創建消息時記錄一條消息。 整個過程在OS上僅需要1個文件描述符,因此很明顯,我們在應用程序中正在做的事情(要復雜得多)導致Winston打開單獨的FD ...但這不是默認行為。 誰看過這個嗎? 我正在努力將越來越多的東西添加到測試應用程序中,只是為了看看我是否可以真正開始使用更多的文件描述符。

我們有一種方法可以檢索設置為靜態的記錄器,因此我開始認為這是問題所在。

這僅意味着不必實例化該類即可運行該方法。 它與返回值的生存期無關。

我的處理方式是使用一個簡單的腳本導出Winston實例。 例如:

const winston = require('winston');

const applog = winston.createLogger({
  transports: [
    new (winston.transports.Console)({ 
      level: 'debug',
      handleExceptions: true
    })
  ],
  format: winston.format.simple()
});

module.exports = applog;

然后,在需要記錄器的任何模塊中,如下所示:

const applog = require('./lib/applog');

Node.js緩存了require()的結果,因此,無論您導出的內容是什么,對於任何需要該模塊的地方,都可以保證是完全相同的實例

您可以根據需要將此方法適應您的類和靜態方法。 只需在類之外(在同一文件中)進行所有Winston設置,並讓靜態方法返回實例。

好吧,現在我覺得自己很蠢。 這個問題根本與子記錄器無關,創建子記錄器肯定不會打開新的文件描述符。 問題在於,我們總是將記錄器選項傳遞給loggers.get(id,options)方法,而不是僅傳遞沒有選項的id(如果記錄器已經存在)。 該修復程序花費了幾行代碼,現在每個日志文件只有1個文件描述符打開。 天哪!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM