umejanのブログスマートフォン用の表示で見るumejanのブログこの広告は、90日以上更新していないブログに表示しています。マルチスレッド下での動作となるので同期処理(排他)が必要。VBScriptでは、プロセス間も含めてスレッド間の同期方法がない。SleepしてWaitすることも難しい。WScript.Shell経由でSleepするコマンドを実行する手段がないこともないが、ログ出力時のWaitには合わないし重い。そもそもSleepしてリトライはさせたくない。いうことで、VBScript単体で実装する場合は、出力対象のログファイルが使用中なら予備のログファイルに出力する方法くらいか。Function上記ではファイルオープン時にエラーが発生した場合、ファイル名を変えてオープンを試みている。20回も回しているが、ここまで切り替えが発生することはないだろう。このログ出力関数を使う場合は、1サイトにつき1つのログファイルに出力するのでなく、ASPページ毎のログファイルに出力するなどの細かい単位で出力したほうがよい。一応、実際のASPファイルに組み込んで、JMeterを使って負荷をかけたが問題なさそうではあった。ノートPC上の仮想環境でテストしたのでどこまで信用できるか怪しいが。GetTimestamp関数について補足。1秒よりも細かい精度の時刻が欲しかったので、VBScriptのTimer関数を利用してミリ秒の出力を行っている。精度としては10ミリ秒程度とのことらしい。.NetFramework(C#)のCOM相互運用機能を使ってログ出力COMと言えば.NetでないVBで実装していたが、現在ではもう使えないので.Netを使う。.Netであれば、スレッド間の同期が可能なのでログ出力するのに悩まずにすむ。.NetでCOMを実装するポイントは以下のとおり。クラスライブラリでプロジェクト作成。プロジェクトのプロパティ→アプリケーションタブ→アセンブリ情報→「アセンブリをCOM参照可能にする」にチェック。プロジェクトのプロパティ→ビルドタブ→「COM相互運用機能の登録」にチェック。プロジェクトのプロパティ→ビルドタブ→プラットフォームターゲットをx86に変更。インタフェースを用意して、インタフェース用のGUIDを割り当てる。クラスにはProgIdを設定する。クラス用のGUIDを割り当てる。インタフェースをデフォルトインタフェースにするため、ClassInterface(ClassInterfaceType.None)を指定する。/codebase」。「/codebase」はGACに登録しない場合は必須。/unregister」。}}補足ログファイルは別スレッドにて10秒間書き込みがなければCloseするようにした。IISでこのように勝手にスレッドを作るのは作法的によくないかもしれない。ストリームをOpenしっぱなしにするか、書き込みごとにOpen、Closeするのが無難だろう。ファイル出力の同期については、ファイルごとにstaticオブジェクトを割り当てそれをlockステートメントで排他制御を行っている。ストリームをOpenしたままにするのであれば、TextWriter.Synchronizedが利用できるらしい。その場合はTextWriterをstaticにする必要がある。LTS)月別アーカイブはてなブログをはじめよう!umejanさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。