使用 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)。要解决此问题,您可以将SyslogTcpSendermessageTransfer 属性设置为MessageTransfer.NonTransparentFraming

【讨论】:

感谢您的回答。我不再参与该项目,但我会尽快尝试测试您的解决方案并给您反馈!

以上是关于使用 SyslogNet.Client 通过 TCP 发送 SysLog 消息的主要内容,如果未能解决你的问题,请参考以下文章

使用iptables和tc对端口限速

Linux下TC使用说明

Linux 网络故障模拟工具TC

如何在 Linux 下使用 TC 优雅的实现网络限流

如何优雅地使用 windows total commander

适用于appr.tc的原生Android应用