使用 filebeat-8.7.1,我已将其配置为将多个源推送到远程 elastisearch。我无法让它将自己的日志记录到本地文件中/var/log/filebeat/filebeat.log
,也无法阻止它将其日志转储到/var/log/syslog
(也会转储到 elastisearch)。
相关配置来自/etc/filebeat/filebeat.yml
:
filebeat.inputs:
- type: filestream
id: rsc-server
enabled: true
paths:
- /var/log/rstudio/rstudio-connect/rstudio*.log
fields:
log_type: rsc_server
- type: filestream
enabled: true
ignore_older: 5m
id: rsc-jobs
paths:
- /srv/R/RSC/jobs/[0-9]*/*/*
fields:
log_type: rsc
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 1
setup.kibana:
host: "http://my.elasti.host:30002"
output.elasticsearch:
hosts: ["http://my.elasti.host:30003"]
allow_older_versions: true
username: "myuser"
password: "mypass"
processors:
- add_host_metadata:
when.not.contains.tags: forwarded
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
logging:
- level: warning
- to_syslog: false
- to_stderr: false
- json: true
- files:
- path: /var/log/filebeat
- name: filebeat
- keepfile: 3
- permissions: 0644
从/etc/filebeat/modules.d/
目录中可以看到,启用的配置结果是:
# Module: nginx
# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-nginx.html
- module: nginx
# Access logs
access:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
#var.paths:
# Error logs
error:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
#var.paths:
# Ingress-nginx controller logs. This is disabled by default. It could be used in Kubernetes environments to parse ingress-nginx logs
ingress_controller:
enabled: false
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
#var.paths:
# Module: redis
# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-redis.html
- module: redis
# Main logs
log:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
#var.paths: ["/var/log/redis/redis-server.log*"]
# Slow logs, retrieved via the Redis API (SLOWLOG)
slowlog:
enabled: false
# The Redis hosts to connect to.
#var.hosts: ["localhost:6379"]
# Optional, the password to use when connecting to Redis.
#var.password:
# Module: system
# Docs: https://www.elastic.co/guide/en/beats/filebeat/master/filebeat-module-system.html
- module: system
# Syslog
syslog:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
#var.paths:
# Authorization logs
auth:
enabled: true
# Set custom paths for the log files. If left empty,
# Filebeat will choose the paths depending on your OS.
#var.paths:
我相信系统模块使用的目的syslog
是从...拉 /var/log/syslog
,而不是推送到它。 (当我禁用该模块时,行为不会改变。)
我如何修复logging.*
将日志发送到的部分/var/log/filebeat/
,以及如何阻止它发送到 syslog 和/var/log/syslog
?
(这是在 ubuntu-22.04 VM 上。)
编辑:/lib/systemd/system/filebeat.service
有一个空的BEAT_LOG_OPTS
参数(这是默认文件,不是我编辑的):
[Unit]
Description=Filebeat sends log files to Logstash or directly to Elasticsearch.
Documentation=https://www.elastic.co/beats/filebeat
Wants=network-online.target
After=network-online.target
[Service]
UMask=0027
Environment="GODEBUG='madvdontneed=1'"
Environment="BEAT_LOG_OPTS="
Environment="BEAT_CONFIG_OPTS=-c /etc/filebeat/filebeat.yml"
Environment="BEAT_PATH_OPTS=--path.home /usr/share/filebeat --path.config /etc/filebeat --path.data /var/lib/filebeat --path.logs /var/log/filebeat"
ExecStart=/usr/share/filebeat/bin/filebeat --environment systemd $BEAT_LOG_OPTS $BEAT_CONFIG_OPTS $BEAT_PATH_OPTS
Restart=always
[Install]
WantedBy=multi-user.target
重新加载后(性能没有变化):
# systemctl daemon-reload
# systemctl restart filebeat.service
# systemctl status filebeat.service
● filebeat.service - Filebeat sends log files to Logstash or directly to Elasticsearch.
Loaded: loaded (/lib/systemd/system/filebeat.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2023-05-04 14:49:12 UTC; 20s ago
Docs: https://www.elastic.co/beats/filebeat
Main PID: 2080223 (filebeat)
Tasks: 25 (limit: 76964)
Memory: 114.4M
CPU: 5.315s
CGroup: /system.slice/filebeat.service
└─2080223 /usr/share/filebeat/bin/filebeat --environment systemd -c /etc/filebeat/filebeat.yml --path.home /usr/share/filebeat --path.config /etc/filebeat --path.data /var/lib/filebeat --path.logs /var/log/filebeat
该进程以 root 身份运行,并且该/var/log/filebeat
目录由 root 拥有并具有正常权限:
# ps faxu | grep [/]filebeat
root 2080223 9.4 0.1 2635592 169112 ? Ssl 14:49 0:36 /usr/share/filebeat/bin/filebeat --environment systemd -c /etc/filebeat/filebeat.yml --path.home /usr/share/filebeat --path.config /etc/filebeat --path.data /var/lib/filebeat --path.logs /var/log/filebeat
# ll -d /var/log/filebeat
drwxr-xr-x 2 root root 4096 May 4 12:54 /var/log/filebeat/
# ll /var/log/filebeat
total 8
drwxr-xr-x 2 root root 4096 May 4 12:54 ./
drwxr-xr-x 18 root syslog 4096 May 4 12:54 ../
我--environment systemd
看到filebeat 命令行选项方法
如果指定了 systemd 或容器,Filebeat 将默认记录到 stdout 和 stderr。
这表明日志记录将转到 ,这是/var/log/syslog
由于systemd
处理来自进程的 stdout/stderr 的方式。这似乎是进步,但我们仍然没有将日志记录转到/var/log/filebeat/
,而这最终应该是 stdout/stderr 应该去的地方(这将解决将日志记录到 的问题/var/log/syslog
)。
答案1
查看帖子 Filebeat 拒绝记录到文件。
那里的解释引自 发行说明 是:
在具有 systemd 的系统上,Beats 日志现在默认写入 journald 而不是文件。要恢复此行为,请使用空值覆盖 BEAT_LOG_OPTS
并且解决方案本身可能能够适应您的环境:
要覆盖这些变量,请在 /etc/systemd/system/filebeat.service.d 目录中创建一个插入单元文件。
要使用 Filebeat 文件中的 [日志记录] 设置,请清空环境变量。例如:
[Service] Environment="BEAT_LOG_OPTS="
要应用更改,请重新加载 systemd 配置并重新启动服务:
systemctl daemon-reload systemctl restart filebeat
建议您使用配置管理工具来包含插件单元文件。如果您需要手动添加插件,请使用 systemctl edit filebeat.service 。
参考filebeat的命令行来了解单元文件的作用和可以做什么: https://www.elastic.co/guide/en/beats/filebeat/7.0/command-line-options.html#global-flags 4
要查看安装附带的默认 filebeat 单元文件,请执行以下操作:
systemctl status filebeat
并检查单元文件的内容。(单元文件的路径位于上述命令的输出中。)
答案2
harrymc 帮助找出了罪魁祸首,这里有一些最后的步骤以及一种替代的解决方法。
filebeat 日志记录的问题/var/log/syslog
在于服务,而不是 filebeat 本身:在 filebeat 命令行上systemd
使用(这是--environment systemd
默认在 ubuntu 上,这可能是问题的一部分)导致 filebeat 强制将日志记录到 stdout。这与文档这表明,只有在未定义日志记录时才会发生这种绕过:
-environment
For logging purposes, specifies the environment that Filebeat is
running in. This setting is used to select a default log output
when no log output is configured. Supported values are: systemd,
container, macos_service, and windows_service. If systemd or
container is specified, Filebeat will log to stdout and stderr
by default.
选项 1:删除--environment systemd
运行systemctl edit filebeat.service
,并从中删除命令行参数ExecStart
(首先清除该变量)。编辑后的文本应包含
### /lib/systemd/system/filebeat.service
[Service]
ExecStart=
ExecStart=/usr/share/filebeat/bin/filebeat $BEAT_LOG_OPTS $BEAT_CONFIG_OPTS $BEAT_PATH_OPTS
首先空的 ExecStart=
是故意的:如果没有它,systemd 将会抱怨Service has more than one ExecStart= setting
。
通过这样做,我们现在看到了/var/log/filebeat/filebeat-20230504.ndjson
。
非常感谢@user1686 帮助我找到多种ExecStart=
设置的解决方案。
选项 2:通过 systemd 重定向 stdout/stderr
/lib/systemd/system/filebeat.service
另一个选项是让 filebeat 继续转储到其 stdout/stderr,并使用其内部机制重定向到文件。(如果您在选项 1 中进行了更改,那么撤消该更改此选项。
打电话systemctl edit filebeat.service
并附上此信息,
[Service]
StandardOutput=file:/var/log/filebeat/filebeat_stdout.log
StandardError=file:/var/log/filebeat/filebeat_stderr.log
(存储在 内/etc/systemd/system/filebeat.service.d/override.conf
)。然后重新启动服务,我们现在看到/var/log/filebeat/filebeat_stdout.log
(和_stderr
)。