log4net †多分、log4cpp とほぼ同じだと思うけど。 ダウンロード †ここの Downloads からソース一式をダウンロードする。Stable というのが安定バージョンなので、大抵は Stable をいただく。 アーカイブの中にはバイナリ(dll)も同梱されていて、それらはそのまま使用することができるが、ここはやっぱりカスタマイズして使いたいので、ソースもコンパイルすることにする。 コンパイル †プロジェクト(ソリューション)は、src ディレクトリに入っている。これは多分一番古いバージョンの Visual Studio プロジェクトなので、新しいバージョンの VS ファイルにコンバートする(問い合わせが出るので「はい」で)。 log4net.sln を開くと、log4net.csprj と log4net.Tests.csprj という2つのプロジェクトが開くが、log4net.Tests.csprj の方は NUnit のテストプロジェクトなので、NUnit を入れていないとコンパイルできない。NUnit を入れてもいいが、面倒なら「プロジェクト」→「プロジェクトのアンロード」でアンロードしてコンパイル対象外にしてしまって良い。または、最初から log4net.csprj を直接開いて、新しいソリューションファイルをつくっても良い。 このまま「ビルド」すると、Debug ビルドの方は上手くいくが、Release ビルドは通らない。 error CS1548: アセンブリ 'log4net.dll' を署名しているときに 暗号に失敗しました -- 'キー ファイル '..\..\..\log4net.snk' の読み込み中にエラーが発生しました -- 指定されたファイルが 見つかりません。 ' というようなエラーが出る。 log4net.snk.readme を見ると、キーファイルをつくる必要があるというようなことが書いてあるので、書いてある通りに作成する。 sn -k log4net.snk sn というのは .NET のツール。 (Program Files)\Microsoft Visual Studio .NET 2003\SDK\v1.1\Bin に入っているが、おそらくパスが通っていない。ただ、「スタート」→「Visual Studio .NET ツール」からコマンドプロンプトを立ち上げれば、パスを通さずともこのコマンドがそのまま動作する。 最後の引数をファイル名のみにすると、(My Documents)\(ログイン名) ディレクトリに log4net.snk が作成される。 あと、AssemblyInfo?.cs の最後の行で、log4net.snk の位置指定が3つ階層を上がった場所に置くことになっている。これの意図が不明なので、私はソリューションと同じ位置に置いて、ファイル名のみの指定とした。 #if STRONG && (CLI_1_0 || NET_1_0 || NET_1_1 || NETCF_1_0 || SSCLI) [assembly: AssemblyDelaySign(false)] //[assembly: AssemblyKeyFile(@"..\..\..\log4net.snk")] [assembly: AssemblyKeyFile(@"log4net.snk")] #endif これで、Relese もコンパイルできるはず。 ちなみに、出来合いのバイナリ(dll)は bin ディレクトリに入っているが、プロジェクトをコンパイルすると、 build というディレクトリの中にバイナリ(dll)が作成される(プロジェクトの設定がそうなっているので)。 使い方 †あとは、ここらへんを参考に。 ただ、このページの通りに log4net.Config.DOMConfigurator を設定すると、 warning CS0618: 'log4net.Config.DOMConfiguratorAttribute' は古い形式です : 'Use XmlConfiguratorAttribute instead of DOMConfiguratorAttribute' というような警告がでるので、DOMConfigurator ではなく XmlConfigurator? を使う。 [assembly: log4net.Config.XmlConfigurator(Watch=true)] 参考 †PatternLayout?で指定できるパターン
( CodeZine より ) 上記のうち、 %C、%F、%l、%L、%M は処理負荷が高くなるらしい。 DEBUG レベルにして、運用時などは出力しないようにする方が良いでせう。 log4net.config はどこに置けば良い? †基本的に AssemblyInfo?.cs に指定した位置。 [assembly: log4net.Config.XmlConfigurator(ConfigFile=@"log4net.config", Watch=true)] ConfigFile? の値は絶対パス(フルパス)でも相対パスでも良いので、 確実に参照させたいなら絶対パスで書いてしまえば間違いない。 ただ、通常は config ファイルはプロジェクトに含めたいところなので、 相対パスで書く方が柔軟性がある。 Windows アプリケーションの場合 †AssemblyInfo?.cs に、 [assembly: log4net.Config.XmlConfigurator(ConfigFile=@"log4net.config", Watch=true)] と書いた場合は、実行モジュール(.exe など)と同じ位置になる。 ただ、大抵の場合、実行モジュールは bin\Debug や bin\Release などのフォルダの下にできるので、 共通の config ファイルを参照するために、プロジェクトファイルと同じ位置 (実行モジュールから見たら 2 つ上の階層)を見るように設定するのが妥当らしい。 つまり、 [assembly: log4net.Config.XmlConfigurator(ConfigFile=@"..\..\log4net.config", Watch=true)] となる。 ただ、リリース時はここを書き換える必要があるか。 Web アプリケーションの場合 †AssemblyInfo?.cs に、 [assembly: log4net.Config.XmlConfigurator(ConfigFile=@"log4net.config", Watch=true)] と書いた場合は、Web アプリケーションのルートということになるが、 それは一体どこかというと、どうやらプロジェクトファイルがある場所らしい。 (コンパイルすると、実行モジュール(.dll)は bin の下にできるので、 てっきりそこがルートかと思いきや、違った。) なので、config ファイルをプロジェクトと同じ位置に置くのであれば、 上の記述で問題ない模様。 アプリケーションの config に書いてしまう方法 †log4net.config というファイルを別に用意するのでなく、 アプリケーションの config ファイルに書き込んでしまう手もある。 つまり、Windows アプリケーションなら app.config, Web アプリケーションなら web.config に、 log4net.config の内容を埋め込んでしまう。 <?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <appSettings> <!-- log4net内部のデバッグメッセージを出力する場合、trueに設定 --> <add key="log4net.Internal.Debug" value="true"/> </appSettings> <log4net> <!-- ここに log4net.config の内容を記述。 --> <appender name="DailyAppender" type="log4net.Appender.RollingFileAppender"> <!-- ファイル名 --> <param name="File" value="trace.log" /> <!-- 追記する場合 true / 上書きする場合 false --> <param name="AppendToFile" value="true" /> <!-- 日付や時刻の制約によるログファイルの切替 --> <param name="RollingStyle" value="Date" /> <!-- 上から「毎月、毎週、毎日、半日、毎時、毎分」の設定(デフォルトは毎日) --> <!-- <param name="DatePattern" value="yyyy-MM" /> --> <!-- <param name="DatePattern" value="yyyy-ww" /> --> <!-- <param name="DatePattern" value="yyyy-MM-dd" /> --> <!-- <param name="DatePattern" value="yyyy-MM-dd-a" /> --> <!-- <param name="DatePattern" value="yyyy-MM-dd-HH" /> --> <!-- <param name="DatePattern" value="yyyy-MM-dd-HH-mm" /> --> <param name="DatePattern" value="yyyy-MM-dd" /> <!-- 保存するファイル数(数を超えた場合は古いものから削除) --> <param name="MaxSizeRollBackups" value="7" /> <param name="StaticLogFileName" value="true" /> <layout type="log4net.Layout.PatternLayout"> <param name="ConversionPattern" value="%d [%t] %-5p - %m%n" /> </layout> </appender> <root> <!-- 出力レベル --> <level value="INFO" /> <!-- 使用する Appender --> <appender-ref ref="DailyAppender" /> </root> </log4net> </configuration> とか。 この場合は、AssemblyInfo?.cs に ConfigFile? の値を記述する必要はない。 つまり、 [assembly: log4net.Config.XmlConfigurator(Watch=true)] これでOK。 関連 † |