2015年10月22日木曜日

node.jsでのログ出力:log4js

node.jsでのlog4jsを使ったログ出力について備忘録。

log4js

javaで使われいてるlog4のjavascript版のlog4jsをNode.jsにコンバージョンしたもの。
https://github.com/nomiddlename/log4js-node
特徴的な機能としては次のようなものがある。
  • Node.jsのConsoleログを置き換えられる
  • file appenderでは、ファイルサイズでローテーションができる
  • メール送信ができる(smtp appender)
  • logstashに送信できる(Logstash UDP appender)
  • Workerプロセス構成のときに使えるmultiprocess appender
  • それぞれのカテゴリにそれぞれのログレベルで出力を設定できる
アプリケーションのログはもちろん、Node.jsのエラーログやアクセスログの取得もできそうなので、morganよりいいんじゃないかと思って試してみる。

■インストール

まずはモジュールのインストール。
$ npm install log4js --save

次に出力設定ファイルを、外部ファイルとして作成する。
log4js_config.json
{
    "appenders": [
        {
            "type":     "File",
            "category": "system",
            "maxLogSize": 1048576,
            "backups": 3,
            "compress":true,
            "filename": "logs/system.log"
        },
        {
            "type":     "dateFile",
            "category": "access",
            "filename": "logs/access.log",
            "pattern":  "-yyyy-MM-dd"
        },
        {
            "type":     "dateFile",
            "category": "error",
            "filename": "logs/error.log",
            "pattern":  "-yyyy-MM-dd"
        },
        {
            "type":     "console",
            "category": "test"
        }
    ],
    "levels": {"system": "INFO"},
    "replaceConsole": true
}
上記を例に設定内容の記載。


appenderstypedateFileローテーション対応したファイルへの出力
fileただのファイルへの出力
consoleすべてをconsoleへの出力
category出力するログの設定の単位。カテゴリごとに設定をすることができる。
filename出力するファイルの名前
patternOutputストリーム。デフォルトは、process.stdoutになっている
maxLogSizetypeがfileの場合の最大ファイルサイズ(bytes)
backupsbackup世代数
compresstypeがfileの場合のオプションで、gzipをするかどうか?フラグ
levels出力するログレベルを設定。例では、categoryがsystemのものをINFOレベル以上で出力するという設定
replaceConsoletypeにconsoleが指定されていた場合、consoleへの出力フォーマットが通常のログ形式と同じになる設定

上記のlevelsで使用できる値は以下の通り。
ALLすべて出力
TRACETRACE 以上を出力
DEBUGDEBUG 以上を出力
INFOINFO 以上を出力
WARNWARN 以上を出力
ERRORERROR 以上を出力
FATALFATAL 以上を出力
MARKMARK 以上を出力
OFF出力しない

以下は実装例。
// モジュールの取り込み
var log4js = require('log4js');

// 設定ファイルの取り込み(ファイルは環境変数:LOG4JS_CONFIGに指定してもよい)
// reloadSecsはオプション(byou )。通常は60秒間隔で設定ファイルがReloadされる。
log4js.configure('path/log4js_config.json', { reloadSecs: 300 });

// 設定がいるを絶対パスで記載することもできる。
log4js.configure('log4js_config.json', { cwd: '/absolute/path/to/log/dir' });

// 出力するカテゴリの指定
var logger = log4js.getLogger('system');

// 出力レベルの設定(設定ファイルのlevelsに相当)
logger.setLevel('ERROR');

// 出力
logger.trace('Entering cheese testing');
logger.debug('Got cheese.');
logger.info('Cheese is Gouda.');
logger.warn('Cheese is quite smelly.');
logger.error('Cheese is too ripe!');
logger.fatal('Cheese was breeding ground for listeria.');

2015年10月10日土曜日

graphiteの環境の構築

CentOS 6.5
■Graphiteの構成
 Graphite-Web
 Carbon
 Whisper

■graphiteのインストール準備

 graphiteをpip(pythonのパッケージ管理ツール)でインストールする。(本家サイトを参照)

#graphiteの構成要素のcarbonをインストールするために、pythonの開発ヘッダーを入れる。

$ sudo yum install python-devel

#pipのセットアップを行うため、setuptoolsをインストールする

$ wget https://bootstrap.pypa.io/ez_setup.py -O - | sudo python

#続いてpipのインストール

$ curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | sudo python
準備完了!

■graphiteのインストール

 では、さっそくgraphiteのインストールを始める。
$ sudo pip install https://github.com/graphite-project/ceres/tarball/master
$ sudo pip install whisper
$ sudo pip install carbon
$ sudo pip install graphite-web
特にエラーなし。
デフォルトでは、/opt/graphite/にインストールされる。とマニュアルにあるが、
 /usr/lib/python2.6/site-packages/opt/graphite/
