ClickOnce and log4net UdpAppender gives log4japp=DefaultDoma

本文关键字:log4japp DefaultDoma gives UdpAppender and log4net ClickOnce | 更新日期: 2023-09-27 18:03:13

我有一个ClickOnce (c#)应用程序,它使用log4net UdpAppender使用XmlLayoutSchemaLog4j记录到一个服务。问题是日志中包含"DefaultDomain"作为log4japp,而不是真正的应用程序名称。

My UDP appender:

<appender name="UdpAppender" type="log4net.Appender.UdpAppender">
  <param name="RemoteAddress" value="127.0.0.1" />
  <param name="RemotePort" value="62215" />
  <layout type="log4net.Layout.XmlLayoutSchemaLog4j">
    <locationInfo value="true"/>
  </layout>
</appender>
输出:

<xml xmlns:log4j="http://jakarta.apache.org/log4j/">
  <log4j:event logger="MainWindow" timestamp="1400068443197" level="ERROR" thread="4">
    <receivedTimestamp>2014-05-14 11:54:07.459</receivedTimestamp>
    <log4j:message>Oh noes! (1)</log4j:message>
    <log4j:properties>
      <log4j:data name="log4japp" value="DefaultDomain" />
      <log4j:data name="log4net:UserName" value="NML'baltzersen" />
      <log4j:data name="log4jmachinename" value="lgx-Paw" />
      <log4j:data name="log4net:HostName" value="lgx-Paw" />
    </log4j:properties>
    <log4j:throwable>System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.
   at System.Windows.DependencyObject.GetValue(DependencyProperty dp)
   at Log4NetTestApp.MainWindow.&lt;bError_Click&gt;b__0(Object str)</log4j:throwable>
    <log4j:locationInfo class="Common.Logs" method="WriteLog" file="" line="0" />
  </log4j:event>
</xml>

如何使log4japp元素包含我的应用程序名称?

编辑:我的记录器类(LogB)有一个获取记录器的静态方法:

public static ILogB GetLogger(Type type)
{
  return new LogB(Logs.GetLogger(type));
}

日志。getlog:

public static ILog GetLogger(Type 
{
  return LogManager.GetLogger(type.Name);
}

和LogB的构造函数:

if (initiated)
{
  this.logger = logger;
  return;
}
if (File.Exists(log4netFile))
{
  FileInfo fileInfo = new FileInfo(log4netFile);
  XmlConfigurator.ConfigureAndWatch(fileInfo);
  initiated = true;
}

ClickOnce and log4net UdpAppender gives log4japp=DefaultDoma

我设法用继承UdpAppender的appender自己修复了这个问题:

public class MyUdpAppender : UdpAppender
{
  private readonly string app = Process.GetCurrentProcess().MainModule.FileName.Split('''').Last().Replace(".exe", "");
  protected override bool FilterEvent(LoggingEvent loggingEvent)
  {
    loggingEvent.GetProperties()["log4japp"] = this.app;
    return base.FilterEvent(loggingEvent);
  }
}