情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.js+winstonで未処理の例外が発生した場合にログを出力する

ログを出力するには下のようなモジュールを利用する方法があります。

  • log
  • npmlog
  • bunyan
  • winston
  • log4js

この記事ではwinstonモジュールを利用する方法を取り上げます。

winstonモジュールの基本的な使用方法に関しては下の記事を参照してください。

未処理の例外

winstonモジュールで未処理の例外が発生した場合にログを出力する専用のロガーを作成するにはwinston.handleExceptions関数を使用します。

var winston = require('winston');

winston.handleExceptions(new winston.transports.Console({
    name: 'aaa', 
    level: 'bbb'
}));
winston.handleExceptions([new winston.transports.Console({
    name: 'aaa', 
    level: 'bbb'
}), new winston.transports.File({
    name: 'ccc', 
    level: 'ddd', 
    filename: 'eee' 
})]);

第1引数に出力先を表すオブジェクトを指定します。あるいは、出力先を表すオブジェクトを配列として指定することもできます。

あるいは、winston.Loggerクラスのコンストラクタの第1引数のオプションにexceptionHandlersオプションを指定します。

exceptionHandlersオプションには出力先を表すオブジェクトを配列として指定します。

また、未処理の例外が発生し、ログを出力した後にプログラムを終了するかを設定するにはexitOnErrorオプションを指定します。

exitOnErrorオプションにはプログラムを終了するかを真偽値として指定します。あるいは、プログラムを終了するかを決定する処理を関数として指定することもできます。この関数の第1引数はエラーオブジェクトです。また、この関数では返り値としてプログラムを終了するかを真偽値として返すようにします。

var logger = new winston.Logger({
    exceptionHandlers: [
        new winston.transports.Console({
            name: 'aaa', 
            level: 'bbb'
        }), 
        new winston.transports.File({
            name: 'ccc', 
            level: 'ddd', 
            filename: 'eee' 
        })
    ], 
    exitOnError: function (err) {
        return true;
        //or
        return false;
    }
});

サンプルコード1

winston-handle-exceptions.js

var winston = require('winston');

winston.handleExceptions(new winston.transports.File({
    name: 'file1', 
    filename: 'log.txt'
}));

var logger = new winston.Logger({
    transports: [
        new winston.transports.Console({
            name: 'console', 
            handleExceptions: true, 
            humanReadableUnhandledException: true
        })
    ], 
    exceptionHandlers: [
        new winston.transports.File({
            name: 'file2', 
            filename: 'log2.txt'
        })
    ]
});

logger.error('error.');
logger.warn('warn.');
logger.info('info.');
logger.verbose('verbose.');
logger.debug('debug.');
logger.silly('silly.');

throw new Error('i am sick...');

使用パッケージ

  • winston
    npm install winstonでインストールします。

実行結果

C:\work\node>node winston-handle-exceptions.js
error: error.
warn: warn.
info: info.
error: uncaughtException: i am sick... date=Thu Nov 17 2016 14:28:17 GMT+0900 (東京 (標準時)), pid=4720, uid=null, gid=null, cwd=C:\work\node, execPath=C:\Program Files\nodejs\node.exe, version=v6.2.0, argv=[C:\Program Files\nodejs\node.exe, C:\work\node\winston-handle-exceptions.js], rss=22257664, heapTotal=11530240, heapUsed=5813256, loadavg=[0, 0, 0], uptime=1663795.3899205
Error: i am sick...
    at Object.<anonymous> (C:\work\node\winston-handle-exceptions.js:31:7)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Function.Module.runMain (module.js:575:10)
    at startup (node.js:160:18)
    at node.js:449:3