に出来上がっている。/opt/graphiteにまとめておきたいので、インストールし直し。
$ sudo pip uninstall carbon
$ sudo pip uninstall graphite-web
$ sudo pip install carbon --install-option="--prefix=/opt/graphite" --install-option="--install-lib=/op¥t/graphite/lib"
$ sudo pip install graphite-web --install-option="--prefix=/opt/graphite" --install-option="--install-lib=/opt/graphite/lib"
$ ls /opt/graphite
bin conf examples lib storage webapp

■graphiteのセットアップ(本家サイトを参照)

graphite-webでは、local_settings.pyを読み込んで設定されるみたいなので、設定を変更する。
サイトのページには
 /opt/graphite/webapp/graphite/local_settings.py
があると記載があったが、見あたらなかった。exampleファイルがあったので、コピーして使う。

$ mkdir /opt/graphite/webapp/graphite
$ cd /opt/graphite/webapp/graphite
$ cp /opt/graphite/lib/graphite/local_settings.py.example ./local_settings.py
$ sudo vi local_settings.py
#以下、変更箇所
TIME_ZONE = 'Asia/Tokyo'
LOG_RENDERING_PERFORMANCE = True
LOG_CACHE_PERFORMANCE = True
LOG_METRIC_ACCESS = True

■carbonのセットアップ(本家サイトを参照)

・carbon.conf
 carbonデーモン用の設定ファイル。ファイル内のセクションは
 [cache]・・・carbon-cacheに関する設定ファイル
 [relay]・・・carbon-relayに関する設定
 [aggregator]・・・carbon-aggregatorに関する設定

今回は設定変更なし進める。

$ cp carbon.conf.example carbon.conf

・storage-schemas.conf

 メトリクスの保持期間の設定をするためのファイル。ここの設定でwhisperに伝達する。
この設定のポイントは

  ・ファイルの上から順に適用される
  ・正規表現が使える
  ・メトリクス名にマッチした最初のパターンが使われる
  ・最初にメトリクスが送られた来たときに、保持期限が設定される
  ・この設定が変更されても、生成済みwspファイルには反映されない。whisper-resize.pyを使って変更する必要がある。
とのこと。

記載例)

[apache_busyWorkers]
pattern = ^servers\.www.*\.workers\.busyWorkers$
retentions = 15s:7d,1m:21d,15m:5y

1行目はセクション名。2行目は
3行目は、7日間は15秒間平均(デフォルトは平均)、21日間は1分平均、5年間は15分平均
という意味になる。
今回はデフォルトで。

$ cp storage-schemas.conf.example storage-schemas.conf
$ less storage-schemas.conf

 Schema definitions for Whisper files. Entries are scanned in order,
# and first match wins. This file is scanned for changes every 60 seconds.
#
#  [name]
#  pattern = regex
#  retentions = timePerPoint:timeToStore, timePerPoint:timeToStore, ...

# Carbon's internal metrics. This entry should match what is specified in
# CARBON_METRIC_PREFIX and CARBON_METRIC_INTERVAL settings
[carbon]
pattern = ^carbon\.
retentions = 60:90d

[default_1min_for_1day]
pattern = .*
retentions = 60s:1d
 
すべてのデータを60秒間平均で1日保持。



■carbonの実行

$ /opt/graphite/bin/carbon-cache.py start


ImportError: Twisted requires zope.interface 3.6.0 or later: no module named zope.interface.

エラーが出た。調べてみると、とりあえずzope.interface自体をインストールする方法があるらしい。

$ sudo pip install zope.interface==3.6.0
$ sudo /opt/graphite/bin/carbon-cache.py start



Starting carbon-cache (instance a)

#ログも確認してみる
$ cd /opt/graphite/storage/log/carbon-cache/
$ ls
carbon-cache-a
$ cd  carbon-cache-a
$ less console.log

10/10/2015 23:39:36 :: Log opened.
10/10/2015 23:39:36 :: twistd 15.4.0 (/usr/bin/python 2.6.6) starting up.
10/10/2015 23:39:36 :: reactor class: twisted.internet.epollreactor.EPollReactor.
10/10/2015 23:39:36 :: ServerFactory starting on 2003
10/10/2015 23:39:36 :: Starting factory <twisted.internet.protocol.ServerFactory instance at 0x308e290>
10/10/2015 23:39:36 :: ServerFactory starting on 2004
10/10/2015 23:39:36 :: Starting factory <twisted.internet.protocol.ServerFactory instance at 0x3097b90>
10/10/2015 23:39:36 :: ServerFactory starting on 7002
10/10/2015 23:39:36 :: Starting factory <twisted.internet.protocol.ServerFactory instance at 0x3097bd8>
10/10/2015 23:40:36 :: /opt/graphite/conf/storage-aggregation.conf not found, ignoring.
10/10/2015 23:41:36 :: /opt/graphite/conf/storage-aggregation.conf not found, ignoring.
10/10/2015 23:42:36 :: /opt/graphite/conf/storage-aggregation.conf not found, ignoring.
10/10/2015 23:43:36 :: /opt/graphite/conf/storage-aggregation.conf not found, ignoring.

ちゃん起動しているようです。