使用Logstash通过UDP收集防火墙日志时遇地址占用错误
错误日志:
^X[INFO ] 2022-08-07 22:24:52.211 [[main]<udp] udp - Starting UDP listener {:address=>"192.168.80.90:5144"}
[ERROR] 2022-08-07 22:24:52.215 [[main]<udp] udp - UDP listener died {:exception=>#<Errno::EADDRINUSE: Address already in use - bind - Ne peut attribuer l'adresse demandéebind(2) for "192.168.80.90" port 5144>, :backtrace=>["org/jruby/ext/socket/RubyUDPSocket.java:200:inbind'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-udp-3.5.0/lib/logstash/inputs/udp.rb:129:inudp_listener'", "/usr/share/logstash/vendor/bundle/jruby/2.5.0/gems/logstash-input-udp-3.5.0/lib/logstash/inputs/udp.rb:81:inrun'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:410:ininputworker'", "/usr/share/logstash/logstash-core/lib/logstash/java_pipeline.rb:401:in `block in start_input'"]}
解决步骤:
定位占用端口的进程
执行命令查找UDP 5144端口的占用者:ss -ulpn | grep :5144或者使用
netstat(系统已安装的情况下):netstat -ulpn | grep :5144输出结果会显示占用端口的进程ID(PID)和进程名称。
处理占用进程
- 若占用进程无保留必要,直接终止:
之后重启Logstash即可。kill -9 <PID> - 若占用进程必须保留,修改Logstash监听端口:
打开Logstash输入配置文件,找到UDP输入模块,将port改为未被占用的端口(例如5145):
同时更新防火墙的日志输出端口为新端口,确保日志能正常发送到Logstash。input { udp { host => "192.168.80.90" port => 5145 codec => "syslog" # 根据防火墙日志格式调整,如json、plain等 } }
- 若占用进程无保留必要,直接终止:
验证端口可用性
用nc测试端口是否可被监听:nc -ul 192.168.80.90 5144若提示
Address already in use,说明端口仍被占用;若命令无输出且处于等待状态,说明端口可用。
内容的提问来源于stack exchange,提问作者jamaa