C:\work\node>type log.txt
{"date":"Thu Nov 17 2016 14:28:17 GMT+0900 (東京 (標準時))","process":{"pid":4720,"uid":null,"gid":null,"cwd":"C:\\work\\node","execPath":"C:\\Program Files\\nodejs\\node.exe","version":"v6.2.0","argv":["C:\\Program Files\\nodejs\\node.exe","C:\\work\\node\\winston-handle-exceptions.js"],"memoryUsage":{"rss":20807680,"heapTotal":10481664,"heapUsed":6266864}},"os":{"loadavg":[0,0,0],"uptime":1663795.3779131},"trace":[{"column":7,"file":"C:\\work\\node\\winston-handle-exceptions.js","function":"","line":31,"method":null,"native":false},{"column":32,"file":"module.js","function":"Module._compile","line":541,"method":"_compile","native":false},{"column":10,"file":"module.js","function":"Object.Module._extensions..js","line":550,"method":"Module._extensions..js","native":false},{"column":32,"file":"module.js","function":"Module.load","line":458,"method":"load","native":false},{"column":12,"file":"module.js","function":"tryModuleLoad","line":417,"method":null,"native":false},{"column":3,"file":"module.js","function":"Function.Module._load","line":409,"method":"Module._load","native":false},{"column":10,"file":"module.js","function":"Function.Module.runMain","line":575,"method":"Module.runMain","native":false},{"column":18,"file":"node.js","function":"startup","line":160,"method":null,"native":false},{"column":3,"file":"node.js","function":null,"line":449,"method":null,"native":false}],"stack":["Error: i am sick...","    at Object.<anonymous> (C:\\work\\node\\winston-handle-exceptions.js:31:7)","    at Module._compile (module.js:541:32)","    at Object.Module._extensions..js (module.js:550:10)","    at Module.load (module.js:458:32)","    at tryModuleLoad (module.js:417:12)","    at Function.Module._load (module.js:409:3)","    at Function.Module.runMain (module.js:575:10)","    at startup (node.js:160:18)","    at node.js:449:3"],"level":"error","message":"uncaughtException: i am sick...","timestamp":"2016-11-17T05:28:17.260Z"}

C:\work\node>type log2.txt
{"date":"Thu Nov 17 2016 14:28:17 GMT+0900 (東京 (標準時))","process":{"pid":4720,"uid":null,"gid":null,"cwd":"C:\\work\\node","execPath":"C:\\Program Files\\nodejs\\node.exe","version":"v6.2.0","argv":["C:\\Program Files\\nodejs\\node.exe","C:\\work\\node\\winston-handle-exceptions.js"],"memoryUsage":{"rss":22257664,"heapTotal":11530240,"heapUsed":5813256}},"os":{"loadavg":[0,0,0],"uptime":1663795.3899205},"trace":[{"column":7,"file":"C:\\work\\node\\winston-handle-exceptions.js","function":"","line":31,"method":null,"native":false},{"column":32,"file":"module.js","function":"Module._compile","line":541,"method":"_compile","native":false},{"column":10,"file":"module.js","function":"Object.Module._extensions..js","line":550,"method":"Module._extensions..js","native":false},{"column":32,"file":"module.js","function":"Module.load","line":458,"method":"load","native":false},{"column":12,"file":"module.js","function":"tryModuleLoad","line":417,"method":null,"native":false},{"column":3,"file":"module.js","function":"Function.Module._load","line":409,"method":"Module._load","native":false},{"column":10,"file":"module.js","function":"Function.Module.runMain","line":575,"method":"Module.runMain","native":false},{"column":18,"file":"node.js","function":"startup","line":160,"method":null,"native":false},{"column":3,"file":"node.js","function":null,"line":449,"method":null,"native":false}],"stack":["Error: i am sick...","    at Object.<anonymous> (C:\\work\\node\\winston-handle-exceptions.js:31:7)","    at Module._compile (module.js:541:32)","    at Object.Module._extensions..js (module.js:550:10)","    at Module.load (module.js:458:32)","    at tryModuleLoad (module.js:417:12)","    at Function.Module._load (module.js:409:3)","    at Function.Module.runMain (module.js:575:10)","    at startup (node.js:160:18)","    at node.js:449:3"],"level":"error","message":"uncaughtException: i am sick...","timestamp":"2016-11-17T05:28:17.266Z"}

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js