開発リソース

SMTPAppenderでSubjectにホスト名を入れる

add:2007-09-20

アプリサーバを多重化しているので、Subjectにホスト名を入れたいと思った。
PatternLayoutやPatternStringで"%P{log4net:hostname}"と書いてみたが、置換されない。

例:
<param name="Subject"  type="log4net.Util.PatternString" value="xxxx(%P{log4net:hostname}) エラー通知" />

どうもSMTPAppenderのサブジェクトはstaticであり、PatternLayout/PatternStringが使えないらしい。
掲示板の書き込み
log4net-user MLより

log4netには環境変数の埋め込みという機能があり、これはSubjectにも効いた。valueの中で${環境変数名}と指定する。

例:
<param name="Subject"  value="xxxx(${COMPUTERNAME}) エラー通知" />

雑学 - log4net のコンフィギュレーション例 にて発見した。

log4net.spi.LevelEvaluatorは
log4net.Core.LevelEvaluatorになった

add:2007-09-13

なんか1.2.10に上げてからlog4netメールが飛んでこないな、と思って調査した。

調べたら、1.2.9betaでlog4net.spi名前空間がlog4net.Coreにリネームされていた。

http://logging.apache.org/log4net/release/release-notes.html#1.2.9 Betaより)

そのためSMTPAppenderの設定が不正になり、メールが出なかった模様

log4netの内部デバッグ出力の出し方

http://logging.apache.org/log4net/release/faq.html#How do I enable log4net internal debugging?から。

前項に絡んで、原因調査のためにlog4netの内部ログを出してみた。

  • 1: Web.Configで以下を追加し、内部デバッグ出力を有効化(appSettingsの下)
     	<appSettings>
    		<add key="log4net.Internal.Debug" value="true"/>
    
  • 2: Web.Configで以下を追加し、トレース出力をファイルにリダイレクト(configuration直下)
        <system.diagnostics>
            <trace autoflush="true">
                <listeners>
                    <add 
                        name="textWriterTraceListener" 
                        type="System.Diagnostics.TextWriterTraceListener" 
                        initializeData="C:\temp\log4net.txt" />
                </listeners>
            </trace>
        </system.diagnostics>
    

結果として出てきたエラーログ:

log4net:ERROR XmlHierarchyConfigurator: Failed to find type [log4net.spi.LevelEvaluator]
System.TypeLoadException: Could not load type [log4net.spi.LevelEvaluator]. 
Tried assembly [log4net, Version=1.2.10.0, Culture=neutral, 
PublicKeyToken=1b44e1d426115821] and all loaded assemblies
   at log4net.Util.SystemInfo.GetTypeFromString(Assembly relativeAssembly, 
String typeName, Boolean throwOnError, Boolean ignoreCase)
   at log4net.Repository.Hierarchy.XmlHierarchyConfigurator.CreateObjectFromXml
(XmlElement element, Type defaultTargetType, Type typeConstraint)

log4net:ERROR XmlHierarchyConfigurator: Failed to create object to set param: evaluator

これでやっと原因判明。

Visual Web Developer2005でlog4netを初期化する

add:2007-01-11

VWD2005を使っているが、VS.Net2003とはいろいろ勝手が違う。

  • AssemblyInfo.csが生成されない。手で作る正しい手順も、そもそも手で作っていいのかも不明。
  • Global.asaxは手で作らないといけない上、コードビハインドが生成されない。

しょうがないのでGlobal.asax内で初期化する。

void Application_Start(object sender, EventArgs e) 
{
 log4net.Config.XmlConfigurator.ConfigureAndWatch(
  new System.IO.FileInfo(設定ファイルのフルパス)
 );
}

これでOK。でも属性使いたい……

ログ出力をプログラムから停止・再開する

正しい手順かどうか知らないけど。

ログファイルが開かれた状態だと格納先フォルダを移動・削除できない。
Webアプリの場合、IISのアプリケーションを停止する必要がある。

さすがに煩雑なのでログ出力だけ停止する処理を書いてみた。

log4net.LogManager.Shutdown();

