Symfoware

Symfowareについての考察blog

Logstash CodeIgniterで出力したログを収集する

Logstashでテキストファイルが変更されたらデータベースにログを追記してみました。
Logstashのインストールと簡単な設定方法


もう少し実用的な例として、PHPのwebフレームワーク「CodeIgniter」で
出力したログファイルを監視対象としてみます。



CodeIgniterのログファイル



CodeIgniterのデフォルト設定ではログファイルは出力されないようになっています。
application/config/config.phpを編集して、ログの出力を有効にします。

・config.php


  1. // Errorを出力
  2. $config['log_threshold'] = 1;
  3. // ログファイルの拡張子を「.log」に変更。デフォルトはPHP
  4. $config['log_file_extension'] = '.log';




ログを出力するプログラムはこのようになります。

・application/controllers/Test.php


  1. <?php
  2. class Test extends CI_Controller {
  3.     public function index() {
  4.         
  5.         log_message('error', 'hello world!');
  6.         
  7.     }
  8. }




実行すると、application/logsにlog-2016-08-07.logというような
名前のファイルが出力されます。

ファイルの内容は以下の通り。


ERROR - 2016-08-07 17:32:07 --> hello world!



このログの日付とメッセージをデータベースに登録してみます。






filter - grok



ログの1行を値に分解するにはgrokフィルターを使えば良さそうです。
https://www.elastic.co/guide/en/logstash/current/config-examples.html
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html

日付や値をどう指定すればよいか悩んだのですが、こちらが参考になりました。
Grok formatting for a custom timestamp

grokで指定できるパターンはこちら。
https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns

設定をデバッグできるサイトです。非常に助かりました。
Grok Debugger


CodeIgniterで出力されたログを解析する設定はこのようになりました。


  1. input {
  2.     file {
  3.         path => "/var/dev/php/ci3/application/logs/*.log"
  4.         start_position => beginning
  5.     }
  6. }
  7. filter {
  8.     grok {
  9.         match => { "message" => "%{WORD:loglevel} - %{TIMESTAMP_ISO8601:logtimestamp} --> %{GREEDYDATA:logdata}" }
  10.     }
  11. }
  12. output {
  13.     jdbc {
  14.         connection_string => "jdbc:mariadb://localhost/sample?user=root&password=P@ssw0rd"
  15.         statement => [ "INSERT INTO log (host, timestamp, message) VALUES(?, ?, ?)", "host", "logtimestamp", "logdata" ]
  16.     }
  17.     
  18. }




設定ファイル変更後、logstashを再起動。


# /etc/init.d/logstash restart




プログラムからログを出力するとデータベースに反映されました。


MariaDB [sample]> select * from log;
+----+------+---------------------+--------------+
| id | host | timestamp         | message     |
+----+------+---------------------+--------------+
| 10 | php5 | 2016-08-07 18:15:02 | hello world! |
+----+------+---------------------+--------------+
1 row in set (0.00 sec)








ERRORのみ出力



CodeIgniterのconfigを変更して、すべてのログを出力するようにします。


  1. $config['log_threshold'] = 4;




この設定だと、すべての出力がデータベースに登録されます。
ログレベルが「ERROR」のものだけテーブルに登録してみます。

設定ファイル中、if文が使用できるので分岐を書いてやります。


  1. input {
  2.     file {
  3.         path => "/var/dev/php/ci3/application/logs/*.log"
  4.         start_position => beginning
  5.     }
  6. }
  7. filter {
  8.     grok {
  9.         match => { "message" => "%{WORD:loglevel} - %{TIMESTAMP_ISO8601:logtimestamp} --> %{GREEDYDATA:logdata}" }
  10.     }
  11. }
  12. output {
  13.     
  14.     if [loglevel] == 'ERROR' {
  15.         jdbc {
  16.             connection_string => "jdbc:mariadb://localhost/sample?user=root&password=P@ssw0rd"
  17.             statement => [ "INSERT INTO log (host, timestamp, message) VALUES(?, ?, ?)", "host", "logtimestamp", "logdata" ]
  18.         }
  19.     }
  20.     
  21. }




設定ファイルを再読み込み。


# /etc/init.d/logstash reload




これでログレベルがERRORのものだけテーブルに登録されるようになりました。


MariaDB [sample]> select * from log;
+----+------+---------------------+-----------------+
| id | host | timestamp         | message         |
+----+------+---------------------+-----------------+
| 32 | php5 | 2016-08-07 18:30:01 | エラーです     |
| 33 | php5 | 2016-08-07 18:30:02 | エラーです     |
+----+------+---------------------+-----------------+
2 rows in set (0.00 sec)




これを応用して、エラー発生時にのみメールを送信という設定もできそうです。


関連記事

テーマ:サーバ - ジャンル:コンピュータ

  1. 2016/08/07(日) 18:35:13|
  2. Java
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Logstash json形式のログファイルを読み込む(codec) | ホーム | Logstashのインストールと簡単な設定方法>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1911-281592db
この記事にトラックバックする(FC2ブログユーザー)