提供 TCP 系统日志接收

提供 TCP 系统日志接收

我正在尝试配置一个具有两个系统日志服务器的服务器。一是存储所有消息,二是分析它们进行统计。

我能弄清楚如何做到这一点的唯一方法是进行某种端口镜像,查找端口 514 上的所有入站数据包(但仍然允许原始数据包转到端口 514 上的 rsyslog),复制它们,然后发送将它们连接到同一个盒子上的另一个端口,同时保留源 IP。

我找到了 samplicator,但它不适用于系统上已绑定的端口。

我怎样才能做到这一点?

答案1

Rsyslog 转发设置

程序

在日志索引主机上设置 TCP 侦听 在 /etc/rsyslog.conf 中取消注释以下行。这将使 rsyslog 守护进程能够侦听 TCP 端口 514 上的传入请求。我们在这里使用 TCP,以便我们可以确信来自代理主机的消息到达索引器。 (更多内容见下文)

提供 TCP 系统日志接收

$ModLoad imtcp
$InputTCPServerRun 514
Add a line to /etc/rsyslog.conf to actually put the received logs in a specific file.

local3.*                        /local/logs/httpd-error
local4.*                        /local/logs/httpd-access```
Finally, restart the rsyslog process.

```service rsyslog restart```

**Set up the agent host**

On the agent host, the host that is running apache, add a file, /etc/rsyslog.d/apache.conf. This will be read at syslog start time. This file tells rsyslog to read /var/log/httpd/error_log (the default apache error log on CentOS) every 10 seconds and send its messages to the local3.info facility in syslog. (Expanded to also read Access logs and send those to local4.info)

$ModLoad imfile

# Default Apache Error Log
$InputFileName /var/log/httpd/error_log
$InputFileTag httpd-error-default:
$InputFileStateFile stat-httpd-error
$InputFileSeverity info
$InputFileFacility local3
$InputRunFileMonitor

# Default Apache Access Log
$InputFileName /var/log/httpd/access_log
$InputFileTag httpd-access-default:
$InputFileStateFile stat-httpd-access
$InputFileSeverity info
$InputFileFacility local4
$InputRunFileMonitor

$InputFilePollInterval 10

接下来,修改 /etc/rsyslog.conf 取消注释或将以下行添加到文件末尾。这告诉 rsyslog 设置日志队列并将任何 local3 和 local4 设施日志消息转发到 TCP 端口 192.168.10.11。 @@ 是 TCP 系统日志端口的 rsyslog 简写。如果您想通过 UDP 转发,请使用单个@。但是,在这种情况下可能不值得设置队列,因为 rsyslog 无法确保索引主机接收 UDP 数据包。

在此配置中,代理主机将存储无法发送到索引主机的所有日志消息。这对于处理索引主机正在重新启动或以其他方式不可用的情况很有用。

$WorkDirectory /var/lib/rsyslog # where to place spool files
$ActionQueueFileName fwdRule1 # unique name prefix for spool files
$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
$ActionQueueType LinkedList   # run asynchronously
$ActionResumeRetryCount -1    # infinite retries if host is down
local3.* @@192.168.10.11
local4.* @@192.168.10.11

最后,在代理主机上重新启动 rsyslog。

service rsyslog restart

测试配置

现在,如果您重新启动 apache 服务器(服务 httpd restart),您应该会看到在索引主机上的 /local/logs/httpd-error 中生成日志。如果没有,请检查主机之间是否有任何防火墙阻止,以及您的 rsyslog 配置更改是否正在正确解析。您可以使用以下命令检查 rsyslog 配置: /sbin/rsyslogd -c5 -f /etc/rsyslog.conf -N1

配置 Logstash 以使用新文件

此配置使用自定义 grok 解析器从消息中提取错误级别,并将我们在 rsyslog 配置中设置的标签提取到其自己的字段中。如需自定义 grok 过滤器的帮助,请查看http://grokdebug.herokuapp.com/

  input {
  file {
    type => "httpd-error-log"
    path => ["/local/logs/httpd-error"]
    sincedb_path => "/opt/logstash/sincedb-access"
    discover_interval => 10
  }

  file {
    type => "httpd-access-log"
    path => ["/local/logs/httpd-access"]
    sincedb_path => "/opt/logstash/sincedb-access"
    discover_interval => 10
  }
}

filter {
  if [type] == "httpd-error-log" {
    grok {
      match       => [ "message", "\S+ \d+ \d+:\d+:\d+ %{HOSTNAME} %{NOTSPACE:tag}: \[%{DAY} %{MONTH} %{MONTHDAY} %{TIME} %{YEAR}\] \[%{LOGLEVEL:level}\] %{GREEDYDATA}" ]
    }
    mutate {
      rename      => [ "program", "vhost" ]
    }
  }

  if [type] == "httpd-access-log" {
    grok {
      match       => [ "message", "\S+ \d+ \d+:\d+:\d+ %{HOSTNAME} %{NOTSPACE:tag}: %{COMBINEDAPACHELOG}" ]
      add_field     => { "level", "info" }
    }
  }
}

output {
  elasticsearch {
    host => "localhost"
  }
}

查看这个 GitHub 项目 https://gist.github.com/GaryRogers/85c8f2a805010ceeccc6

相关内容