1

私はCastleウィンザーを使用しており、ログ機能も保持する構成ファイルを使用して開始します(そして、実際にはすべてをそこに保持したいです)。

初期化時にウィンザーからエラーが発生した場合 (構成の誤り、依存関係の欠落などにより)、ロガーが開始されていないため、どこにもエラーを書き込むことができません...これが私のコードです:

    private static ILogger m_Logger { get; set; } 

    static void Main(string[] args)
    {
        try
        {
            // Windsor has missing dependencies
            var container = new WindsorContainer("windsor.xml");
            // Did not make it here...
            var logger = container.Resolve<ILogger>();
            m_Logger.Debug("Testing 123");
        }
        catch (Exception)
        {
            // Logger was not initialized, null reference exception!
            m_Logger.Debug("Testing 123");
        }
    }

ここでのオプションは何ですか?

ありがとう、ニル。

4

2 に答える 2

0

これは、そもそも IOC コンテナーを使用することに対する期待をすべて台無しにします。とにかく、ロガー (例: log4net) を catch ブロックで手動で作成し、ログに記録することができます。

...
catch (Exception)
{
    // Create logger here
    m_Logger = new Log4NetLogger(); // Assuming 'windsor.xml' configured to inject a Log4NetLogger
    m_Logger.Debug("Testing 123");
}
于 2013-03-26T14:31:33.770 に答える
0

Windows イベント ログに書き込むことができます。

catch (Exception ex)
{
    const string Source = "MySource";
    const string Log = "MyNewLog";

    // Create the source, if it does not already exist.
    if(!EventLog.SourceExists(Source))
    {
        EventLog.CreateEventSource(Source , Log);
    }

    // Create an EventLog instance and assign its source.
    EventLog myLog = new EventLog();
    myLog.Source = Source;

    string eventMessage = string.Empty;

    while (ex != null)
    {
        eventMessage += string.Format("{0}\n{1}\n{2}\n\n",
            ex.GetType().FullName,
            ex.Message,
            ex.SackTrace);
    }

    myLog.WriteEntry(eventMessage);
}
于 2012-08-07T12:21:36.760 に答える