Proftpd 不会将 xferlogs 发送到 syslog

Proftpd 不会将 xferlogs 发送到 syslog

我有一台 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);
};

相关内容