1.4系でのログローテート監視について

いつもお世話になっております。

ローテートするログの監視について質問です。
ログローテートへの対応は1.8からの機能であること、また1.6.6ではパッチを利用してログ監視アイテムのファイル名に{YYYYMMDD}を使用できるとのことですが、現在私はZABBIX 1.4.6を使用しています。

この環境でログローテートの監視をするには、バージョンを1.6か1.8にあげるしかないでしょうか。

ご返答よろしくお願いします。

コメント表示オプション

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

KAOさん

1.4系ではかなり厳しいですね、しかたなく1.6系で自作したパッチなので…
注)1.6のパッチはZABBIX-JPや本家の正式パッチではないです。念の為

私が1.4で運用していた時はシンボリックリンクを張り替えて対応していたりしました。

1.6系のパッチは未検証ですが、ロジック自体は1.4系でも使えると思います。必要でしたら1.4.6でパッチ作りますけどいりますか?
※:検証環境が今手元にないので時間がかかってしまいそうです。

ユーザー KAO の写真

KAZさん

ご返答ありがとうございます。

ログローテートに対応していないのであれば、バージョンアップも考えているのですが、バージョンを上げると今までの設定も全て飛んでしまうのでしょうか?

バージョンをあげることによって、設定が飛ぶようであればバージョンアップをせずに、このままの環境で使用したいので、お手数をおかけして申し訳ないのですが、パッチの作成をお願いしたいです。

よろしくお願いします。

ユーザー KAZ の写真

KAOさん

私が1.4系から1.6系にアップした時は設定は全部引き継がれました。只、全ての機能を使ってないので確約はできませんが…

■アップグレードについて
1.8系は未だお勧めし辛いです。
1.8.3で現在修正される問題が130以上あります。(※1)
また、まだ増えそうな勢いです。
現在未解決な不具合も1.8.4に持ち越されるものもあるかと思います。

なので、今アップされるなら1.6.9をお勧めします。

只、1.8系だとバグがあっても本家に報告すれば対応が早いと言う利点があります。1.6系は旧バージョンと言う事もあって対応は後回しにされてしまいがちです。(最悪対応なかったりします。)

■パッチについて
パッチ作成自体は大した作業じゃないので気にしないで下さい。
どちらかと言うと、1.4.6環境を作る方が大変ですね…

■その他
※1:2010.06.03 18時現在 ZABBIX SUPPORTで下記のキーワードで検索しました。

[url=https://support.zabbix.com/]Dashboard - ZABBIX SUPPORT[/url]

1)Project
 ZABBIX BUGS AND ISSUES
2)Issue Type
 Bug
3)Fix For
 1.8.3
4)Status
 Closed
5)Resolutions
 Fixed

ユーザー KAO の写真

KAZさん

ご返答ありがとうございます。

1.8系はまだ安定稼動してないのですね。
バージョンアップはもうしばらく検討したいと思います。

お手数かけますが、1.4.6環境でのパッチの作成お願いできますでしょうか。

よろしくお願いします。

ユーザー KAZ の写真

KAOさん

1.4.6と1.6.6のそうースはほとんど違いがありませんでした。(笑)
一応、{YYYYMMDD}使って値が取れること確認しました。

■確認した環境とか…
<code>
1)環境  :CentOS5.5
2)事前作業:「chmod go+rx /var/log/httpd」で読み取り件追加
3)ログ  :apacheのログを年月日付きで出力して、それを取得させてみました。
      /var/log/httpd/access_log.20100604
      /var/log/httpd/error_log.20100604
4)アイテム:log[/var/log/httpd/access_log.{YYYYMMDD}
      log[/var/log/httpd/error_log.{YYYYMMDD}
</code>

パッチはメールで送った方が良いですか?
その場合は、私のプロフィールに連絡先を載せてますのでお手数ですがメール下さい。

1.4.6-1を使用されている場合は、SRPMを取得してspecファイルを修正してrpmbuildを実行してrpmを作りインストールするのが簡単だと[d]もいます[/d]思います。
ZABBIX-JPのSRPMのrpmbuildについて質問がある場合はお手数ですが、別スレでお願い致します。m(__)m

↓下記がパッチです。
<code>
diff -Nur zabbix-1.4.6.org/src/zabbix_agent/logfiles.c zabbix-1.4.6/src/zabbix_agent/logfiles.c
--- zabbix-1.4.6.org/src/zabbix_agent/logfiles.c 2008-07-23 20:47:30.000000000 +0900
+++ zabbix-1.4.6/src/zabbix_agent/logfiles.c 2010-06-04 15:48:24.000000000 +0900
@@ -22,6 +22,8 @@
#include "log.h"
#include "logfiles.h"

+#define MVAR_YYYYMMDD "{YYYYMMDD}"
+
/******************************************************************************
* *
* Function: process_log *
@@ -49,9 +51,19 @@
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);
@@ -59,40 +71,84 @@

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);
- memset(*value, 0, MAX_BUF_LEN);

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

return ret;
}
</code>

ユーザー KAO の写真

KAZさん

パッチをメールでほしいのですが、プロフィールを見てもメールアドレスが記載されていないようなのですが・・・

PMをクリックするとメールフォームが出てきますが、こちらから送ればよろしいのでしょうか?

初歩的な質問で申し訳ありません。。

ユーザー KAZ の写真

KAOさん

パッチをメールでほしいのですが、プロフィールを見てもメールアドレスが記載されていないようなのですが・・・

ログインされてます?
ログインしないとメールアドレスは表示されないかと…

ユーザー KAO の写真

KAZさん
 
ログインした状態ですが、メールアドレスが見当たりません。
kodaiさんのアドレスは見れるのですが・・・

ユーザー KAZ の写真

KAOさん

すいません。
私の設定が間違ってました。m(__)m
今なら見えるはずです。

私はログインすれば見えてたのですが、公開しないとメールアドレスは他の人からは見えないみたいですね。A(^^;

ユーザー KAO の写真

KAZさん

メールアドレス見れました。
ありがとうございました。