如何在delphi中完全从Cisco防火墙获取系统日志消息?

如何在delphi中完全从Cisco防火墙获取系统日志消息?,delphi,indy,cisco,syslog,Delphi,Indy,Cisco,Syslog,我想从端口514上的UDP读取系统日志。 我正在使用Delphi2010。我放置了一个IdUDPServer,将DefaultPort设置为514,将BuffeSize设置为1024。 此系统日志由Cisco firewall 5505生成。 我正在向我的防火墙发送ping命令,如下所示Ping 192.168.1.100-t 当我运行kiwi(一个监控系统日志消息的软件)时,我会得到这样的每一个ping的2条消息 %ASA-6-302021:faddr 192.168.1.4/1 gaddr

我想从端口514上的UDP读取系统日志。 我正在使用Delphi2010。我放置了一个IdUDPServer,将DefaultPort设置为514,将BuffeSize设置为1024。 此系统日志由Cisco firewall 5505生成。 我正在向我的防火墙发送ping命令,如下所示Ping 192.168.1.100-t 当我运行kiwi(一个监控系统日志消息的软件)时,我会得到这样的每一个ping的2条消息

%ASA-6-302021:faddr 192.168.1.4/1 gaddr 192.168.1.100/0 laddr 192.168.1.100/0的拆卸ICMP连接 %ASA-6-302020:为faddr 192.168.1.4/1 gaddr 192.168.1.100/0 laddr 192.168.1.100/0构建入站ICMP连接

但是在我的听众中,每次ping我只收到一条消息。这样地 %ASA-6-302020:为faddr 192.168.1.4/1 gaddr 192.168.1.100/0 laddr 192.168.1.100/0构建入站ICMP连接

我不知道为什么我不能从我的听众那里得到第一条信息。 我在IdUDPServer的OnRead事件中这样编写代码

procedure TMyTestOnSyslog.Listener514UDPRead(
  AThread: TIdUDPListenerThread; AData: TBytes; ABinding: TIdSocketHandle);
var S:string;
    i:Integer;
begin
  S:='';
  for i := 0 to High(AData) do
    S:=S+chr(Adata[i]);
  ...
end;

我该怎么办当我给我的一个朋友打电话询问此事时,我很失望。他说最好不要在德尔福使用印地,因为它有臭虫。所以我搜索了其他组件。有一个开源的。ICS(互联网组件套件)运行良好。你可以用任何Delphi版本或C++ Builder获得这个开源软件!p> 见此:

在产品部分选择ICS,您可以下载最新版本。 幸运的是,它有许多组件和TSysLogServer。它不会丢失任何UDP数据包。 UDP确实不能保证数据包不会丢失。但是当我看到其他程序,如kiwi和wiresharks正确地获取数据包时,我应该知道我的程序中问题的根源是组件

所以我的问题的答案是:不要使用印地


我不知道印地仅仅在德尔福有这样的问题,或者在其他语言中也是一样的|

在我处理代码并尝试测试之后。我在列表中收到302021错误消息,但这次没有302020!我认为,由于这两条消息同时出现,IdUDPServer无法同时读取这两条消息。但我不知道该怎么做才能解决这个问题:|试着改用
TIdSysLogServer
。默认情况下,它是侦听端口514的专用组件。每次收到新消息时,它都会触发
OnSysLog
事件。您可能需要做的唯一一件事是设置Cisco防火墙,将系统日志消息转发到运行应用程序的计算机的IP地址。问题是TIdSysLogServer本身是从TIdUDPServer继承的。我测试了TIdSysLogServer,得到了相同的结果:(Indy和ICS都是开源的,因此开发者社区可以为bug提供补丁。也许UDP问题已经在Indy的更高版本中得到了解决。我的第一个行动是更新库以检查bug是否仍然存在,而不是删除它。有趣的是……据我所知,Indy是作为commerc的开源替代品创建的现在人们开始迁移回来:-)