1

ロギングに SLF を使用するプログラムがあります。このプログラムは 24 時間年中無休で実行されており、ログ ファイルを毎晩リモート サーバーにアップロードして後で確認したいと考えています。

私の質問は、プログラムを閉じずにログのファイル ロックを解除するにはどうすればよいですか?

ログを一時停止し、ログをアップロードし、ログ ファイルを削除するか内容を消去してから、ログを再開することを望んでいました。

ILogger logger = LoggerService.GetLogger(typeof(TaskScheduler).FullName);

// Other initialization here

foreach (var task in managedTasks.OrderBy(t => t.Priority))
{
    if (task.NextRunTime <= DateTime.Now)
    {
        dataManager.CurrentStatus = AppStatus.Running;
        if (task.Name == "Log Sender")
        {
             logger = null;
        }

        // Run the task

        if (task.Name == "Log Sender")
        {
            logger = LoggerService.GetLogger(typeof(TaskScheduler).FullName);
        }

        dataManager.CurrentStatus = AppStatus.Idle;
    }
}

現在、これを行うと、ファイルがまだタスク スケジューラによってロックされているため、まだ IOException が発生します。

編集:それが役立つ場合は、log4net で SLF を使用しています。

4

2 に答える 2

0

この質問を投稿し、私のデザインを再考するための推奨事項を入手した後。日付ごとにローリングログファイルを作成することを検討し始めました。私はこれに遭遇しました、それは私の問題を完全に解決しました:

<appender name="InfoRollingLogFileAppender" type="log4net.Appender.RollingFileAppender,log4net">
  <param name="File" value="log.txt" />
  <param name="StaticLogFileName" value="true"/>
  <maximumFileSize value="1024KB" />
  <appendToFile value="true" />
  <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
  <layout type="log4net.Layout.PatternLayout">
    <conversionPattern value="%logger: %date{dd MMM yyyy HH:mm:ss} [%thread] %-5level - %message %newline" />
  </layout>
</appender>

app.configでlog4netアペンダーを設定し、lockingModelに従って「MinimalLock」を含めるようにしました。これにより、ログの内容をプルしてサーバーにアップロードし、ローカルログを消去することができます。指定された時間/日付スパン。

繰り返しになりますが、皆さんの助けに感謝します。あなたの提案がなければ、この便利な変更に出くわすことはありませんでした。

于 2013-02-19T15:50:49.597 に答える
0

これは技術的な問題ではなく、設計上の問題と考えています。毎日のイベントを個別のファイルに記録し、翌日には昨日のログ ファイルを使って好きなことを行うことができます。必要に応じてログ期間を絞り込むことができます (例: 12 時間ごと)。

于 2013-02-15T23:06:49.033 に答える