我在Google计算引擎(GCE)上运行多个CoreOS实例。CoreOS使用systemd的日志记录功能。如何将所有日志推送到远程目的地?据我所知,systemd日志没有远程日志记录功能。我目前的工作是这样的:
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
systemd早期版本216包括通过客户端/服务器进程对进行远程日志记录的功能。
http://www.freedesktop.org/software/systemd/man/systemd-journal-remote.html
使用-o short
的缺点是格式很难解析;CCD_ 2较好。如果您使用的是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。
Kelsey Hightower的journal-2-logentries对我们来说效果很好:https://logentries.com/doc/coreos/
如果你想顺便访问并启用没有舰队的部队:
#!/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
最近的python包可能很有用:journalpump
支持Elastic Search、Kafka和logplex输出。
您也可以在Rsyslog
中使用rsyslog-kafka
模块。
Rsyslog with moduels:
- imfile - input file
- omkafka - output to Kafka
定义json模板并将其推送给Apache Kafka。当日志在卡夫卡。。。