1

Windows2008R2ボックスにConfluence3.5サイトをセットアップしています。Tomcat 6を使用しており、log4jを使用して特定のスペースのアクセスロギングを実行するように構成しました。ロギングは正常に機能しますが、今度は.NETでWindowsサービスを作成して、ログデータの特定の解析を毎日実行したいと思います。私のサービスでは、File.ReadAllTextを使用してファイル全体を読み取りました(ファイル自体は大きくなく、XMLでもありません)。しかし、それを実行しようとすると、ファイルが別のプロセスによって使用されていることを示すIO例外が発生します。

これを回避するためにさまざまなことを試みましたが、これまでのところ、コードからログファイルを読み取ることができないようです。サーバーにログインし、Windowsエクスプローラーを使用してサーバーのコピーを作成できます。しかし、サービスでそれを行おうとすると、同じエラーが発生します。ログファイルを読み取る方法や、ファイルを排他的に開かないようにロガーを変更する方法をWebで調べましたが、何も見つかりませんでした。そもそもファイルを開くのがConfluence、Tomcat、log4jのいずれであるかはわかりません。

カスタムプログラムを使用してアクセスログから読み取る方法に関する提案はありますか?

4

2 に答える 2

2

ロガーは、パフォーマンス上の理由でファイルをロックしている可能性があります(たとえば、ファイルを常に開く必要はありません)。これを確認するには、サーバーにログインし、UnlockerProcessExplorerのいずれかを使用してファイルで開いているハンドルを確認します。

ロガーがロックを保持しないように構成できるはずです。私はこれまでlog4jを使用したことがありませんが、マニュアル/Webサイトを確認してください。何かできることがあります。

于 2011-08-26T21:19:28.510 に答える
1

FileShare.ReadWriteを使用してC#でFileStream(String、FileMode、FileAccess、FileShare)開くことができます。

FileStream logFileStream = new FileStream("C:\path\to\file.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader logFileReader = new StreamReader(logFileStream);

これにより、ファイルストリームがそのファイルのロックを取得しようとするのを防ぎ、例外がスローされないようにする必要があります。

FileShare列挙型パラメーターなしでCTORを使用する場合、ストリームは読み取り専用にデフォルトでファイルを共有します。

FileShare.Readは、FileShareパラメーターのないFileStreamコンストラクターのデフォルトです。(備考を参照

于 2013-09-04T12:40:01.913 に答える