1

私の Log4Net 構成は次のようになります。

  <appender name="MainLogFileAppender" type="log4net.Appender.RollingFileAppender">
    <param name="File" value="${log4net_log_file_name}"/>
    <param name="AppendToFile" value="true"/>
    <rollingStyle value="Size"/>
    <maxSizeRollBackups value="1"/>
    <maximumFileSize value="1MB"/>
    <staticLogFileName value="true"/>
    <layout type="log4net.Layout.XmlLayoutSchemaLog4j">
      <locationInfo value="true" />
    </layout>
  </appender>

  <appender name="MemoryAppender" type="log4net.Appender.MemoryAppender" >
    <onlyFixPartialEventData value="true" />
  </appender>
</log4net>

次のように例外を記録しています。

 private readonly ILog _log = LogManager.GetLogger(typeof(LastChanceHandler));

        private void LogException(Exception ex)
        {
            _log.Fatal("Unhandled exception", ex);
        }

エラーをログに記録している間、ログに Throwable ノードが表示されません。XML を DTO に変換して UI に表示するため、現在のレイアウトが使用されます。

Throwable が設定されず、ログに保存されない理由を説明するものは何も見つかりませんでした。アイデアはありますか(開発ボックスをスロー可能にすることを検討しています。窓の外に)?

私のログからのエラーは次のとおりです。

<log4j:event logger="Hsbc.Ice.Shell.ViewModels.ShellViewModel" timestamp="1353076754456" level="ERROR" thread="1"><log4j:message>14 modules did not terminated in a timely manner : TradingCockpitModule,AuthenticationModule,ConfigurationModule,EntitlementsModule,Hsbc.Ice.CreditServices,EncryptionModule,ReportsModule,DiagnosticsModule,InterProcessCommunication,Layout,Logging,PersistenceModule,StorageModule,ICEExplorerManagerServiceModule</log4j:message><log4j:properties><log4j:data name="log4net:UserName" value="HBEU\steveget" /><log4j:data name="log4net:Identity" value="HBEU\steveget" /><log4j:data name="log4jmachinename" value="E8262XDZW4LZKEC" /><log4j:data name="log4japp" value="Hsbc.Ice.Shell.exe" /><log4j:data name="log4net:HostName" value="E8262XDZW4LZKEC" /></log4j:properties><log4j:locationInfo class="Hsbc.Ice.Shell.ViewModels.ShellViewModel" method="&lt;.ctor&gt;b__3" file="d:\CreditFlow\Tools\Hudson\data\jobs\Credit Shell\workspace\src\Shell\Hsbc.Ice.Shell\ViewModels\ShellViewModel.cs" line="107" /></log4j:event>
4

3 に答える 3

1

交換するだけです。

     private void LogException(Exception ex)
    {
        _log.Fatal("Unhandled exception", ex);
    }

と;

    private void LogException(Exception ex)
    {
        _log.Fatal("Unhandled exception:" + ex.ToString(), ex);
    }

情報を取得するためにも使用できex.StackTrace()ます。

.NET でスタック トレース全体が必要な場合

.NETにはスロー可能な構成はありません(または、少なくともドキュメントでそれについて何も見つけることができません) .JavaのthrowableようにC#には存在しないため、検索はJavaの結果のみを生成します。

于 2012-11-16T17:34:00.273 に答える
1

log4j ドキュメントから:

throwable: LoggingEvent にバインドされた Throwable トレースを出力するために使用されます。デフォルトでは、Throwable.printStackTrace() の呼び出しによって通常検出されるように、完全なトレースが出力されます。

Throwable はJava クラスであるため、結果として .Net では使用できません。おそらく、例外スタック トレースを代用できますが、実装されていません。

于 2012-11-16T17:30:10.970 に答える
0

答えを調べた後、上記のStuart Dunkeldの答えに基づいて何かを試すことにしました(彼に答えを与えました。完全を期すためにこれをここに置きました)。

基本的に、既存のレイアウト xml フォーマッタを継承してオーバーライドするカスタム レイアウトを作成しました。

