如何用 systemd-journal-upload 把 journal 命名空间日志转发到中央服务器?
如何用 systemd-journal-upload 把 journal 命名空间日志转发到中央服务器【免费下载链接】netdataThe fastest path to AI-powered full stack observability, even for lean teams.项目地址: https://gitcode.com/GitHub_Trending/ne/netdata如果你的服务通过LogNamespace写入了 systemd journal 命名空间namespace这些日志在默认配置下不会被systemd-journal-upload转发到中央服务器——在 systemd 254 之前的版本中systemd-journal-upload即使使用--merge选项也不会原生合并不同 journal 命名空间的日志。每个命名空间的日志存放在独立目录中必须为每个命名空间单独运行一次上传。本文的目标是在systemd 254 之前的版本上为指定命名空间文档以netdata命名空间为例配置独立转发让命名空间日志和系统日志一起到达中央的systemd-journal-remote服务器并在 Netdata 中作为独立来源展示。systemd 254 及以上版本有内置方案见文末systemd 254 及以上的简化方式。前置条件先让默认 journal 转发跑通命名空间转发建立在常规 journal 转发之上需要满足本机发送端已配置好systemd-journal-upload即默认 journal 已在向中央服务器推送中央服务器已安装并启用systemd-journal-remote。这一步的完整做法见仓库文档 被动 journal 中心化无加密发送端在/etc/systemd/journal-upload.conf中配置[Upload]段的URL默认端口19532中央端启用systemd-journal-remote.socket。本文的命名空间单元复用这份配置——下文脚本只补充--directory和--save-state参数上传目标地址仍来自journal-upload.conf。需要特别注意的一点该无加密方案只适用于可信网络日志会以明文复制不可在非受信网络中使用。为每个命名空间创建 systemd 模板单元方案的核心是每个命名空间对应一个systemd-journal-uploadnamespace实例单元由一个辅助脚本自动定位 journal 目录并启动systemd-journal-upload。这样每个命名空间的配置最小化状态文件由 systemd 的StateDirectory按实例管理。1. 创建单元模板文件在/etc/systemd/system/下创建systemd-journal-upload.service[Unit] DescriptionJournal Remote Upload Service for %I Namespace Documentationman:systemd-journal-upload(8) file:/usr/local/bin/start-journal-upload-namespace.sh Aftersystemd-journald.service network-online.target Wantsnetwork-online.target [Service] Usersystemd-journal-upload SupplementaryGroupssystemd-journal systemd-journal-remote PrivateTmpyes ProtectSystemstrict ProtectHomeyes StateDirectorysystemd/journal-upload.%i StateDirectoryMode0700 ExecStart/usr/local/bin/start-journal-upload-namespace.sh %I Restartalways RestartSec5 [Install] WantedBymulti-user.target其中%i表示未转义的实例名例如netdataStateDirectory保证每个命名空间有独立的状态目录。2. 创建辅助脚本在/usr/local/bin/下创建start-journal-upload-namespace.sh#!/bin/bash set -euo pipefail if [[ $# -lt 1 || -z $1 || $1 --debug ]]; then echo Usage: $0 namespace_name [--debug] 2 exit ${SYSTEMD_EXIT_CODE_CONFIG:-78} fi NAMESPACE_NAME$1 shift DEBUG_MODE0 [[ ${1:-} --debug ]] DEBUG_MODE1 JOURNAL_BASE_DIR/var/log/journal NAMESPACE_SUFFIX.$NAMESPACE_NAME UPLOADER_CMD/lib/systemd/systemd-journal-upload mapfile -t dirs (find $JOURNAL_BASE_DIR -maxdepth 1 -mindepth 1 -type d -name *${NAMESPACE_SUFFIX}) if [[ ${#dirs[]} -eq 0 ]]; then echo ERROR: No *${NAMESPACE_SUFFIX} journal directory found. 2 exit ${SYSTEMD_EXIT_CODE_CONFIG:-78} elif [[ ${#dirs[]} -gt 1 ]]; then echo ERROR: Multiple *${NAMESPACE_SUFFIX} journal directories found: 2 printf %s\n ${dirs[]} 2 exit ${SYSTEMD_EXIT_CODE_CONFIG:-78} fi NAMESPACE_JOURNAL_DIR${dirs[0]} if [[ -z ${STATE_DIRECTORY:-} ]]; then echo ERROR: \$STATE_DIRECTORY not set. Ensure StateDirectory is used in the unit. 2 [[ $DEBUG_MODE -eq 0 ]] exit ${SYSTEMD_EXIT_CODE_CONFIG:-78} || STATE_FILE_PATH\$STATE_DIRECTORY/state (variable not set) else STATE_FILE_PATH${STATE_DIRECTORY}/state fi cmd_args(--directory$NAMESPACE_JOURNAL_DIR) [[ -n ${STATE_DIRECTORY:-} ]] cmd_args(--save-state$STATE_FILE_PATH) if [[ $DEBUG_MODE -eq 1 ]]; then printf -v cmd_string %q $UPLOADER_CMD ${cmd_args[]} echo [DEBUG] Would execute: $cmd_string exit 0 else [[ -z ${STATE_DIRECTORY:-} ]] exit 1 exec $UPLOADER_CMD ${cmd_args[]} fi脚本的行为第一个参数是命名空间名由单元的%I传入可选的--debug只打印将要执行的命令而不真正启动上传在/var/log/journal顶层查找以.命名空间名结尾的目录找不到或找到多个都会以配置错误码78退出——所以服务启动失败时先看单元日志里的这两类报错$STATE_DIRECTORY由单元的StateDirectory注入脚本依赖它来持久化上传游标--save-state脚本中UPLOADER_CMD硬编码为/lib/systemd/systemd-journal-upload如果你的发行版把该二进制放在别处如/usr/lib/systemd/需要按实际路径替换。然后让脚本可执行会修改文件权限需 rootsudo chmod x /usr/local/bin/start-journal-upload-namespace.sh3. 启用命名空间上传服务为命名空间netdata启用并启动服务替换为你的命名空间名sudo systemctl enable --now systemd-journal-uploadnetdata.service脚本内置了--debug模式可以用它先确认将要执行的命令而不产生实际上传sudo /usr/local/bin/start-journal-upload-namespace.sh netdata --debug中央服务器侧需要做什么确认中央服务器正在运行systemd-journal-remote且已按前文的基础方案配置好接收端。命名空间日志会进入与普通系统日志相同的目标文档明确说明所有上传的日志包括命名空间日志会出现在同一个 remote journal 中除非你自行实施额外过滤。在 Netdata 侧中央服务器上运行的 Netdata 会自动检测并统一展示所有发送方的日志命名空间 journal 会作为独立来源出现需要 Netdata Agent v1.44 及以上且该平台构建包含 systemd-journal 插件——非 Linux 构建、ARMv6l 静态构建不包含该插件详见 systemd-journal 插件说明。验证转发是否生效在中央服务器上确认接收到了日志文件sudo ls -l /var/log/journal/remote/应能看到来自发送端的新文件按发送端 IP 命名。再确认systemd-journal-remote正在处理请求以下为文档示例输出注意Status: Processing requests...和CGroup下的 PIDsystemd-journal-remote.service - Journal Remote Sink Service Loaded: loaded (/etc/systemd/system/systemd-journal-remote.service; indirect; preset: disabled) Active: active (running) since Sun 2023-10-15 14:29:46 EEST; 2h 24min ago TriggeredBy: ● systemd-journal-remote.socket Docs: man:systemd-journal-remote(8) man:journal-remote.conf(5) Main PID: 2118153 (systemd-journal) Status: Processing requests... Tasks: 1 (limit: 154152) Memory: 2.2M CPU: 71ms CGroup: /system.slice/systemd-journal-remote.service └─2118153 /usr/lib/systemd/systemd-journal-remote --listen-http-3 --output/var/log/journal/remote/在发送端systemctl status systemd-journal-upload应显示类似文档示例输出注意Status: Processing input...● systemd-journal-upload.service - Journal Remote Upload Service Loaded: loaded (/lib/systemd/system/systemd-journal-upload.service; enabled; vendor preset: disabled) Active: active (running) since Sun 2023-10-15 10:39:04 UTC; 3h 17min ago Docs: man:systemd-journal-upload(8) Main PID: 4169 (systemd-journal) Status: Processing input... Tasks: 1 (limit: 13868) Memory: 3.5M CPU: 1.081s CGroup: /system.slice/systemd-journal-upload.service └─4169 /lib/systemd/systemd-journal-upload --save-state如果命名空间单元报错按脚本逻辑优先检查两点/var/log/journal下是否存在以.命名空间名结尾的目录StateDirectory是否已在单元中配置脚本对缺失的$STATE_DIRECTORY会明确报错。systemd 254 及以上的简化方式如果发送端已经升级到 systemd 254 或更新版本可以不用上面的每命名空间单元直接使用内置的--namespace选项systemd-journal-upload --namespace*这一条命令会把所有命名空间的日志包括默认命名空间交错在一起上传省去多个systemd-journal-upload实例。在 254 之前的版本上仍然需要本文描述的每命名空间单元方案。限制与已知边界systemd 254 之前systemd-journal-upload不会自动处理命名空间必须为每个命名空间手动配置转发这一点在 systemd-journal 插件 README 的集中化限制说明中也被明确列出。命名空间日志在中央端进入与普通日志相同的 remote journal文档没有给出内置的按命名空间过滤方案如需隔离要自行实施额外过滤。Docker 目前不支持 journal 命名空间上游 moby 问题未解决容器内无法通过LogNamespace建立命名空间。命名空间在 Netdata 中作为独立来源展示依赖接收端 Netdata 的 systemd-journal 插件该插件要求 Netdata Agent v1.44、Netdata Cloud 账号且不支持非 Linux 构建。基础方案无加密/TLS 加密的完整配置与验证见 被动 journal 中心化无加密 和 基于自签名证书的 TLS 加密方案总体架构见 Logs Centralization Points。【免费下载链接】netdataThe fastest path to AI-powered full stack observability, even for lean teams.项目地址: https://gitcode.com/GitHub_Trending/ne/netdata创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考