2013-05-23 16 views
8

シナリオ:異なるタスクを実行し、さまざまな開発者が処理する複数のメソッドがあると考えてください。エラーが発生した場合にログを記録するジェネリックメソッド呼び出しを作成しようとしています。メソッド内でメソッド名を取得する方法

function enterLog(sourcefile, methodName, LineNo) 
    { 
      fs.appendFile('errlog.txt', sourcefile +'\t'+ methodName +'\t'+ LineNo +'\n', function(e){ 
      if(e) 
       console.log('Error Logger Failed in Appending File! ' + e); 
     }); 
    } 

ので、上記のメソッドの呼び出しがソースを渡すことがありますので、必要性は次のように私は、一般的な機能を書いた

..私はラインNo、メソッド名などをログに記録する必要がありますファイル、メソッド名、行番号は、開発中の任意の時点で変更される可能性があります。

など。

enterLog('hardcodedFileName.js', 'TestMethod()', '27'); 

質問:ハードコーディングされた値を使用してメソッドを呼び出すために必要な(例えば、上記のような)の値をハードコードに、それより良いですかメソッド名に&ラインなしの参照からを取得する方法がありますNode.jsにはどんな方法がありますか?あなたは

https://developer.mozilla.org/de/docs/JavaScript/Reference/Global_Objects/Function/caller

で見ても

+0

チェック議論:ハードコーディングではない、あなたのファイル名は、サードパーティ・モジュールの依存関係なしでのNode.jsで達成するのが最も簡単ですhttp://stackoverflow.com/questions/16324409/is-it-possible -for-a-javascript-function-to-return-its-own-function-call-as-a-st – NilsH

答えて

7

私たちのアプリケーションロガーで使用する素晴らしいモジュールがあります。行番号を取得することさえできます。

var traceback = require('traceback'); 

function enterLog(sourcefile, methodName, LineNo) { 
    var tb = traceback()[1]; // 1 because 0 should be your enterLog-Function itself 
    fs.appendFile('errlog.txt', tb.file +'\t'+ tb.method +'\t'+ tb.line +'\n', function(e) { 
    if(e) { 
     console.log('Error Logger Failed in Appending File! ' + e); 
    } 
    }); 
} 

とだけ呼び出します:あなたが好きな場所から

enterLog(); 

をし、常に正しい結果

編集を取得:別のヒントをhttps://npmjs.org/package/traceback

ので、あなたはそのようにそれを書き換えることができます。ここ

var path = require('path'); 
var currentFile = path.basename(__filename); // where __filename always has the absolute path of the current file 
+0

非常に役に立ちます..ありがとう –

+0

よろしくお願いします。 fs.appendFileは常にログファイルを開いて書き込み、ファイルハンドル(http:// nodejs)を閉じる必要があるため、元の質問とは関係のない別のヒントがあります。 org/docs/latest/api/fs.html#fs_fs_createwritestream_path_options – hereandnow78

+0

この例で何かが壊れているように見えます。私は次のようになります:/Users/chris/Desktop/Apps/repos/NetDb/Node.js/Node1/node_modules/traceback/lib/frame.js:26 frame.is_top = frame.isToplevel() ^ 違法アクセス –

0

つのプロパティには、 "名前" です。

関連する問題