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.<bError_Click>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;
}
我设法用继承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);
}
}