将log4net RemoteSyslogAppender与.Net Core一起使用

时间:2017-08-29 21:18:59

标签: .net-core log4net

我正在尝试使用log4net 2.0.8在.Net Core应用程序中同时使用RollingFileAppender和RemoteSyslogAppender。这是我的log4net.config文件的样子:

<?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>

如您所见,我使用syslog appender的自定义模式。当我运行我的.Net Core版本的应用程序(使用.Net Standard 1.3版本的ProgressiveLogging.Core)时,我确实输出到RollingFileAppender文件,但不是RemoteSyslogAppender。当我使用.Net 4.6.2(使用.Net 4.0版本的ProgressiveLogging.Core)运行我的测试应用程序时,它向两个appender输出正常。

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

是否有其他人能够获得类似工作的东西(使用带有.Net Core或.Net Standard的RemoteSysLogAppender)?

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

1 个答案:

答案 0 :(得分:2)

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