使用 SyslogNet.Client 通过 TCP 发送 SysLog 消息
Posted
技术标签:
【中文标题】使用 SyslogNet.Client 通过 TCP 发送 SysLog 消息【英文标题】:Sending SysLog message through TCP with SyslogNet.Client 【发布时间】:2019-06-27 14:35:53 【问题描述】:我正在尝试向我在 Windows 10 中使用 SysLog Watcher 创建的系统日志服务器发送消息。
消息通过 TCP 和 UDP 协议发送,但使用 TCP 时不发送 Severity 和 Facility 标志。
使用 UDP 一切正常!
我已经尝试过 Kiwi Server,问题还是一样。
我正在使用 nuget SyslogNet.Client 并以这种方式发送 UDP 消息:
SysLogMessage msg = new SysLogMessage(SyslogMessage(
DateTimeOffset.Now,
14, // Facility - LogAlert
2, // Severity - Critical
LocalHostName ?? Environment.MachineName, // MachineName
"AppName", // AppName
null, // ProcId
"MessageType", // Message type name
"message to be sent"); // message to be sent
ISyslogMessageSerializer serializer = options.SyslogVersion == "5424"
? (ISyslogMessageSerializer)new SyslogRfc5424MessageSerializer()
: options.SyslogVersion == "3164"
? (ISyslogMessageSerializer)new SyslogRfc3164MessageSerializer()
: (ISyslogMessageSerializer)new SyslogLocalMessageSerializer();
SyslogMessage msg = CreateSyslogMessage(options);
ISyslogMessageSender sender = null;
if (options.NetworkProtocol.Equals("tcp", StringComparison.InvariantCultureIgnoreCase))
sender = IsEncryptedTCP ?
(ISyslogMessageSender)new SyslogEncryptedTcpSender(options.SyslogServerHostname, options.SyslogServerPort)
: (ISyslogMessageSender)new SyslogTcpSender(options.SyslogServerHostname, options.SyslogServerPort);
else if (options.NetworkProtocol.Equals("udp", StringComparison.CurrentCultureIgnoreCase))
sender = (ISyslogMessageSender)new SyslogUdpSender(options.SyslogServerHostname, options.SyslogServerPort);
else
sender = (ISyslogMessageSender)new SyslogLocalSender();
#endregion
sender.Send(msg, serializer);
同样,这在 UDP 上工作得很好,但是当使用 TCP 或 LocalSend 时,消息不会发送标志 Facility 和 Severity!
我希望看到标志 Facility 和 Severity 通过 SyslogNet.Client over TCP 协议发送!
谢谢!
【问题讨论】:
【参考方案1】:我已经找到了解决方案。 Kiwi syslog 似乎不理解八位字节计数(请参阅RFC6587)。要解决此问题,您可以将SyslogTcpSender
的messageTransfer
属性设置为MessageTransfer.NonTransparentFraming
【讨论】:
感谢您的回答。我不再参与该项目,但我会尽快尝试测试您的解决方案并给您反馈!以上是关于使用 SyslogNet.Client 通过 TCP 发送 SysLog 消息的主要内容,如果未能解决你的问题,请参考以下文章