1.6.8でローテートするログを見る方法について

いつも情報ありがとうございます。

1点質問させてください。

現在、RHEL5.4上にzabbixサーバ1.6.8を稼動させています。
エージェントも全てRHEL5.4で稼動しています。

今、ログ監視の設定をしているところですが、
ローテートするログをzabbixでどのように監視したらいいのか
分からず困っています。

例えば、YYYYMMDD_ファイル名

ご存知の方がいらっしゃいましたらお教えいただけないでしょうか。

↓のNTTコムの情報だと1.8系に挙げないと無理そうですが・・・ :-( :-( :-(
http://www.zabicom.com/support/function.html

よろしくお願いします。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー TNK の写真

futureさんご自身でも書かれている通り、ログファイル名に正規表現を利用して、ローテートされたログとして処理できる機能は、1.8からの機能だったと思います。
参考:
 http://www.zabbix.jp/modules/newbb/viewtopic.php?topic_id=446&forum=6&post_id=2164#forumpost2164

1.6.8のlog[]の処理を見る限り、引数で渡されたファイル名そのままを指定し開いて処理しているようなので、この部分に手を入れないと設定だけでは対応できないのではないでしょうか。

ユーザー KAZ の写真

futureさん

例えば、YYYYMMDD_ファイル名

実は1.6.6でその様な機能を作ってました。A(^^;
私がかかわっている運用でLog4jやapacheの出すログが監視したいと要望が強かったので少々改修してみました。
ログ監視アイテムのファイル名に{YYYYMMDD}を使用できる改造しています。

例えば…
今日だと「log[/var/log/httpd/error_log_{YYYYMMDD}]」は「log[/var/log/httpd/error_log_20100409」からログを収集します。また、前日のログを読み飛ばしてないかもチェックするロジックが入ってます。

なので下記のパッチでlog[{YYYYMMDD}_ファイル名]とすれば監視可能です。

パッチとして作ったのですが、1関数丸々改造している様な感じです。A(^^;
<code>
diff -Nur zabbix-1.6.6.org/src/zabbix_agent/logfiles.c zabbix-1.6.6/src/zabbix_agent/logfiles.c
--- zabbix-1.6.6.org/src/zabbix_agent/logfiles.c 2009-08-26 22:16:24.000000000 +0900
+++ zabbix-1.6.6/src/zabbix_agent/logfiles.c 2009-11-13 12:03:12.000000000 +0900
@@ -22,6 +22,8 @@
#include "log.h"
#include "logfiles.h"

+#define MVAR_YYYYMMDD "{YYYYMMDD}"
+
/******************************************************************************
* *
* Function: process_log *
@@ -49,51 +51,104 @@
char **value
)
{
+ struct stat buf_today,
+ buf_yesterday;
+ struct tm *tm;
+ time_t now;
FILE *f = NULL;
- struct stat buf;
- int ret = FAIL;
+ char *pl,
+ *pr = NULL,
+ *filename_today = NULL,
+ *filename_yesterday = NULL,
+ *currentfilename = NULL,
+ *replace_to = NULL;
+ int ret = FAIL,
+ var_len;

assert(filename);
assert(lastlogsize);
assert(value);

- zabbix_log( LOG_LEVEL_DEBUG, "In process log (%s,%li)",
- filename,
- *lastlogsize);
+ zabbix_log( LOG_LEVEL_DEBUG, "In process log (%s,%li)", filename, *lastlogsize);

- /* Handling of file shrinking */
- if( 0 != stat(filename,&buf) )
- {
- zabbix_log( LOG_LEVEL_WARNING, "Cannot open [%s] [%s]", filename, strerror(errno));
+ if (NULL != strchr(filename, '{')){
+ filename_today = zbx_strdcat(filename_today, filename);
+ pl = filename_today;
+ pr = strchr(pl, '{');
+ while(NULL != pr){
+ var_len = 1;
+ if (0 == strncmp(pr, MVAR_YYYYMMDD, strlen(MVAR_YYYYMMDD))){
+ var_len = strlen(MVAR_YYYYMMDD);
+ now = time(NULL);
+ tm = localtime(&now);
+ replace_to = zbx_dsprintf(replace_to, "%.4d%.2d%.2d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
+ pr[0] = '\0';
+ }
+ filename_today = zbx_strdcat(filename_today, replace_to);
+ zbx_free(replace_to);
+ pl = pr + var_len;
+ pr = strchr(pl, '{');
+ }
+ filename_yesterday = zbx_strdcat(filename_yesterday, filename);
+ pl = filename_yesterday;
+ pr = strchr(pl, '{');
+ while(NULL != pr){
+ var_len = 1;
+ if (0 == strncmp(pr, MVAR_YYYYMMDD, strlen(MVAR_YYYYMMDD))){
+ var_len = strlen(MVAR_YYYYMMDD);
+ now = time(NULL) - 86400;
+ tm = localtime(&now);
+ replace_to = zbx_dsprintf(replace_to, "%.4d%.2d%.2d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
+ pr[0] = '\0';
+ }
+ filename_yesterday = zbx_strdcat(filename_yesterday, replace_to);
+ zbx_free(replace_to);
+ pl = pr + var_len;
+ pr = strchr(pl, '{');
+ }
}
- else
- {
- if(buf.st_size<*lastlogsize)
- {
+
+
+ /* Handling of file shrinking */
+ if(0 != stat(filename_today,&buf_today)){
+ zabbix_log( LOG_LEVEL_WARNING, "Cannot open [%s] [%s]", filename_today, strerror(errno));
+ }else{
+ if(buf_today.st_size<*lastlogsize){
*lastlogsize=0;
+ if('\0' == *filename_yesterday){
+ *lastlogsize=0;
+ currentfilename = filename_today;
+ }else{
+ /* check second file if in loglotate mode. */
+ if(0 != stat(filename_yesterday,&buf_yesterday)){
+ zabbix_log( LOG_LEVEL_WARNING, "Cannot open [%s] [%s]", filename_yesterday, strerror(errno));
+ *lastlogsize=0;
+ currentfilename = filename_today;
+ }else{
+ if(buf_yesterday.st_size<=*lastlogsize){
+ *lastlogsize=0;
+ currentfilename = filename_today;
+ }else{
+ currentfilename = filename_yesterday;
+ }
+ }
+ }
+ }else{
+ currentfilename = filename_today;
}

- if(NULL == (f = fopen(filename,"r") ))
- {
- zabbix_log( LOG_LEVEL_WARNING, "Cannot open [%s] [%s]", filename, strerror(errno));
- }
- else
- {
- if(-1 == fseek(f,*lastlogsize,SEEK_SET))
- {
- zabbix_log( LOG_LEVEL_WARNING, "Cannot set postition to [%li] for [%s] [%s]", *lastlogsize, filename, strerror(errno));
- }
- else
- {
+ if(NULL == (f = fopen(currentfilename,"r") )){
+ zabbix_log( LOG_LEVEL_WARNING, "Cannot open [%s] [%s]", currentfilename, strerror(errno));
+ }else{
+ if(-1 == fseek(f,*lastlogsize,SEEK_SET)){
+ zabbix_log(LOG_LEVEL_WARNING, "Cannot set postition to [%li] for [%s] [%s]", *lastlogsize, currentfilename, strerror(errno));
+ }else{
*value = zbx_malloc(*value, MAX_BUF_LEN);

- if (NULL == fgets(*value, MAX_BUF_LEN, f))
- {
+ if (NULL == fgets(*value, MAX_BUF_LEN, f)){
/* EOF */
zbx_free(*value);
- }
- else
- {
+ }else{
*lastlogsize = ftell(f);
zbx_rtrim(*value, "\r\n");
}
@@ -102,6 +157,8 @@
zbx_fclose(f);
}
}
+ zbx_free(filename_today);
+ zbx_free(filename_yesterday);

return ret;
}
</code>

もちろん1.8はログファイル名に正規表現が使えますので、1.8なら実現可能です。(只、1.8系はまだまだ安定していないのでお勧めできませんが…)

ユーザー sgym の写真

お世話になります。

上記パッチを、ZABBIX-1.6.6に適用致しました。
アイテム名が、
log[/var/log/test/test.log.{YYYYMMDD}]
の場合は問題なく採取できるのですが、

log[/var/log/test/test.{YYYYMMDD}.log]
の場合に採取できなくなってしまいます。

デバッグモードでログを出力したところ、
/var/log/test/test.20100713.logではなく
/var/log/test/test.20100713を見ようとしているようです。

test.{YYYYMMDD}.logのような名前のログの監視方法はありませんでしょうか。
※該当箇所の前後含め抜粋しました。デバッグログの、エージェントのホスト名と、サーバのIPは伏せております。

---ここから---
6838:20100713:113234 In disable_all_metrics()
6838:20100713:113234 In add_check('log[/var/log/test/test.{YYYYMMDD}.log]', 30, 0)
6838:20100713:113234 In process_active_checks('IP',10051)
6838:20100713:113234 In process log (/var/log/test/test.{YYYYMMDD}.log,0)
6838:20100713:113234 Cannot open [/var/log/test/test.20100713] [No such file or directory]
6838:20100713:113234 Active check [log[/var/log/test/test.{YYYYMMDD}.log]] is not supported. Disabled.
6838:20100713:113234 In process_value('agent_host','log[/var/log/test/test.{YYYYMMDD}.log]','ZBX_NOTSUPPORTED')
6838:20100713:113234 In send_buffer('IP','10051')
6838:20100713:113234 Values in the buffer 0 Max 100
6838:20100713:113234 Buffer: first allocation for 100 elements
6838:20100713:113234 Buffer: new element 0
6838:20100713:113234 In get_min_nextcheck()
6838:20100713:113234 Sleeping for 1 seconds
6838:20100713:113235 In send_buffer('IP','10051')
6838:20100713:113235 Values in the buffer 1 Max 100
6838:20100713:113235 JSON before sending [{
"request":"agent data",
"data":[
{
"host":"agent_host",
"key":"log[\/var\/log\/test\/test.{YYYYMMDD}.log]",
"value":"ZBX_NOTSUPPORTED",
"clock":1278988354}],
"clock":1278988355}]
6838:20100713:113235 JSON back [{
"response":"success",
"info":"Processed 1 Failed 0 Total 1 Seconds spent 0.003450"}]
6838:20100713:113235 In check_response({
"response":"success",
"info":"Processed 1 Failed 0 Total 1 Seconds spent 0.003450"})
6838:20100713:113235 Info from server: Processed 1 Failed 0 Total 1 Seconds spent 0.003450
6838:20100713:113235 OK
---ここまで---

ユーザー KAZ の写真

sgymさん

すいません、御指摘通りですね。
修正しますので、少々お待ち下さい。m(__)m

ユーザー sgym の写真

KAZ様

恐れ入ります。

開発系は全然得意でないため、暫定でfilename_todayと、filename_yesterdayの末尾に「.log」を付与するようにソースを修正して動かしています。

私のだと汎用性がないため、KAZさんの修正版を待ちます。

ユーザー KAZ の写真

sgymさん

以下の3種類でデータが取れる事を確認しました。
<code>
[root@pits131 zabbix]# ls -l /var/log/httpd/
合計 140
-rw-r--r-- 1 root root 42492 7月 13 18:52 20100713_access.log
-rw-r--r-- 1 root root 42492 7月 13 18:52 access.log_20100713
-rw-r--r-- 1 root root 42492 7月 13 18:52 access_20100713.log
-rw-r--r-- 1 root root 4717 7月 13 18:33 error_log_20100713
</code>

修正箇所はwhileループの「pl = pr + var_len;」と「pr = strchr(pl, '{');」間に「filename_today = zbx_strdcat(filename_today, pl);」または「filename_yesterday = zbx_strdcat(filename_yesterday, pl);」を加えました。

<code>
diff -Nur zabbix-1.6.9.org/src/zabbix_agent/logfiles.c zabbix-1.6.9/src/zabbix_agent/logfiles.c
--- zabbix-1.6.9.org/src/zabbix_agent/logfiles.c 2010-03-25 23:53:20.000000000 +0900
+++ zabbix-1.6.9/src/zabbix_agent/logfiles.c 2010-07-13 17:29:15.000000000 +0900
@@ -22,6 +22,8 @@
#include "log.h"
#include "logfiles.h"

+#define MVAR_YYYYMMDD "{YYYYMMDD}"
+
/******************************************************************************
* *
* Function: process_log *
@@ -49,51 +51,109 @@
char **value
)
{
+ struct stat buf_today,
+ buf_yesterday;
+ struct tm *tm;
+ time_t now;
FILE *f = NULL;
- struct stat buf;
- int ret = FAIL;
+ char *pl,
+ *pr = NULL,
+ *filename_today = NULL,
+ *filename_yesterday = NULL,
+ *currentfilename = NULL,
+ *replace_to = NULL;
+ int ret = FAIL,
+ var_len;

assert(filename);
assert(lastlogsize);
assert(value);

- zabbix_log( LOG_LEVEL_DEBUG, "In process log (%s,%li)",
- filename,
- *lastlogsize);
+ zabbix_log( LOG_LEVEL_DEBUG, "In process log (%s,%li)", filename, *lastlogsize);

- /* Handling of file shrinking */
- if( 0 != stat(filename,&buf) )
- {
- zabbix_log( LOG_LEVEL_WARNING, "Cannot open [%s] [%s]", filename, strerror(errno));
- }
- else
- {
- if(buf.st_size<*lastlogsize)
- {
- *lastlogsize=0;
+ if (NULL != strchr(filename, '{')){
+
+ filename_today = zbx_strdcat(filename_today, filename);
+ pl = filename_today;
+ pr = strchr(pl, '{');
+ while(NULL != pr){
+ var_len = 1;
+ if (0 == strncmp(pr, MVAR_YYYYMMDD, strlen(MVAR_YYYYMMDD))){
+ var_len = strlen(MVAR_YYYYMMDD);
+ now = time(NULL);
+ tm = localtime(&now);
+ replace_to = zbx_dsprintf(replace_to, "%.4d%.2d%.2d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
+ pr[0] = '\0';
+ }
+ filename_today = zbx_strdcat(filename_today, replace_to);
+ zbx_free(replace_to);
+ pl = pr + var_len;
+ filename_today = zbx_strdcat(filename_today, pl);
+ pr = strchr(pl, '{');
}

- if(NULL == (f = fopen(filename,"r") ))
- {
- zabbix_log( LOG_LEVEL_WARNING, "Cannot open [%s] [%s]", filename, strerror(errno));
+
+ filename_yesterday = zbx_strdcat(filename_yesterday, filename);
+ pl = filename_yesterday;
+ pr = strchr(pl, '{');
+ while(NULL != pr){
+ var_len = 1;
+ if (0 == strncmp(pr, MVAR_YYYYMMDD, strlen(MVAR_YYYYMMDD))){
+ var_len = strlen(MVAR_YYYYMMDD);
+ now = time(NULL) - 86400;
+ tm = localtime(&now);
+ replace_to = zbx_dsprintf(replace_to, "%.4d%.2d%.2d", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday);
+ pr[0] = '\0';
+ }
+ filename_yesterday = zbx_strdcat(filename_yesterday, replace_to);
+ zbx_free(replace_to);
+ pl = pr + var_len;
+ filename_yesterday = zbx_strdcat(filename_yesterday, pl);
+ pr = strchr(pl, '{');
}
- else
- {
- if(-1 == fseek(f,*lastlogsize,SEEK_SET))
- {
- zabbix_log( LOG_LEVEL_WARNING, "Cannot set postition to [%li] for [%s] [%s]", *lastlogsize, filename, strerror(errno));
+ }
+
+
+ /* Handling of file shrinking */
+ if(0 != stat(filename_today,&buf_today)){
+ zabbix_log( LOG_LEVEL_WARNING, "Cannot open [%s] [%s]", filename_today, strerror(errno));
+ }else{
+ if(buf_today.st_size<*lastlogsize){
+ *lastlogsize=0;
+ if('\0' == *filename_yesterday){
+ *lastlogsize=0;
+ currentfilename = filename_today;
+ }else{
+ /* check second file if in loglotate mode. */
+ if(0 != stat(filename_yesterday,&buf_yesterday)){
+ zabbix_log( LOG_LEVEL_WARNING, "Cannot open [%s] [%s]", filename_yesterday, strerror(errno));
+ *lastlogsize=0;
+ currentfilename = filename_today;
+ }else{
+ if(buf_yesterday.st_size<=*lastlogsize){
+ *lastlogsize=0;
+ currentfilename = filename_today;
+ }else{
+ currentfilename = filename_yesterday;
+ }
+ }
}
- else
- {
+ }else{
+ currentfilename = filename_today;
+ }
+
+ if(NULL == (f = fopen(currentfilename,"r") )){
+ zabbix_log( LOG_LEVEL_WARNING, "Cannot open [%s] [%s]", currentfilename, strerror(errno));
+ }else{
+ if(-1 == fseek(f,*lastlogsize,SEEK_SET)){
+ zabbix_log(LOG_LEVEL_WARNING, "Cannot set postition to [%li] for [%s] [%s]", *lastlogsize, currentfilename, strerror(errno));
+ }else{
*value = zbx_malloc(*value, MAX_BUF_LEN);

- if (NULL == fgets(*value, MAX_BUF_LEN, f))
- {
+ if (NULL == fgets(*value, MAX_BUF_LEN, f)){
/* EOF */
zbx_free(*value);
- }
- else
- {
+ }else{
*lastlogsize = ftell(f);
zbx_rtrim(*value, "\r\n");
}
@@ -102,6 +162,8 @@
zbx_fclose(f);
}
}
+ zbx_free(filename_today);
+ zbx_free(filename_yesterday);

return ret;
}
</code>

もはや、パッチよりlogfiles.cを差替えた方が分かりやすいレベルですね…A(^^;

ユーザー sgym の写真

KAZ様

返事が遅くなりました。
お忙しい中、修正していただきどうもありがとうございました。