Tcp

在 syslog-ng 中使用網路指令時出現“EOF 空閒時”

  • October 29, 2020

我想將日誌從本地機器轉發到遠端伺服器。借助 SSH 隧道,可以通過 localhost:5514 訪問遠端伺服器。我寫了以下conf:

# Filters
filter f_local0 { facility(local0); };
filter f_worker { program("^worker."); };

# Destinations
destination d_log01_local { file("/home/myuser/logs/worker/$YEAR$MONTH$DAY/$PROGRAM.$YEAR$MONTH$DAY" template("$HOST $MSG\n") create_dirs(yes) dir_group("adm") group("adm") dir_perm(0770) perm(0644) ); };
destination d_log01_remote { network("localhost" transport(tcp) port(5514) persist-name("remote_worker") disk-buffer( reliable(yes) disk-buf-size(50000000) )); };

# Logs
log { source(s_src); filter(f_local0); filter(f_worker); destination(d_log01_local); };
log { source(s_src); filter(f_local0); filter(f_worker); destination(d_log01_remote); };

本地目的地執行良好,但遠端目的地沒有:我沒有在位於 localhost:5514 的伺服器上收到任何日誌。

當 I 時tail -f /var/log/syslog,syslog 記錄以下行:

Oct 22 11:25:05 esad-10076 syslog-ng[17319]: Syslog connection established; fd='35', server='AF_INET(127.0.0.1:5514)', local='AF_INET(0.0.0.0:0)'
Oct 22 11:25:05 esad-10076 syslog-ng[17319]: EOF occurred while idle; fd='35'
Oct 22 11:25:05 esad-10076 syslog-ng[17319]: Syslog connection broken; fd='35', server='AF_INET(127.0.0.1:5514)', time_reopen='60'

我不明白這個錯誤,也不知道如何解決它。

我應該指定在編寫這個 conf 之前,我有另一個 conf 用來syslog代替,network這個 conf 可以完美地工作。我現在只需要使用網路來使用的功能,reliable以便在網路中斷的情況下不會失去任何日誌。

# Filters
filter f_local0 { facility(local0); };
filter f_worker { program("^worker."); };

# Destinations
destination d_log01_local { file("/home/myuser/logs/worker/$YEAR$MONTH$DAY/$PROGRAM.$YEAR$MONTH$DAY" template("$HOST $MSG\n") create_dirs(yes) dir_group("adm") group("adm") dir_perm(0770) perm(0644) ); };
destination d_log01_remote { syslog("localhost" transport(tcp) port(5514) persist-name("remote_worker")); };

# Logs
log { source(s_src); filter(f_local0); filter(f_worker); destination(d_log01_local); };
log { source(s_src); filter(f_local0); filter(f_worker); destination(d_log01_remote); };

問題發生在另一端:接收方。目前有兩種不同的 syslog 協議:rfc3164一種(舊的)和rfc5424一種(新的)。有關更多資訊,請參閱此部落格文章

我正在使用舊協議在我的伺服器上接收日誌,並且消息與使用較新協議的發送機器發送的日誌不匹配(因此出現“標頭”問題)。

我的conf如下:

source mysource {
       syslog(
              ip(0.0.0.0) 
              transport(udp) 
              port(514) 
              max-connections(80) 
              keep-hostname(yes) 
       );
       syslog(
              ip(0.0.0.0) 
              transport(tcp) 
              port(514) 
              max-connections(80) 
              log_iw_size(8000)
              keep-hostname(yes) 
       );
};

...

當我tail -f /var/log/syslog,我收到以下錯誤:

Oct 29 16:37:28 servername syslog-ng[718]: Syslog connection accepted; fd='83', client='AF_INET(127.0.0.1:40034)', local='AF_INET(0.0.0.0:514)'
Oct 29 16:37:28 servername syslog-ng[718]: Invalid frame header; header=''
Oct 29 16:37:28 servername syslog-ng[718]: Syslog connection closed; fd='83', client='AF_INET(127.0.0.1:40034)', local='AF_INET(0.0.0.0:514)'

編寫以下行代替這兩個syslog指令可以解決問題:

source mysource {
   network(transport(tcp) port(514) max-connections(80));
}

引用自:https://serverfault.com/questions/1039675