9

我在 Google Compute Engine (GCE) 上运行多个 CoreOS 实例。CoreOS 使用 systemd 的日志记录功能。如何将所有日志推送到远程目标?据我了解,systemd journal 不具备远程日志记录功能。我目前的解决方法如下所示:

journalctl -o short -f | ncat <addr> <ip>

使用https://logentries.com通过 TCP使用其基于令牌的输入

journalctl -o short -f | awk '{ print "<token>", $0; fflush(); }' | ncat data.logentries.com 10000

有没有更好的方法?

编辑: https ://medium.com/coreos-linux-for-massive-server-deployments/defb984185c5

4

5 回答 5

10

systemd 216 之前的版本包括远程日志记录功能,通过客户端/服务器进程对。

http://www.freedesktop.org/software/systemd/man/systemd-journal-remote.html

于 2014-11-22T19:18:54.363 回答
7

使用的一个缺点-o short是格式难以解析。short-iso更好。如果您使用的是 ELK 堆栈,则导出为 JSON 会更好。像下面这样的 systemd 服务可以很好地将 JSON 格式的日志发送到远程主机。

[Unit]
Description=Send Journalctl to Syslog

[Service]
TimeoutStartSec=0
ExecStart=/bin/sh -c '/usr/bin/journalctl -o json -f | /usr/bin/ncat syslog 515'

Restart=always
RestartSec=5s

[Install]
WantedBy=multi-user.target

在另一边,logstash.conf对我来说包括:

input {
  tcp {
    port  => 1515
    codec => json_lines
    type  => "systemd"
  }
}

filter {
  if [type] == "systemd" {
    mutate { rename => [ "MESSAGE", "message" ] }
    mutate { rename => [ "_SYSTEMD_UNIT", "program" ] }
  }
}

这导致整个 journalctl 数据结构可用于 Kibana/Elasticsearch。

于 2015-02-11T18:41:00.013 回答
0

最近的一个 python 包我很有用:journalpump

支持 Elastic Search、Kafka 和 logplex 输出。

于 2017-04-29T11:13:59.037 回答
0

你也可以rsyslog-kafka在里面使用模块Rsyslog

Rsyslog with moduels:
 - imfile - input file
 - omkafka - output to Kafka

定义 json 模板并将它们推送到 Apache Kafka。当日志在 Kafka 中时...

于 2019-06-17T04:26:34.430 回答
0

Kelsey Hightower 的 journal-2-logentries 对我们来说效果很好:https ://logentries.com/doc/coreos/

如果您想插入并启用没有 Fleet 的单位:

#!/bin/bash
#
# Requires the Logentries Token as Parameter

if [ -z "$1" ]; then echo "You need to provide the Logentries Token!"; exit
0; fi

cat << "EOU1" > /etc/systemd/system/systemd-journal-gatewayd.socket
[Unit]
Description=Journal Gateway Service Socket
[Socket]
ListenStream=/run/journald.sock
Service=systemd-journal-gatewayd.service
[Install]
WantedBy=sockets.target
EOU1

cat << EOU2 > /etc/systemd/system/journal-2-logentries.service
[Unit]
Description=Forward Systemd Journal to logentries.com
After=docker.service
Requires=docker.service
[Service]
TimeoutStartSec=0
Restart=on-failure
RestartSec=5
ExecStartPre=-/usr/bin/docker kill journal-2-logentries
ExecStartPre=-/usr/bin/docker rm journal-2-logentries
ExecStartPre=/usr/bin/docker pull
quay.io/kelseyhightower/journal-2-logentries
ExecStart=/usr/bin/bash -c \
"/usr/bin/docker run --name journal-2-logentries \
-v /run/journald.sock:/run/journald.sock \
-e LOGENTRIES_TOKEN=$1 \
quay.io/kelseyhightower/journal-2-logentries"
[Install]
WantedBy=multi-user.target
EOU2

systemctl enable systemd-journal-gatewayd.socket
systemctl start systemd-journal-gatewayd.socket
systemctl start journal-2-logentries.service

rm -f $0
于 2016-04-07T23:49:02.240 回答