質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

10612閲覧

AssemblyInfo.cs を読み込まない理由が解らない

usugita_san

総合スコア226

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2017/04/05 06:42

log4netのlog4net.configが読み込まれずに原因を追究していたのですが、以下の記事で解らない点があるので質問します。
http://d.hatena.ne.jp/tutinoko16/20070615/1181897663

この設定はloggerインスタンスを生成する責務を持つアセンブリのAssemblyInfo.csに記述されてないとログ出力されない。

これがよく解りません。
例えばHogehogeApp.Serviceというプロジェクトの単体テストのため、HogehogeApp.Service.Testというプロジェクトを作成したとします。
このプロジェクトで以下のソースを書きました。

C#

1namespace HogehogeApp.Service.Test.Main 2{ 3 /// <summary> 4 /// クラスの説明 5 /// </summary> 6 [TestClass] 7 public class LogTest 8 { 9 /// <summary> 10 /// ロガー 11 /// </summary> 12 static readonly ILog Logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 13 [TestMethod] 14 public void 何かのテスト() 15 { 16 ///AssemblyInfo.csの設定値を確認する 17 System.Diagnostics.FileVersionInfo ver = 18 System.Diagnostics.FileVersionInfo.GetVersionInfo( 19 System.Reflection.Assembly.GetExecutingAssembly().Location); 20 ///ログの設定を読み込めているか確認する。結果はfalse 21 Logger.Debug(Logger.Logger.Repository.Configured); 22 //期待通りにログが出力されない。 23 Logger.Debug("abcdefg"); 24 } 25 } 26}

このソースではログが正常に出力されませんでした。
AssemblyInfo.csを確認しました。
念のため、一旦空にしてから、プロパティ画面からバージョン情報を追加するなどして、AssemblyInfo.csを作り直し、以下のようにlog4net.configの読み込みを追加しました。

C#

1using System.Reflection; 2 3[assembly: AssemblyTitle("HogehogeApp.Service.Test")] 4[assembly: AssemblyProduct("HogehogeApp.Service.Test")] 5[assembly: AssemblyVersion("2")] 6[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = false)]

この状態で再度実行したのですが、log4net.configの設定は読み込まれていません。
不思議なのは、AssemblyInfo.csの値を取得したら、バージョン情報などが読み込まれているのです。なのでAssemblyInfo.cs自体は読みに行っていると思います。
手動でlog4net.configを読めないかと思って、以下のようにソース上で読み込んだところ、正常に読み込めました。

C#

1XmlConfigurator.Configure(new System.IO.FileInfo("log4net.config"));

つまりlog4net.configも問題ない事になります。
なぜか、AssemblyInfo.csに書いてある「[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = false)]」だけが無視されているようです。

どうすれば AssemblyInfo.csからlog4net.configを読み込めるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

###回答
LogManager.GetLogger の第一引数で HogehogeApp.Service の Assembly を指定してください。
###調査
気になったので調べました(log4net のソースを追いました)。
まずは以下の記述ですが、

C#

1[assembly: log4net.Config.XmlConfigurator(ConfigFile = @"log4net.config", Watch = false)]

これはただの属性(XmlConfiguratorAttribute)でメタデータであり情報がそこにあるだけです。
log4net の設定を実行する能力はありません。
他の assembly の記述も同様です。それらはただの情報です。
読み取りの主体は別にいて、その主体に読み取られない限り、ただの情報でしかありえません。そして、読もうとすれば誰でも読めます。

では、その読み取り主体はというとそれは log4net の本体です。
もっと具体的に言うと LogManager.GetLogger の中で Assembly の情報は読み取られています。

では、どの Assembly が読み込まれているかというと、LogManager.GetLogger の呼び出し元 Assembly(Assembly.GetCallingAssembly())の情報を読んでいます。
また、LogManager.GetLogger には Assembly を受け取るものがあり、これを使った場合はその Assembly の情報が読み取られます。
設定が読み込まれるのは最初の1つだけです。先勝ちです。

この場合、呼び出しているプロジェクトは、HogehogeApp.Service.Test なのでその Assembly に設定した情報が読み取られます。
別の Assembly の設定を使いたいなら その Assembly を指定しましょう。
###補足
調査対象は log4net Anonymous 用リポジトリの master(log4net 2.0.8 とイコールか、ちょっと進んだバージョン)

確認環境は以下の通り。

  • Windows 10(64 bit)
  • Visual Studio Community 2017

投稿2017/05/18 23:52

編集2017/05/19 00:38
toydev

総合スコア297

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問