2017-08-29 133 views
2

我想在log4net 2.0.8 .Net核心应用程序中使用RollingFileAppender和RemoteSyslogAppender。下面是我的log4net.config文件看起来像:使用log4net RemoteSyslogAppender与.Net核心

<?xml version="1.0" encoding="utf-8" ?> 
<log4net> 
    <root> 
    <priority value="Debug" /> 
    <appender-ref ref="FileAppender" /> 
    <appender-ref ref="SyslogAppender" /> 
    </root> 
    <appender name="FileAppender" type="log4net.Appender.RollingFileAppender"> 
    <file value="C:\ProgressiveLogs\ProgLoggerNetCoreDemo.log" /> 
    <appendToFile value="true" /> 
    <rollingStyle value="Composite" /> 
    <maxSizeRollBackups value="14" /> 
    <maximumFileSize value="15000KB" /> 
    <datePattern value="yyyyMMdd" /> 
    <staticLogFileName value="true" /> 
    <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 
    </layout> 
    </appender> 
    <appender name="SyslogAppender" type="log4net.Appender.RemoteSyslogAppender"> 
    <remoteAddress name="Address" value="syslogServer" /> 
    <remotePort name="Port" value="514" /> 
    <layout type="ProgressiveLogging.Core.ProgLayout.ProgPatternLayout, ProgressiveLogging.Core"> 
     <conversionPattern value="%json%newline" /> 
    </layout> 
    </appender> 
</log4net> 

正如你所看到的,我使用的系统日志的appender一个自定义模式。当我运行我的.Net Core版本的应用程序(它使用.Net Standard 1.3构建的ProgressiveLogging.Core)时,我得到的输出是RollingFileAppender文件,但不是RemoteSyslogAppender。当我使用.Net 4.6.2运行我的测试应用程序时(使用.Net 4.0构建的ProgressiveLogging.Core),它可以输出两个appender。

我在网上发现文档说明logNetnet RemoteSysLogAppender支持.Net Standard 1.3(https://logging.apache.org/log4net/release/framework-support.html)。

是否有其他人能够得到类似于工作的东西(使用RemoteSysLogAppender与.Net Core或.Net标准)?

添加了2017-09-01:我已经做了进一步的调查,发现这个归结为UDP数据包在.Net 4. *和.Net Standard之间的构建和发送方式的主要区别。 .Net 40的工作原理是将UDP消息全部发送到一个数据报(数据包)中,而.Net Standard将消息分成多个数据包,这些数据包似乎由我们的JSON消息中的逗号分隔。显然,我们的syslog守护进程无法理解这种废话。我要做一些直接测试,看看能否通过UDP发送到syslog中。

回答

2

经过更彻底的调查后,我发现log4net RemoteSyslogAppender没有问题。我的问题是我正在格式化最终由System.Net.Sockets.UdpClient发送的JSON消息。格式化将CRLF添加到字符串中,然后UdpClient对消息进行分隔并在这些CRLF边界上分割。这对Syslog没有意义。这是一个非常简单的修复 - 从调用NewtonSoft.Json.JsonConvert.SerializeObject中移除格式化选项。我从某个地方复制了一个包含Json字符串格式的片段。现在完美!