选项 1:删除--environment systemd

选项 1:删除--environment systemd

使用 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)。

相关内容