今日のIISログファイルでLogParserを実行し、SQLServerデータベーステーブルに挿入する作業用Webサーバーで15分ごとに実行するようにスケジュールされたタスクを設定したいと思います。
重複するデータをコピーしないようにすると同時に、すべてのレコードがコピーされていることを確認するにはどうすればよいですか?
また、SELECT * FROM ex*.log
などの高価なクエリを実行したり、日付と時刻の条件を使用したりせずに、LogParserに今日のログファイルを常に表示させるにはどうすればよいですか?
私がこれまで遊んできたのは:
SELECT *
FROM \\Path\To\Logs\ex*.log
WHERE date = SYSTEM_DATE()
AND time > SUB(SYSTEM_TIME(), TO_TIMESTAMP('00:30', 'hh:mm'))
ただし、これを30分ごとに実行すると、エントリが重複する可能性があります。また、何らかの理由で機能しなかった場合は、データが欠落することになり、毎朝前日のファイル全体を上書きするだけでデータを削除できます。
任意のヒント?
'-iCheckPoint'スイッチをチェックしましたか?最後の実行のタイムスタンプを保存し、後続のレコードにのみアクセスします。
遊んだ後、私は実際に自分の質問の一部に答えることができます。
今日のIISログだけを見ることができるコードは次のとおりです。
SELECT *
FROM \\Path\To\Logs\ex%date:~8,2%%date:~3,2%%date:~0,2%.log
それが英国の標準ではない日付で機能するかどうかはわかりませんが、これは私にとっては機能します。上記のコードは、2011年2月24日である今日の日付に対してこれを生成します。
SELECT *
FROM \\Path\To\Logs\ex110224.log
SQLサーバーテーブルのRecordNumber列にPRIMARYKEYを作成するだけでこの問題を克服しました。これにより、重複を防ぐことができました。
また、クラスター環境では、(ComputerName、RecordNumber)に複合PRIMARY KEYを作成することでこれを克服しました。これは、私の環境では常に一意の組み合わせであったため、非常にうまく機能しました。
LOG PARSERで重複ログ解析を意図的にテストすると、LOGPARSER画面自体に「主キー違反」という予期されるエラーが表示されました。問題は解決しました。