🛠️

C言語のログ(logging:ロギング)処理(5)

1 min read

log4x みたいなファイルサイズ定量で世代管理

現状、application001.log みたいにファイル名内に1から始まるファイル名にしていた。
application001.log が定義したファイルサイズを超えた場合、application001.log は、そのままにして次のログをapplication002.log に出力するというパターン
ファイルの世代が最大数に達したら また、application001.log に戻るというもの。

application001.log
application002.log
application003.log ← 最新のログはこのファイルに出力

log4xなどは、最新のログを application.log に常に出力して、定義したファイルサイズを超えた場合、application.log のファイル名の拡張子前に .1 を付加した application.1.log にリネームして最新のログは、application.logファイルに出力する。を繰り返す。

通常はこれに最新のログを出力
application.log

定義したファイルサイズを超えた場合にファイル名を .1 にリネーム
application.log
application.log.1

そして再度定義したファイルサイズを超えた場合にファイル名を .1 .2 にスライドしながらリネーム
application.log
application.log.1
application.log.2

こうした方が、最新のログは常に application.log とわかるので、運用面からするとこちらのほうが良いのだなぁと思う。

プログラミング

とりあえず、application.log が定義したファイルサイズを超えた場合に世代管理をする動作をするプログラムを書きました。

	char	fileNameNew[2048];	// ログファイル名(リネーム後)
	int	cnt = 0;

	memset(fileName, 0x0, sizeof(fileName));
	memset(fileNameNew, 0x0, sizeof(fileNameNew));
	for(cnt = (999 - 1); cnt >= 0; cnt--){
		if(cnt == 0){
			sprintf(fileName, "%s/%s.log", gIniValLog.logFilePathName, LOG_FILE_NAME);
		}
		else{
			sprintf(fileName, "%s/%s.log.%d", gIniValLog.logFilePathName, LOG_FILE_NAME, cnt);
		}
		sprintf(fileNameNew, "%s/%s.log.%d", gIniValLog.logFilePathName, LOG_FILE_NAME, cnt + 1);
		ret = stat(fileName, &stStat);
		if(ret != 0){
			// ファイルが存在しない場合、処理なし
		}
		else{
			if(cnt == (999 - 1)){
				ret = remove(fileNameNew);
				if(ret == -1){
					// エラーの場合の処理をする
				}
			}
			// ファイルが存在する場合
			ret = rename(fileName, fileNameNew);
			if(ret == -1){
				// エラーの場合の処理をする
			}
		}
	}

Discussion

ログインするとコメントできます