2017-02-17 21 views

回答

0

在我深入瞭解之前,請注意,該調試日誌記錄工具使用了幾乎處理所有邏輯的visionmedia's debug module

是否可以在運行時動態更改模式?

前孔裝載任何模塊,我相信是剛剛操縱環境變量最安全,最好的辦法:

if (process.env.NODE_ENV === 'development') { 
    process.env.DEBUG = process.env.DEBUG + ',loopback:*'; 
} 

另一種方法是先裝載debug和使用它的.enable方法:

require('debug').enable('loopabck:*'); 

但請注意,它只適用於以前這樣做的情況,因爲在創建實例之前它只允許進行更改,在此情況下需要進行環回opback被加載。另一件事是,可能會安裝多個調試模塊,具體取決於相關性和包管理器(npm @ 3,npm @ 2和yarn的行爲不同)。 debug可能位於您的node_modules目錄中,或者可能位於每個模塊的node_modules目錄的回送中。所以確保你需要它的所有實例並啓用,如果你想這樣做。

現在,如果不想在啓動時執行此操作,那麼API不允許在運行時進行更改。您可以查看關於這個here的討論。雖然有一些骯髒的方法來解決它,但這些可能會在未來打破,所以要小心。

首先,有一個名爲hot-debug的模塊,據說require('debug').enable也可以在先前創建的實例上工作,但是當我嘗試它時,它不能正常工作,而且很麻煩,但它有可能對您工作正常。

如果這對您不適用另一種方法是重寫require('debug').log方法。如果這是定義的,debug將調用此方法而不是console.log格式化的參數。您可以設置DEBUG=*,然後自己將其過濾:

require('debug').log = function (string) { 
    if (string.contains('loopback:security')) { 
     console.log(string); 
    } 
}; 

這種方式將是生產緩慢但正如所有的調試輸出將被過濾,即使沒有任何可能被輸出到控制檯之前進行格式化。

重寫require('debug').init方法的另一件事。每次創建新的調試實例時都會調用它。由於每個debug實例都使用enabled屬性來檢查它是否已啓用,因此我們可以切換該屬性。

const debug = require('debug'); 
const { init } = debug; 
const instances = []; 
debug.init = function(debugInstance) { 
    init(debugInstance); 
    instances.push(debugInstance); 
}; 

// You can call this function later to enable a given namespace like loopback.security.acl 
function enableNamespace(namespace) { 
    instances.forEach(instance => { 
    instance.enabled = instance.namespace === namespace; 
    }); 
} 

儘管可以對此做很多改進,但您明白了。

+0

謝謝您的詳細解答。儘管它包含幾種不同的解決方案,但我將其標記爲正確答案對我而言,personnaly操縱環境變量是完美的。 – Serg

+0

歡迎,不同的使用情況,有不同的解決方案。 –