3

クライアントのデモ プログラムで log4net を動作させる作業を行っているので、クライアントはそれをコード ベースに統合できます。http://www.codeproject.com/Articles/14819/How-to-use-log4netの実装を行っているときにこの記事を見つけました。説明されている手順の 1 つは次のとおりです。

ステップ 2: AssemblyInfo.cs ファイルに以下の行を追加します。

[assembly: log4net.Config.XmlConfigurator(ConfigFile="Web.config", Watch=true)]   //For log4net 1.2.10.0

そのコード行を AssemblyInfo.cs に追加するとすぐに、ロガーが機能し始めました。

この行が必要な理由を理解するために、その場所でいくつかのグーグル検索を行いました。ほとんどのドキュメントとコメントは、AssemblyInfo がオプションの構成情報であると主張しました。この行を追加するとプログラムが機能する理由がわかりません。私の重要な質問は、AssemblyInfo.cs の構成情報がどのように取得されて使用されるのか (そして、これを明確に説明しているドキュメントはありますか) です。

AssemblyInfo.csのアセンブリキーワードの意味から理解しました。内部でメソッドを使用することは許可されていますか? これらはアセンブリの属性であり、その背後にあるメカニズムではないことに注意してください。

4

2 に答える 2

1

いい話題。あなたが求めているように、リンクを提供することはできませんが、いくつかのポイント、調査結果のみです。私の発言のいくつかは、既知のものであり、明白なものである可能性があります。私はそれらを一箇所にまとめようとしています。そして、log4Net設定でその魔法がどのようにトリガーされるかを答えてください。

  • AssemblyInfo.cs は、他の .cs ファイルと同様に、C#クラス定義などを含む「通常の」ファイルです。プロジェクトファイルでは、「コンパイル」としてマークされています。言い換えれば、これは慣習によって選択された場所であり、すべての「アセンブリ」属性を配置する必要があります。しかし、それらはどこにでもある可能性があります (ただし、そうすべきではありません) (プロジェクトのコンパイル済みファイルの特定の名前空間宣言の外側に配置されている場合)。
  • [AttributeUsage(AttributeTargets.Assembly)] としてマークされている場合、log4Net " XmlConfiguratorAttribute "などの任意のカスタム属性をアセンブリ定義に追加できます。
  • すべての属性は単なるメタ情報です。他の言葉は (リフレクションのために) 利用可能ですが、暗黙的には使用されません。デフォルトでは実行されません。
  • (AssemblyVersion、AssemblyTitle などの一部の属性は実行されているように見えますが、これは意図されたものであり、コンパイラによって明示的に呼び出されます)

これを踏まえて、属性で何ができるか。私たちの (カスタム) コードは、リフレクションを使用して、属性が存在するかどうかを確認できます。ほとんどの場合、特定の既知の型 ( XmlConfiguratorAttribute など) です。そのような属性が存在する場合、それを「実行」できます。例えば。タイプIFilterの属性が適切に実行されることを許可する「ランタイム」を持つASP.NET MVCを使用しています。クラスとメソッドを監視し、これらの属性を明示的に実行するのは MVC ランタイムです。

AssemblyInfo.cs 内の属性宣言だけでは十分ではありません。上記のスニペットのように、XmlConfiguration が宣言されています。通常、ILog を構築する他の呼び出し (ASP.NET の場合は Global.asax の場合) があります。

ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

さて、メソッド呼び出しチェーンのフローのどこかで、Log4Net 内に存在するかどうかがチェックされます。

var attributes = Attribute.GetCustomAttributes(thisAssembly, typeof(XmlConfiguratorAttribute));

はいの場合(アセンブリにそのような属性がある)-log4Netはそれを使用でき、強制的にジョブを実行させます(たとえば、xmlから構成します)

于 2012-10-25T10:53:29.493 に答える
0

Log4net にはXmlConfigurator、呼び出し元のアセンブリでアセンブリ レベルの属性を検索するコードがあります。

見つけた属性のプロパティを読み取り、それ自体を適切に構成します。

于 2012-10-25T03:03:32.693 に答える