C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: Logファイルの解析について


(過去ログ 54 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■30519 / inTopicNo.1)  Logファイルの解析について
  
□投稿者/ マサル (1回)-(2008/12/25(Thu) 15:46:11)

分類:[.NET 全般] 

こんにちわ。
現在、ログファイルを解析し、その最新情報を表示するソフトを作成しております。
ログファイルはlog4netではき出したテキストみたいなのを思って貰えればいいと思います。
上から順に古く、下に追記していくので下にあるものが新しいです。

流れ的には
・別アプリがログを随時更新している→自アプリで10秒ごとにそのログを読み込み、項目ごとに最新の内容だけを表示する
という繰り返しになります。

レベル/項目/内容 
INFO 告知事項A [○○○○○○○]が発生しました
INFO 告知事項B [×××××××××]が発生しました
INFO 告知事項A [□□□□□□□□]が発生しました
ERROR 緊急事項A [○○○○○○○]が発生しました
INFO 告知事項B [○○○○○○○]が発生しました
ERROR 緊急事項A [○○○○○○○]が発生しました

それで、この中からINFOのみを抽出し、且つその項目ごとに最新の情報の[]内のみを表示するというのが作りたい物です。
例えば上のログの場合、望む結果は

告知事項A :□□□□□□□□
告知事項B:○○○○○○○

です。
INFOのみを抽出するのは、ヘッダ部というかその行頭に「INFO」という文字列が含まれているかどうか見ればいいだけなのでいいんですが
後はその最新だけ取得する方法です。
いくつか手法は考えたんですが、効率的な方法ではないような気がしています。
例えば告知事項分の変数なりを作っておき、上から順に読んでいってマッチすれば上書きしていくという物です。

全行読み終わるまでループ{
 if(”告知事項A” という文字列が取得した行に含まれていたら){
  strKokutiA = その行から[]に囲まれた部分だけを切り取って代入
 }
 if(”告知事項B” という文字列が取得した行に含まれていたら){
  strKokutiB = その行から[]に囲まれた部分だけを切り取って代入
 }


というような感じです。
上から順に全て読み取っていけば、最終的に変数strKokutiAとBには、一番新しい内容が上書き上書きで入っているという考え方です。

ログの方も随時更新されていますし、ログが小さい分には別にたいした処理でもないのでいいんですが
ログが大きくなると、10秒ごとにそのでかいファイルを読み込んで、上から全部1行ずつチェックして
というのを繰り返すことになるので、もっと効率良く処理出来ないものかと悩んでいます。

引用返信 編集キー/
■30521 / inTopicNo.2)  Re[1]: Logファイルの解析について
□投稿者/ .SHO (519回)-(2008/12/25(Thu) 15:54:53)
No30519 (マサル さん) に返信

Seek すればいいのでは?
引用返信 編集キー/
■30522 / inTopicNo.3)  Re[2]: Logファイルの解析について
□投稿者/ .SHO (520回)-(2008/12/25(Thu) 16:05:38)
> ■No30519 (マサル さん) に返信

っていうか、常駐したまま10秒に1回見るなら、ファイルをクローズせずに
行が追加されるまでEOFを検知してれば、何もしなくていいような。

引用返信 編集キー/
■30524 / inTopicNo.4)  Re[3]: Logファイルの解析について
□投稿者/ マサル (2回)-(2008/12/25(Thu) 17:14:18)
No30522 (.SHO さん) に返信
>>■No30519 (マサル さん) に返信
>
> っていうか、常駐したまま10秒に1回見るなら、ファイルをクローズせずに
> 行が追加されるまでEOFを検知してれば、何もしなくていいような。
すいません、ちょっと具体的にどうなのかがわからないんですが
closeせずに開きっぱなしで、更に常時別アプリからの書き込みを検知するって事なんでしょうか?

まず既に別アプリが生成してあるログファイルを読み込んで、その時点での最終行までいきますよね?
そこでファイルを閉じずに、そのままstreamを放置しておくって事でしょうか?
その開いたままの状態で、また別アプリがログを追記した場合
自アプリで開いてる方には反映されるんですかね?
引用返信 編集キー/
■30525 / inTopicNo.5)  Re[4]: Logファイルの解析について
□投稿者/ .SHO (521回)-(2008/12/25(Thu) 17:17:40)
No30524 (マサル さん) に返信

> 自アプリで開いてる方には反映されるんですかね?

やってみればいい。
引用返信 編集キー/
■30526 / inTopicNo.6)  Re[4]: Logファイルの解析について
□投稿者/ Jitta (566回)-(2008/12/25(Thu) 18:24:42)
No30524 (マサル さん) に返信
> ■No30522 (.SHO さん) に返信
> >>■No30519 (マサル さん) に返信
>>
>>っていうか、常駐したまま10秒に1回見るなら、ファイルをクローズせずに
>>行が追加されるまでEOFを検知してれば、何もしなくていいような。
> すいません、ちょっと具体的にどうなのかがわからないんですが
> closeせずに開きっぱなしで、更に常時別アプリからの書き込みを検知するって事なんでしょうか?
>
> まず既に別アプリが生成してあるログファイルを読み込んで、その時点での最終行までいきますよね?
> そこでファイルを閉じずに、そのままstreamを放置しておくって事でしょうか?
> その開いたままの状態で、また別アプリがログを追記した場合
> 自アプリで開いてる方には反映されるんですかね?

seek に、終わりまで飛ぶってのがあるので、それを利用する。
書く方は、読み取り共有で書き込む。書いたら閉じる。このとき、バッファリングの途中で書き出さないように設定する(って、そんな設定あったっけ?)。
読む方は、開いたまま。現在位置からファイルの最後までを読み取って、その中から検索する。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -