过去,我使用 syslog-ng 或 rsyslog 将系统日志发送到网络上其他位置的专用日志服务器。然而,使用 systemd,以前存储在 /var/log/secure 或 /var/log/auth.log (取决于您的发行版)中的 sudo 命令之类的内容现在存储在日志中。
我知道 /etc/systemd/journald.conf 有一个ForwardToSyslog=yes
选项可以让我回到原来的方式,但这似乎是一个不优雅的倒退。 systemd 是否有内置方法将日志发送到 Logrhythm、ELK 或类似的中央日志服务器,或者设置ForwardToSyslog=yes
正确的方法来执行此操作?
答案1
看来 systemd 确实不是具有将消息转发到系统日志服务器的内置方法。红帽官方推荐是使用该imjournal
模块允许 rsyslog 读取日志日志并将这些日志转发到中央日志服务器,方法是在 /etc/rsyslog.conf 中设置以下内容:
module(load="imjournal"
PersistStateInterval="number_of_messages"
StateFile="path"
ratelimit.interval="seconds"
ratelimit.burst="burst_number"
IgnorePreviousMessages="off/on")
他们提供了这些选项的使用细节,并指出
和消息数,您可以指定必须保存日志数据的频率。每次达到指定的消息数量时都会发生这种情况。
代替小路以及状态文件的路径。该文件跟踪最后处理的日记条目。
和秒,您设置速率限制间隔的长度。在此时间间隔内处理的消息数量不能超过burst_number 中指定的值。默认设置为每 600 秒 20,000 条消息。 Rsyslog 丢弃在指定时间范围内最大突发之后出现的消息。
和忽略以前的消息您可以忽略日志中当前的消息并仅导入新消息,这在未指定状态文件时使用。默认设置为关闭。请注意,如果此设置关闭并且没有状态文件,则日志中的所有消息都会被处理,即使它们已经在之前的 rsyslog 会话中被处理过。
答案2
我之前没有仔细阅读过imjournald,但是在阅读了James Shewey的回答之后,我认为这真的很简单。
使用规则集,您可以实现您想要的一切。
module(load="imjournal"
PersistStateInterval="number_of_messages"
StateFile="path"
ratelimit.interval="seconds"
ratelimit.burst="burst_number"
IgnorePreviousMessages="off/on"
ruleset="journald" #bind this action to the ruleset "journald"
)
#declare ruleset "journald"
ruleset(
name="journald"
queue.type="FixedArray"
queue.spoolDirectory="/var/run/rsyslog/queues"
queue.filename="stats_ruleset"
queue.lowwatermark="20000"
queue.maxdiskspace="100m"
queue.size="5000000"
queue.dequeuebatchsize="1000"
queue.saveonshutdown="on"
) {
# add here actions you want to perform
action(
name="impstats_to_es"
type="omelasticsearch"
server="127.0.0.1"
serverport="9200"
template="stats"
searchIndex="impstats"
searchType="impstats"
bulkmode="on"
action.resumeretrycount="-1"
)
}