ログ出力クラス

題名のまま。警報システムを作るのなら、結構、規模の大きなプログラムになる。それなら、ログも簡単に出力できるようにせねばなぁ。
wsprintfしてから、MessageBoxやfprintfしてもいいんだけど、毎回それをするのもだるいし。

と、いうわけで、sprintfとfprintfをラッパするクラスを作った。クラスで作っておけば、どのソースコードからでも、#includeするだけで実装できるのがいいと思った。会社のログ管理を思い出し実装した。


ソースコードは、
Logger.cpp
Logger.h

具体的には、

Logger* pLog = new Logger("aho");//[この引数の名前].logをログファイルとする.
pLog->start(__FILE__);//矢印階層を深くする。(後で説明)
char* sz = (char*)malloc(50 * sizeof( char ) );
sprintf(sz,"%s", abcdefg);
pLog->write("%s",sz);//writeは普通のログ
pLog->write("data=[%d]\n",10);//printfみたいなことができる。
pLog->exception("%s","えらいこっちゃ");//例外があったらわかりやすい
pLog->write("ss");
pLog->end();//こうすると、矢印階層を浅くする。(後で説明)
delete pLog;//メモリリークに注意しよう

こうすると、実行結果は、aho.logファイルが作成され、中身は

[2006/ 1/25 水  0:30:41.234]    1>【C:\home\Programming\vc\ログ出力クラス\ログ出力クラス.cpp】開始!
[2006/ 1/25 水  0:30:41.234]    2->abcdefg
[2006/ 1/25 水  0:30:41.234]    3->data=[10]

[2006/ 1/25 水  0:30:41.234]    4-><>えらいこっちゃ
[2006/ 1/25 水  0:30:41.234]    5->ss
[2006/ 1/25 水  0:30:41.234]    6>【C:\home\Programming\vc\ログ出力クラス\ログ出力クラス.cpp】終了!

とこんな具合になる。

ファイル名は、ソースコードを読めばわかるが、あえて、クラスの中のコンストラクタの中にprivateで直打ちにした。setterを用意したかったしてもいいと思うけど、これって動的に変更するもんでもないと個人的に思うので。

ログファイルは複数個(自由に指定できるがデフォルトでは3個)バックアップできる。あんまり多くなるとデータ量が膨大になるため、ログファイルが1万個(これも自由に指定できる)を越えると、[名前]1.logというファイルを作成してバックアップを取る。【名前】3.logまで。
【名前】.logを入れると4万個までのログデータが保存できる。それを越えると、一番古い【名前】3.logは廃棄される。削除や移動にはWin32APIを(めんどくさかったので)実装したので、Linuxではシステムコールを変更する必要がある。具体的には、コピーには、system("mv"); や$system("cp"); 削除には、$system("rm");が必要になってくる。システムコールが嫌なら、Cの中で実装してしまえばよい。これはそんなに大変な作業ではない。(けど、めんどくさい)