[EntLib]Microsoft Enterprise Library 6ログRollingFlatFileTraceListenerログファイル名を実際の時間で命名


EntLibの様々な構成、原理などについてネットで探してみるとたくさんの文章が見つかりますが、ここではこの部分について詳しく説明しません
使用中、RollingFlatFileTraceListenerが記録したログファイル名が実際に記録したログTimestampと一致しないことがわかりました.例えば、ログファイルに記録されたログは2015-01-20 10:00で、実際にこのログファイルの名前は2015-01-20-10:01より後になる可能性もあります(設定されたRollIntervalがMinute、設定されたtimeStampPatternがyyyyyMMddHmmと仮定します)、EntLibのログライブラリはログファイルの作成時間で命名されているので、実は日誌としては読めばいいのですが、ファイル名がログ内のTimestampと一致しないのは大きな問題ではありませんが、習慣的に違和感があるかもしれませんが、一部の強迫症患者にとって(あるいは偏執狂?)なんだか気分が悪くて、EntLibがオープンソースである以上、私たちは完全に自分で調整することができるのではないでしょうか.
まず最初のステップ:EntLib 6のオープンソースコードをダウンロードして、あなたはhttp://www.microsoft.com/en-us/download/details.aspx?id=38789ソースファイル名EnterpriseLibrary 6-sourceを見つけます.exe
ステップ2:EnterpriseLibrary 6-sourceを実行します.exeファイルを指定した場所に解凍し、BlocksLoggingLoggingを開きます.sln
ステップ3:対応するcsファイルを開く:Logging—>TraceListeners—>RollingFlatFileTraceListener.Inner.cs
第四歩:やっと本題修正コードに入りました.まず109行目のCalculateNextRollDateメソッドを見つけます.このメソッドは名前から次のRollDateを取得する役割を知ることができます.元のメソッドはrollIntervalで簡単な日付処理をしただけなので、実際の時間にログファイル名を設定するには問題があるに違いありません.私たちはlog 201501201000に望んでいないからです.logには2015-01-20-10:01のログが見えますよね?以下は調整コード:設定したRollInterval最小精度でNextRollDateを設定する
            /// <summary>
            /// Calculates the next roll date for the file.
            /// </summary>
            /// <param name="dateTime">The new date.</param>
            /// <returns>The new date time to use.</returns>
            public DateTime CalculateNextRollDate(DateTime dateTime)
            {
                switch (this.owner.rollInterval)
                {
                    case RollInterval.Minute:
                        return dateTime.Date.AddHours(dateTime.Hour).AddMinutes(dateTime.Minute + 1);
                    case RollInterval.Hour:
                        return dateTime.Date.AddHours(dateTime.Hour + 1);
                    case RollInterval.Day:
                        return dateTime.Date.AddDays(1);
                    case RollInterval.Week:
                        return dateTime.Date.AddDays(7);
                    case RollInterval.Month:
                        return dateTime.Date.AddMonths(1);
                    case RollInterval.Year:
                        return dateTime.Date.AddYears(1);
                    case RollInterval.Midnight:
                        return dateTime.AddDays(1).Date;
                    default:
                        return DateTime.MaxValue;
                }
            }
そして私たちが修正しなければならない場所はファイルの名前です.234行のPerformRollメソッドを見つけます.そして、このメソッド内の249行はログファイル名を取得する方法です.ここでrollDateTimeをデフォルトのLogのCreationTimeに変更すればいいです.次のSafeMoveメソッドでは、ログファイルを処理した後、デフォルトログファイルのCreationTimeが再設定されます
// calculate archive name
string archiveFileName = this.ComputeArchiveFileName(actualFileName, File.GetCreationTime(actualFileName));
よし、これで大功を奏し、releaseファイルにコンパイルして他のプログラムに呼び出すことができます.
ちなみにpatterns&practicesグループはなぜRollingFlatFileTraceListenerに設計されたのか.DateTimeProviderは継承できます.このクラスには1つのvirtual属性CurrentDateTimeしか含まれていません.この属性はRollDateを決定しますが、実際にどのように修正しても意味がありません.
補足質問:コンパイル後に他のプログラムが呼び出された場合、EntLibConfigで構成されたプログラムのコンパイルは間違いなく、実行時に「プログラムセットリスト定義とプログラムセット参照が一致しない」というエラーが発生し、宣言されたVersionなどの情報を削除する必要があります.この問題をどのように処理すればコンパイルに成功したdllを直接参照できるかはまだ分かりません
「プログラムセットリスト定義とプログラムセット参照が一致しない」という強い署名が原因のようですが、この問題は解けません.