「[[Open棟梁 wiki>https://opentouryo.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>アプリケーション設計のポイント]]

*目次 [#h94eb5ed]
#contents

*概要 [#e0d82e07]
ログ出力方式について纏める。
-ページを分割しました。
-本ページへのアンカーは、[[ログ出力方式 (lon4net)>#c71097de]]を、ご参照ください。

*lon4net [#qca89bc7]
Open棟梁では内部でlon4netを使用しているので、~
ココの記述は ≒ lon4netの仕様を説明となっている。
*詳細 [#u9a4036f]

lon4netでは、3つの主要なコンポーネント
-ロガー
-アペンダ
-レイアウト
**コンパチ可能なリプレース [#w42698ff]
-[[lon4net>#c71097de]] を [[NLog>#v2ab16ed]]にリプレース。
--足回り(ライブラリ)をリプレースするだけで、設計自体は変更しない。
--そのため、ユーザコード側の変更を最小限に抑える。
--ただし、[[NLog>#v2ab16ed]]の定義などを一気に揃える必要がある。

の設定を定義ファイルに定義できる。
-コンパチブルにする
--以下の何れかの設計変更が必要になる。
--コレにより、[[lon4net>#c71097de]]から[[NLog>#v2ab16ed]]に、段階的に移行可能になる。

アペンダ・ロガーについては、以下が参考になる。
-1. Log4J の基本 | TECHSCORE(テックスコア)~
http://www.techscore.com/tech/Java/ApacheJakarta/Log4J/1/#log1-3
-log4j - Wikipedia~
https://ja.wikipedia.org/wiki/Log4j
***DIコンテナでは難しい。 [#h11838cb]
DIだと、config処理をユーザ側に持たせる必要がある。~
(Program.csや、Setup.csに書かせるようなconfigをユーザ側に強いる)

**レイアウト(Layout) [#cfbd1341]
アペンダが出力するログのフォーマットを定義する。
-共通I/F

**アペンダ(Appender) [#t3dd1f58]
-具体的な出力処理を行う。
-出力先毎にアペンダの種類が存在する。
-アペンダの種類毎に設定可能な項目が異なる。
-出力先、ローリング設定等を定義する。
--下位スタックでDIされたLoggerを使用する場合、~
共通I/Fが無いならレイトバインドするしかない。

**ロガー(Logger) [#gd110238]
-論理的なログファイル名
-アペンダをロガーで束ねると複数の出力先へ出力できる。
-ログレベル毎にFilterすることができる。
-ルートロガーとロガーがあり階層構造をとる。
--共通I/Fがあれば、下位はインターフェイスのみ実装し、~
config用ライブラリも含め、実体を上位からDIすることもできるのだが。

**設定 [#r5ab32c2]
設定の詳細は、”Open棟梁”の[[利用ガイド(纏め者編)>https://github.com/OpenTouryoProject/OpenTouryoDocuments/blob/master/documents/1_User_Guide/ja-JP/2_User_Guide(Leaders).doc]]の1.3節:「log4net」を参照のこと。
--[[lon4net>#c71097de]] と [[NLog>#v2ab16ed]]に共通のインターフェイスは無い。
---従って、コンパチの情報もない。
---DIはユーザ・レイヤでのみ可能。

*出力先 [#g907f29b]
アペンダの種類毎に出力先が異なる。
-よくよく考えると、DIされたLoggerを、基盤側で使用している~
ようなケースは無い(ASP.NET Coreでも無い)ですね...。

**アペンダ種類 [#v2ffec90]
アペンダには以下のような種類がある。
***[[ベースクラス2]]からDIする。 [#j990ed96]
[[ベースクラス2]]からDIすれば、~
最小限の初期化コードで済みそう。

-名前空間は、log4net.Appender
-ベースクラスは、.AppenderSkeleton
-Public(ライブラリ)側に、~
共通I/F(純粋仮想関数)を定義する。

-参考:Apache log4net – Apache log4net: Config Examples~
https://logging.apache.org/log4net/release/config-examples.html
-Business([[ベースクラス2]])側に、
--共通I/Fを継承した、ManagerとLoggerを定義する。
--Businessで初期化を行い、PublicにDIする。

***ファイル [#g9c6971b]
-.FileAppender~
テキストファイル
-.RollingFileAppender~
ローリング・テキストファイル
-Publicの共通I/F(純粋仮想関数)経由でログ出力する。

***コンソール [#s820b4d0]
-.ConsoleAppender
-.ColoredConsoleAppender
-.AnsiColorTerminalAppender
***[[ベースクラス1]]や共通部品内で完結させる。 [#j9f65813]
ただ、初期化処理自体が面倒という話もある。

***イベントログ [#i7123a08]
-.EventLogAppender
-依存ライブラリが少ないので両方サポートしても良さそう。
--https://www.nuget.org/packages/log4net/
--https://www.nuget.org/packages/NLog/

***DB [#r4d9bf6f]
-.AdoNetAppender
-.AdoNetAppenderParameter
-実装の方法
--LogIF内部をIF文で分割。
--LogManager内部でクラスを分割。

***ネットワーク [#u6f73c8e]
-.UdpAppender
-.NetSendAppender
-.TelnetAppender
-.SmtpAppender
-.SmtpPickupDirAppender
-.RemotingAppender
**ログ出力方式 [#d49a9d28]
***[[lon4net>ログ出力方式 (lon4net)]] [#c71097de]
***[[NLog>ログ出力方式 (NLog)]] [#v2ab16ed]

***TraceListener [#me36b346]
-.DebugAppender~
System.Diagnostics.Debug system
-.TraceAppender~
System.Diagnostics.Trace system
-.AspNetTraceAppender~
ASP.NET TraceContext
*参考 [#r1886bdd]
-log4net の開発休止宣言に伴い NLog に移行 - Life like a clown~
https://clown.cube-soft.jp/entry/2020/06/01/log4net-to-nlog

***Syslog(LinuxおよびUNIX) [#g7f451b2]
-.LocalSyslogAppender
-.RemoteSyslogAppender
**マイクロソフト系技術情報 Wiki [#j1c81919]

***その他 [#u103adde]
-.TextWriterAppender~
.TextWriterクラス
***OpenTouryoProject/OpenTouryo [#rd6b29af]
-The log4net project would be dormanted. · Issue #363~
https://github.com/OpenTouryoProject/OpenTouryo/issues/363

-.OutputDebugStringAppender~
OutputDebugString Win32API
-OpenTouryo/root/files/resource/Log at master~
https://github.com/OpenTouryoProject/OpenTouryo/tree/master/root/files/resource/Log

-.MemoryAppender
-OpenTouryo/root/programs/CS/Frameworks/Infrastructure/Public/Log~
https://github.com/OpenTouryoProject/OpenTouryo/tree/master/root/programs/CS/Frameworks/Infrastructure/Public/Log
--https://github.com/OpenTouryoProject/OpenTouryo/blob/master/root/programs/CS/Frameworks/Infrastructure/Public/Log/LogIF.cs
--https://github.com/OpenTouryoProject/OpenTouryo/blob/master/root/programs/CS/Frameworks/Infrastructure/Public/Log/LogManager.cs

-.AppenderCollection
-.ForwardingAppender
-.BufferingForwardingAppender

*ログ ヘッダ [#ee167b05]
定義ファイルでレイアウト(Layout)を定義することにより、~
アペンダ(Appender)毎、ログ ヘッダを設定できる。

(例)
 ↓時間               ↓レベル ↓スレッドID ↓メッセージ
 [2007/10/25 15:22:21,750], [DEBUG], [9], 任意のメッセージ

*ログ レベル [#v8ba26dd]
定義ファイルでロガー(Logger)を定義することにより、~
出力するログ レベルのフィルタを設定できる。~

ログ レベルには次の5つのレベルがあり、~
ロガー(Logger)のログ出力APIを使い分ける。

|レベル|説明|h
|Fatal|システム停止するような致命的な障害|
|Error|システム停止はしないが、問題となる障害|
|Warn|障害ではない注意警告|
|Info|操作ログなどの情報|
|Debug|開発用のデバッグメッセージ|

*ログの種類 [#w5c95d04]
ログの種類毎に主要コンポーネント(ロガー、アペンダ、レイアウト)を準備

**アクセス トレース ログ [#kbba3fe0]
デバッグや、パフォーマンス・アクセス分析で重宝する。

-アプリケーションへのアクセス状況と処理状況(処理内容、処理時間)をフレームワークに埋め込んだトレースからログ ファイルに出力する。
-アクセス トレース ログの実装は、”Open棟梁”の各レイヤの「[[ベースクラス2]]」(画面コード親クラス2、業務コード親クラス2)上に共通処理として実装できる。

-例外発生時のExceptionの情報もコチラに出力する。
--正常時のログ出力情報は、性能の観点から、最小限とする。
--異常時のログ出力情報は、エラー・障害原因の究明のため~
詳細に出力する(エラー メッセージ、スタックトレースなど)。


***フォーマット [#c0e1a06c]
下記は、アクセス トレース ログ出力のテンプレート・フォーマット。

-ヘッダ

--log4netヘッダ
---タイムスタンプ
---ログ レベル
---スレッドID

--カスタム ヘッダ
---(認証)ユーザ名
---IPアドレス(端末の識別が可能な情報)

-メッセージ
--レイヤ、開始・終了
---[Init] or [Postback] : P層の画面のイベント処理
---"----->" : P層 のコントロール イベント処理の開始
---"<-----" : P層 のコントロール イベント処理の終了
---"----->>" : B層 業務処理の開始
---"<<-----" : B層 業務処理の終了

--画面名
--コントロール名

--メソッド名
--処理区分
---実行時間(ミリ秒)
---CPU時間(ミリ秒)

--例外情報
---ErrorMessageID
---ErrorMessage
---StackTrace
---ToStringした方がイイかも。

**SQLトレース ログ [#x304c13e]
SQLに絞ってになるが、アクセス トレース ログと同様に、~
デバッグや、パフォーマンス・アクセス分析で重宝する。

***フォーマット [#a20fef56]
下記は、SQLトレース ログ出力のテンプレート・フォーマット。

-ヘッダ

--log4netヘッダ
---タイムスタンプ
---ログ レベル
---スレッドID

--カスタム ヘッダ
---(認証)ユーザ名
---実行時間(ミリ秒)
---CPU時間(ミリ秒)

-メッセージ
--CommandText(実行時のSQL文)
--CommandParameter(実行時のパラメタ一覧)

--例外情報
---StackTrace
---ToStringした方がイイかも。

**オペレーション トレース ログ [#f8c56ed4]
業務のイベントをログ出力する。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS