1

I'm working on a Restful API and I'm logging all the important steps with bunyan, including the requests. I'm having two problems with logging: My first problem is that when I log them, all my objects, instead of appearing like independent objects, appear in the msg field, like strings.

Here is my code to log the requests:

var logger = bunyan.createLogger({
    name: 'main', 
    streams: [{ 
        level: 'info', 
        path: './logs/requests.log'
    }]
});

logRequest = function(request){
    logger.info("Request started.", {id: request.id}, {method: request.method});
};

and when I see the request.log file it appears like this (I've just added some tabs to make it more comfortable to see) :

{
    "name": "logger",
    "hostname": "LLAS",
    "pid": 7700,
    "level": 30,
    "msg":"Request started. { id: '1428527975041:LLAS:7700:i898o4l5:10000'{ method:'post' } ",
    "time":"2015-04-08T21:19:35.055Z",
    "v":0
}

だから私の問題は、「msg」フィールドです。「id」と「method」を文字列ではなく他のフィールドと同じように表示したいのです。いいえ:

 {
        "name": "logger",
        "hostname": "LLAS",
        "pid": 7700,
        "level": 30,
        "msg":"Request started.",
        "id": '1428527975041:LLAS:7700:i898o4l5:10000',
        "method":  'post',
        "time":"2015-04-08T21:19:35.055Z",
        "v":0
 }

どうすれば問題を解決できますか?

そして私の2番目の問題は、同じファイルに複数のログを記録すると、JSONが次のように新しい行ではなく同じ行に書き込まれることです。

{"name":"logger",...,"v":0}{"name":"logger",...,"v":0}

これの代わりに:

{"name":"logger",...,"v":0}
{"name":"logger",...,"v":0}

そして、同じ行でそれらのオブジェクトを後で操作することはできません。また、そのように読み、維持するのも困難です。

なぜこれが起こっているのか知っている人はいますか?

4

1 に答える 1

1

私の最初の問題は、それらをログに記録すると、すべてのオブジェクトが、独立したオブジェクトのように表示されるのではなく、文字列のように「msg」フィールドに表示されることです。

これは、複数のオブジェクトを渡しているためです。ロギングの最初のパラメーターとして 1 つのオブジェクトのみを渡すことができます。他のすべてのパラメーターは と見なされmsgます。bunyanのソース コードから:

/**
 * The functions below log a record at a specific level.
 *
 * Usages:
 *    log.<level>()  -> boolean is-trace-enabled
 *    log.<level>(<Error> err, [<string> msg, ...])
 *    log.<level>(<string> msg, ...)
 *    log.<level>(<object> fields, <string> msg, ...)
 *
 * where <level> is the lowercase version of the log level. E.g.:
 *
 *    log.info()
 * ....
 */

したがって、すべてのパラメーターを 1 つのオブジェクトに渡すと、適切に機能します。

var request = { id: "abc", method: "GET" }; // dummy request object
logger.info({id: request.id, method: request.method}, "Request started.");

結果は次のとおりです(きれいに印刷されています):

{
  "name": "main",
  "hostname": "Victors-MacBook-Pro.local",
  "pid": 2848,
  "level": 30,
  "id": "abc",
  "method": "GET",
  "msg": "Request started.",
  "time": "2015-04-08T23:25:37.967Z",
  "v": 0
}

2 つ目の問題は、同じファイルに複数のログを記録すると、JSON が新しい行ではなく同じ行に書き込まれることです。

Windows を使用していますか? もしそうなら、おそらく問題は bunyan が\nWindows スタイル ( \r\n) ではなく UNIX スタイルのキャリッジ リターン ( ) を使用している可能性があることです。UNIX スタイルの改行をサポートするテキスト エディターを使用してみてください (たとえば、notepad++ やサブライム テキストなど)。

于 2015-04-08T23:35:00.130 に答える