オーバーライドされたメソッドの重要な部分は次のとおりです。

    if (exceptionString!=null && !string.IsNullOrEmpty(exceptionString.StackTrace))
    {
        writer.WriteStartElement("log4j:throwable");
        Transform.WriteEscapedXmlString(writer, exceptionString.StackTrace, InvalidCharReplacement);
        writer.WriteEndElement();
    }

完全を期すために、ここにクラス全体を示します。これにより、エラーのスタック トレースとそのメッセージをキャッチできます。

   public class Log4NetErrorLogger : XmlLayoutSchemaLog4j
    {
        private static readonly DateTime Date1970 = new DateTime(1970, 1, 1);
        protected override void FormatXml(XmlWriter writer, LoggingEvent loggingEvent)
        {
            if (loggingEvent.LookupProperty("log4net:HostName") != null &&
                loggingEvent.LookupProperty("log4jmachinename") == null)
            {
                loggingEvent.GetProperties()["log4jmachinename"] = loggingEvent.LookupProperty("log4net:HostName");
            }
            if (loggingEvent.LookupProperty("log4japp") == null && !string.IsNullOrEmpty(loggingEvent.Domain))
            {
                loggingEvent.GetProperties()["log4japp"] = loggingEvent.Domain;
            }
            if (!string.IsNullOrEmpty(loggingEvent.Identity) &&
                loggingEvent.LookupProperty("log4net:Identity") == null)
            {
                loggingEvent.GetProperties()["log4net:Identity"] = loggingEvent.Identity;
            }
            if (!string.IsNullOrEmpty(loggingEvent.UserName) &&
                loggingEvent.LookupProperty("log4net:UserName") == null)
            {
                loggingEvent.GetProperties()["log4net:UserName"] = loggingEvent.UserName;
            }
            writer.WriteStartElement("log4j:event");
            writer.WriteAttributeString("logger", loggingEvent.LoggerName);
            writer.WriteAttributeString("timestamp",
                                        XmlConvert.ToString(
                                            (long)
                                            (loggingEvent.TimeStamp.ToUniversalTime() - Date1970)
                                                .TotalMilliseconds));
            writer.WriteAttributeString("level", loggingEvent.Level.DisplayName);
            writer.WriteAttributeString("thread", loggingEvent.ThreadName);
            writer.WriteStartElement("log4j:message");
            Transform.WriteEscapedXmlString(writer, loggingEvent.RenderedMessage, InvalidCharReplacement);
            writer.WriteEndElement();
            object obj = loggingEvent.LookupProperty("NDC");
            if (obj != null)
            {
                string text = loggingEvent.Repository.RendererMap.FindAndRender(obj);
                if (!string.IsNullOrEmpty(text))
                {
                    writer.WriteStartElement("log4j:NDC");
                    Transform.WriteEscapedXmlString(writer, text, InvalidCharReplacement);
                    writer.WriteEndElement();
                }
            }
            PropertiesDictionary properties = loggingEvent.GetProperties();
            if (properties.Count > 0)
            {
                writer.WriteStartElement("log4j:properties");
                foreach (DictionaryEntry dictionaryEntry in properties)
                {
                    writer.WriteStartElement("log4j:data");
                    writer.WriteAttributeString("name", (string) dictionaryEntry.Key);
                    string text = loggingEvent.Repository.RendererMap.FindAndRender(dictionaryEntry.Value);
                    writer.WriteAttributeString("value", text);
                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
            }
            var exceptionString = loggingEvent.ExceptionObject;
            if (exceptionString!=null && !string.IsNullOrEmpty(exceptionString.StackTrace))
            {
                writer.WriteStartElement("log4j:throwable");
                Transform.WriteEscapedXmlString(writer, exceptionString.StackTrace, InvalidCharReplacement);
                writer.WriteEndElement();
            }
            if (LocationInfo)
            {
                LocationInfo locationInformation = loggingEvent.LocationInformation;
                writer.WriteStartElement("log4j:locationInfo");
                writer.WriteAttributeString("class", locationInformation.ClassName);
                writer.WriteAttributeString("method", locationInformation.MethodName);
                writer.WriteAttributeString("file", locationInformation.FileName);
                writer.WriteAttributeString("line", locationInformation.LineNumber);
                writer.WriteEndElement();
            }
            writer.WriteEndElement();
        }
    }
于 2012-11-19T13:49:41.767 に答える