以下は開発中の備忘録(メモ)を兼ねた,作業記録メモです。 興味を持って頂けるようでしたら,お読み下さい。
この資料は作成中です。今後も少しずつ追記します。
Yoshi's Software Factory
以下は開発中の備忘録(メモ)を兼ねた,作業記録メモです。 興味を持って頂けるようでしたら,お読み下さい。
この資料は作成中です。今後も少しずつ追記します。
最初に検討したのは,ログファイルの更新を検出するための機構です。 この目的に使えそうな機能として,.Net/CLRではFileSystemWatcher クラスがありますので,実装ではこれを使用することにします。
FileSystemWatcherの詳細については,MSDN等の資料を参照して 下さい。このクラスでファイル更新を監視する方法は複数ありますが,今回の実装 では次のような手順を採用しました。
コードは以下のようになります。
FileSystemWatcher fsWatcher_ = new FileSystemWatcher(directoryPath, filePattern);
fsWatcher_.Changed += new FileSystemEventHandler(onFileChange);
fsWatcher_.NotifyFilter = NotifyFilters.LastWrite;
ファイル監視の開始・終了は,FileSystemWatcherインスタンスの プロパティEnableRaisingEventsの値を変更することで操作できます。
以上の処理を実装して,ファイル検出を行うクラスを作成しました。
class FileChecker : IDisposable {
private FileSystemWatcher fsWatcher_;
internal FileCheckerImpl(string directoryPath, string filePattern) {
this.fsWatcher_ = new FileSystemWatcher(directoryPath, filePattern);
this.fsWatcher_.Changed += new FileSystemEventHandler(onFileChange);
this.fsWatcher_.NotifyFilter = NotifyFilters.LastWrite;
}
public override void Dispose() {
this.fsWatcher_.EnableRaisingEvents = false;
this.fsWatcher_.Dispose();
this.fsWatcher_ = null;
}
public override bool Monitor {
get { return this.fsWatcher_.EnableRaisingEvents; }
set { this.fsWatcher_.EnableRaisingEvents = value; }
}
}
更新を検出したファイルの情報(ファイルパス名と読み込みオフセット値)を引数として, ログファイルの読み込みを行います。この処理を実行するクラスLogFileReaderを 作成しました。
LogFileReaderインスタンスには,前記のファイル情報に加えて,イベントログ 出力行を選択するクラスLogDataFilterのリストを保持します。ファイルから順次読み 込まれた内容はこのフィルタに渡され,イベントログ書き込み対象であるかを判定(フィルタ)さ れた後に,所定のイベントログエントリに記入されます。
LogDataFilterの実態は,以下のような簡単なメソッドを定義したインターフェース です。
/// <summary>
/// イベントハンドラ管理を実装した抽象クラス
/// </summary>
public abstract class AbstractLogDataFilter : LogDataFilter {
protected FilterHandler filterHandler_;
public AbstractLogDataFilter(FilterHandler handler) {
this.filterHandler_ = handler;
}
public abstract bool DoFilter(string filename, string lineData);
}
このインターフェースを実装するクラスとして,以下の3つを実装しました。
各クラスの実装コードをリストに示します。
/// <summary>
/// イベントハンドラ管理を実装した抽象クラス
/// </summary>
public abstract class AbstractLogDataFilter : LogDataFilter {
protected FilterHandler filterHandler_;
public AbstractLogDataFilter(FilterHandler handler) {
this.filterHandler_ = handler;
}
public abstract bool DoFilter(string filename, string lineData);
}
/// <summary>
/// 正規表現による行選択を実装したフィルタクラス
/// </summary>
public class RegExLogDataFilter : AbstractLogDataFilter {
private Regex dataRegEx_;
public RegExLogDataFilter(string pattern, FilterHandler handler) : base(handler) {
this.dataRegEx_ = new Regex(pattern);
}
public override bool DoFilter(string fileName, string lineData) {
Match m = this.dataRegEx_.Match(lineData);
if(m != null && m.Success) {
this.filterHandler_(fileName, lineData);
return true;
} else {
return false;
}
}
}
/// <summary>
/// 固定文字列によるパターンマッチ処理を実装したフィルタクラス
/// </summary>
public class FixStrLogDataFilter : AbstractLogDataFilter {
private string pattern_;
public FixStrLogDataFilter(string pattern, FilterHandler handler) : base(handler) {
this.pattern_ = pattern;
}
public override bool DoFilter(string fileName, string lineData) {
if(lineData != null && lineData.Contains(this.pattern_)) {
this.filterHandler_(fileName, lineData);
return true;
} else {
return false;
}
}
}