この1行で止まる。当たり前だが止めたらそれっきりなので、要注意。

再開するときはこうする。

log4net.Config.DOMConfigurator.ConfigureAndWatch(
 new System.IO.FileInfo(設定ファイルのフルパス)
);

ヘッダ・フッタに改行を入れる

最近のバージョンではヘッダやフッタに改行文字を入れられなくなった。\r\nと書いてもそのまま表示される。
回避方法を調べた。

1:数値文字参照を使う

<layout type="log4net.Layout.PatternLayout">
	<header value="[Header]&#13;&#10;" />
	<footer value="[Footer]&#13;&#10;" />

log4netのFAQそのまま。もちろん16進表記でもいい。

2:書式を使う

http://www.pshared.net/diary/?date=20051010から。あとlog4net FAQ

以下のように書くと改行される。

   <layout type="log4net.Layout.PatternLayout">
     <param name="Header"  type="log4net.Util.PatternString" value="[Header]%newline" />
     <param name="Footer"  type="log4net.Util.PatternString" value="[Footer]%newline" />
      :

type="log4net.Util.PatternString" を指定すると、任意の属性値にパターンを記述できる。利用可能な書式は
http://logging.apache.org/log4net/release/sdk/log4net.Util.PatternString.htmlで参照可能。

プラットフォームに依存しないのでこちらのほうがいい、とある。

こんな風に日付も埋め込める。

     <param name="Header"  type="log4net.Util.PatternString" value="[Header %date{ISO8601}]%newline" />

log4net 1.2.10(stable版)

log4netの最新版を試用した。1.2.10。タイムスタンプは2006/03/30。

http://logging.apache.org/log4net/downloads.html

(sourceforge.netのは1.2.0beta8と古いままなので注意)

多少変更があるが、基本的には1.2.0beta8と同じ使い方でOK。主に気づいた点。

  • .Net 2.0に対応。
  • DOMConfiguratorはdeprecatedになった。かわりにXmlConfiguratorを使用する。単純に置き換えるだけでいい。
  • 書式付きの文字列を直接ログ出力できるようになった。例:DebugFormat("format:{0} {1}", "a", "b");
  • ConfigファイルでC形式のエスケープ文字(\n=改行など)が通らなくなった。今後は&#xd;&#xa;という感じでXMLエンコーディングを使用すること。

ありがちなハマリ点:

  • dllはアセンブリ単位でロードされるので、log4netを参照する全てのプロジェクトでConfigureしないとログが出力されなくて悩むことになる
  • ASP.Netの場合は、aspnetの実行アカウントにログ出力フォルダへの書き込み権限を与えること。

下位フォルダにログを出す方法

XXXFileAppenderで、Fileパラメータにフォルダ名も含めて記述する。
このときパス区切り文字を"/"にする。("¥"ではだめだった。)

  • appenderの定義
    	<appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
    		<param name="File" value="log/LogFile.txt" />

エラーログをメールで送る方法

log4netの構成ファイルで以下の記述を追加。

  • appenderの定義
    	<appender name="SMTPAppender" type="log4net.Appender.SMTPAppender">
    		<param name="To" value="送り先" />
    		<param name="From" value="送り元" />
    		<param name="Subject" value="サブジェクト" />
    		<param name="SmtpHost" value="ホスト名" />
    		<param name="LocationInfo" value="false" />
    		<param name="BufferSize" value="8" />
    		<param name="Lossy" value="true" />
    		<evaluator type="log4net.spi.LevelEvaluator">
    			<param name="Threshold" value="ERROR"/>
    		</evaluator>
    		<layout type="log4net.Layout.PatternLayout">
    			<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
    		</layout>
    	</appender>

上記ではevaluator要素で「レベルがERROR以上の場合のみ送信」となるよう設定している。

  • rootレベルの設定
    	<root>
    		<level value="DEBUG" />
    		<appender-ref ref="SMTPAppender" />
    	</root>

ここでレベルがDEBUGとなっていても、evaluatorの設定が優先されるため、低レベルのログはメール送信されない。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-09-13 (木) 21:20:46 (1050d)