我有一台 Proftpd v1.3.2 服务器,我需要发送所有日志(系统日志 + 身份验证日志 +传输日志) 到远程 syslog 服务器。它适用于系统+身份验证日志。但即使TransferLog
从配置文件中删除了“”,Proftpd 仍会继续打开/var/log/xferlog
以记录传输(我已检查lsof),并且不向系统日志服务器发送任何内容(我检查过tcpdump)。
我如何告诉 proftpd 将 xferlogs 发送到远程 syslog 服务器?
答案1
好的,我找到了一个解决方案:使用 fifo。在/etc/proftpd/proftpd.conf
:
#SystemLog /var/log/proftpd/proftpd.log
#ControlsLog /var/log/proftpd/controls.log
TransferLog /var/log/xferlog.fifo
然后 :
mknod /var/log/xferlog.fifo p
chmod 666 /var/log/xferlog.fifo
还有一个类似的 Perl 脚本(受到网上找到的几个脚本的启发),在 fifo 的另一端进行监听:
#!/usr/bin/perl -w
use strict;
use File::Basename qw(basename);
use Sys::Syslog qw(:DEFAULT setlogsock);
$|=1;
my $fifo_file = "/var/log/xferlog.fifo";
my $syslog_facility = 'daemon';
my $syslog_level = 'info';
my $program = "xfer_ftp";
unless (-p $fifo_file)
{
unlink $fifo_file;
system('mknod', $fifo_file, 'p') && die "can't mknod $fifo_file: $!";
system('chmod', '666', $fifo_file) && die "can't chown $fifo_file: $!";
}
my $fifo_fh;
open($fifo_fh, "+< $fifo_file") or die "The FIFO file \"$fifo_file\" is missing, and this program can't run without it.:$!";
setlogsock 'unix';
openlog($program, 'pid', $syslog_facility);
# just keep reading from the fifo and processing the events we read
while (<$fifo_fh>) {
chomp;
syslog($syslog_level, $_);
}
closelog();
# should never really come down here ...
close $fifo_fh;
exit(0);
如果您有更清洁的解决方案...:-)
答案2
您可能正在使用标准 rsyslog。我建议您使用 syslog-ng,它可以非常详细地控制您的日志。
这是我用于远程日志记录的一个例子。同样很棒的一点是,我们还可以使用 TCP 来传输日志,这有点复杂,但显示了灵活性。
如果您不想要,过滤器可以控制从日志中提取的内容,或者将某些类型过滤到某些文件。下面的示例将所有内容正常记录为日期格式,但会远程发送副本。
希望这可以帮助。
@version: 3.0
#First, set some global options.
options {
long_hostnames(off);
flush_lines(0);
use_dns(no);
use_fqdn(no);
owner("root");
group("adm");
perm(0640);
stats_freq(0);
bad_hostname("^gconfd$");
keep_hostname(yes);
check_hostname(yes);
};
source inputs {
file("/proc/kmsg" program_override("kernel: "));
unix-stream("/dev/log");
internal();
udp();
tcp(max_connections(100));
};
destination remote {
udp("remotesyslog.serversomewhere.com" port(514));
};
destination logpile {
file("/var/log/eit/$YEAR-$MONTH-$DAY/$FACILITY"
owner(root) group(root) perm(0600)
create_dirs(yes) dir_perm(0700));
};
log {
source(inputs);
destination(logpile);
destination(remote);
};