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

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

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

メモ帳でログを編集したい

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

■95497 / inTopicNo.1)  メモ帳でログを編集したい
  
□投稿者/ OA (7回)-(2020/08/08(Sat) 11:36:07)

分類:[.NET 全般] 

環境:VB2019、.Net4.7.2、Windowsフォームアプリケーション

ApplicationEvents.vb内でUnhandledExceptionイベントを以下のように実装しました。
イベント内でログをメモ帳で開いて、編集後、上書き保存しようとすると
「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」
とメモ帳に怒られ、上書き保存できません。どうすれば、上書き保存できるでしょうか?
個人で使うアプリなので、自アプリから、お手軽に「ログの閲覧と定期的な削除」を行う事が目的です。

Partial Friend Class MyApplication
        Private Sub MyApplication_UnhandledException(sender As Object, e As UnhandledExceptionEventArgs) Handles Me.UnhandledException
            'アプリを終了しない
            e.ExitApplication = False
            Dim msg = $"■{DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}{vbTab}{e.Exception.Message}"
            My.Application.Log.WriteException(e.Exception, TraceEventType.Error, msg)
            My.Application.Log.DefaultFileLogWriter.Flush()
            If MsgBox("想定外の例外が発生しました。ログを開きますか?", MsgBoxStyle.OkCancel) = MsgBoxResult.Ok Then
                ' メモ帳でログファイルを開く
                Dim path = My.Application.Log.DefaultFileLogWriter.FullLogFileName
                Process.Start("notepad.exe", path)
            End If
        End Sub
    End Class


引用返信 編集キー/
■95498 / inTopicNo.2)  Re[1]: メモ帳でログを編集したい
□投稿者/ 魔界の仮面弁士 (2801回)-(2020/08/08(Sat) 12:49:14)
No95497 (OA さん) に返信
> イベント内でログをメモ帳で開いて、編集後、上書き保存しようとすると
> 「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」

ログをメモ帳で「閲覧」するのではなく、編集・上書きが必要ということでしょうか。
プログラムから出力させるログを、同時にメモ帳で改竄しようとする目的は何でしょうか?
(それとも、VB のプログラムを終了した後で、メモ帳で開いて書き込みを行おうとしている?)

ファイルをロックせず、アプリとメモ帳で同時に書き込めるようにするとなると、
ログの出力処理の方では、他で開かれていた場合に備えて、同時アクセス制御の問題に
対処するための待ち合わせやキューイングなどの手間、データ改変にともなう
書き込み開始位置の調整などを考慮する必要が生じて、処理が複雑化するのではないでしょうか。


> 個人で使うアプリなので、自アプリから、お手軽に「ログの閲覧と定期的な削除」を行う事が目的です。

閲覧・記録・削除はそれぞれ別の動作なので、分けて管理した方が良いでしょう。

今回、My.Application.Log を使っておられるようなので、
LogFileCreationSchedule なり BaseFileName なりでファイル名を変えて記録しておき、
タスクスケジューラーで古いファイルを削除するようにしてはどうでしょう。
https://dobon.net/vb/dotnet/programing/myapplicationlog.html


あるいは、FileLogTraceListener ではなく EventLogTraceListener を使うことも
考慮してみてください。イベントログであれば、閲覧時に出力結果の絞り込みができますし、
最大ログサイズや最大値に達したときの動作なども制御できるので、扱いやすいかと思います。
Windows のイベント ビューアーを使わせず、より軽量であるメモ帳で「閲覧」させることを好むなら、
wevtutil 等でテキスト化してから notepad に渡すという選択肢もあろうかと思います。
引用返信 編集キー/
■95503 / inTopicNo.3)  Re[2]: メモ帳でログを編集したい
□投稿者/ OA (8回)-(2020/08/08(Sat) 14:59:03)
No95498 (魔界の仮面弁士 さん) に返信

魔界の仮面弁士様、返信、ありがとうございます。


My.Application.Logを使う場合、自アプリがログファイルをロックするというのは、仕様ということでいいんですよね?故に、アプリ起動中はログファイルの編集はできない。
誤認識してるなら、ご指摘下さい。

ログの編集は日々、肥大化するログの軽量化、可読性の為、古いログを削除するのが目的です。
想定外エラーが発生した時に、アプリを終了せずに、メモ帳でログを閲覧して、見にくいと感じたらその場で、古いログを削除=>上書き保存できたら楽かなとシロウト考えです。

提示くださった、LogFileCreationScheduleでLogFileCreationScheduleOption.Dailyを指定して日毎のログにしておけば、この問題は解決しそうです。
自分一人で使うアプリなので、古いログの削除はタスクスケジューラーで設定するほどの事もなく、気がついた時、アプリ終了後にエクスプローラで削除するようにします。
どうも、ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