コンテンツにスキップ

Journald


Journald 収集器は、Linux システム上で systemd journal (journald) からログを収集するために使用します。外部バイナリラッパーを使って libsystemd と連携し、journal から構造化されたログエントリを効率よく収集します。

前提条件

  • Linux 限定: systemdjournald が必要です
  • libsystemd: 外部バイナリには libsystemd 開発ライブラリが必要です
  • 権限: DataKit に journal ファイルの読み取り権限が必要です(通常は systemd-journal グループへの追加が必要です)

システム要件の確認

journald 収集器を導入する前に、システムが要件を満たしていることを確認してください。

次のコマンドで簡易チェックできます。

systemctl --version >/dev/null 2>&1 && journalctl -n 1 >/dev/null 2>&1 && echo "Systemd OK" || echo "Systemd not available"

以下は完全な事前確認スクリプトです。

journald-prereq-check.sh
#!/bin/bash
# journald-prereq-check.sh - systemd 要件の検証

echo "=== Journald 収集器の前提条件チェック ==="
echo

# 1. systemctl が存在するか確認
echo -n "1. systemctl コマンド: "
if command -v systemctl >/dev/null 2>&1; then
    VERSION=$(systemctl --version | head -1)
    echo "✅ 見つかりました - $VERSION"
else
    echo "❌ 見つかりません - systemctl がインストールされていません"
    exit 1
fi

# 2. libsystemd ライブラリを確認
echo -n "2. libsystemd.so.0: "
if ldconfig -p 2>/dev/null | grep -q "libsystemd.so.0"; then
    LIBPATH=$(ldconfig -p 2>/dev/null | grep "libsystemd.so.0" | head -1 | awk '{print $NF}')
    echo "✅ 見つかりました - $LIBPATH"
else
    echo "❌ 見つかりません - libsystemd.so.0 が不足しています"
    exit 1
fi

# 3. journalctl のアクセス権を確認
echo -n "3. journalctl アクセス: "
if journalctl -n 1 >/dev/null 2>&1; then
    echo "✅ 正常 - journal を読み取れます"
else
    echo "⚠️  制限あり - journalctl は存在しますが読み取り権限がありません"
fi

# 4. journal ディレクトリを確認
echo "4. Journal ディレクトリ: "
for dir in "/var/log/journal" "/run/log/journal"; do
    echo -n "   $dir: "
    if [ -d "$dir" ]; then
        if [ -r "$dir" ]; then
            echo "✅ 存在し、読み取り可能です"
        else
            echo "⚠️  存在しますが読み取り不可です"
        fi
    else
        echo "❌ 見つかりません"
    fi
done

# 5. systemd バージョンを確認
echo -n "5. systemd バージョン: "
SYSTEMD_VERSION=$(systemctl --version | head -1 | grep -oP 'systemd \K\d+' || echo "0")
if [ "$SYSTEMD_VERSION" -ge 205 ]; then
    echo "✅ v$SYSTEMD_VERSION (最低要件 v205 を満たしています)"
else
    echo "⚠️  v$SYSTEMD_VERSION (推奨バージョン v205 未満です)"
fi

echo
echo "=== チェック完了 ==="

journald-prereq-check.sh として保存して実行します。

chmod +x journald-prereq-check.sh
./journald-prereq-check.sh

期待される出力:

=== Journald 収集器の前提条件チェック ===

1. systemctl コマンド: ✅ 見つかりました - systemd 257 (257.3-1-arch)
2. libsystemd.so.0: ✅ 見つかりました - /usr/lib/libsystemd.so.0
3. journalctl アクセス: ✅ 正常 - journal を読み取れます
4. Journal ディレクトリ:
   /var/log/journal: ✅ 存在し、読み取り可能です
   /run/log/journal: ✅ 存在し、読み取り可能です
5. systemd バージョン: ✅ v257 (最低要件 v205 を満たしています)

=== チェック完了 ===

考えられるトラブルシューティング:

問題 解決策
systemctl: command not found systemd をインストールするか、代替のログ収集方法を使用してください
libsystemd.so.0: cannot open systemd-libs をインストールしてください: apt install libsystemd0 または yum install systemd-libs
journalctl: no read access ユーザーを systemd-journal グループに追加してください: usermod -aG systemd-journal $USER
/var/log/journal not found 永続化 journal を有効にしてください: mkdir -p /var/log/journal && systemd-tmpfiles --create

設定

収集器設定

DataKit のインストールと起動が完了したら、設定ファイルをコピーして Journald 収集器を有効化します。

DataKit のインストールディレクトリ配下にある conf.d/samples ディレクトリへ移動し、journald.conf.samplejournald.conf にコピーします。例:

# 外部バイナリを使って systemd journal ログを収集
[[inputs.journald]]
  ## 収集器名
  name = 'journald'

  ## デーモンとして実行(journald 収集に必要)
  daemon = true

  http_endpoint = "http://localhost:9529"
  log_level = "info"
  log_path = "/usr/local/datakit/externals/journald.log"

  ## datakit-journald バイナリのパス
  ## Default: searches in /usr/local/datakit/externals/datakit-journald and ./externals/datakit-journald
  # cmd = "/usr/local/datakit/externals/datakit-journald"

  ## 外部プロセスの確認間隔(非 daemon モード向け)
  # interval = "10s"

  ## コンテナ/Kubernetes モード専用の rootfs マウントポイント
  ## DataKit は絶対パスを自動で前置きする際のホストルートプレフィックスとしてこれを使用します
  ## また、ホスト側の systemd ライブラリ準備(copy_node_libs)にも使用します。
  mount_dir = "/rootfs"

  ## Journal ディレクトリのパス
  ## ホストインストール: デフォルトパスを使用
  ## コンテナ/Kubernetes: DataKit は絶対パスに mount_dir を自動で前置きします。
  paths = [
    "/var/log/journal",      # 永続ストレージ
    "/run/log/journal",      # ランタイムストレージ
  ]

  ## systemd unit 名でフィルタ(glob パターン対応)
  ## 空 = すべての unit
  # units = ["*.service", "docker.service", "kubelet.service"]

  ## 優先度レベルでフィルタ
  ## Levels: emerg(0), alert(1), crit(2), err(3), warning(4), notice(5), info(6), debug(7)
  ## 空 = すべての優先度
  # priorities = ["err", "warning", "crit", "alert", "emerg"]

  ## フィールド選択 - デフォルトではすべて収集し、特定フィールドのみ除外
  exclude_fields = [
    "_BOOT_ID",
    "_MACHINE_ID",
    "__MONOTONIC_TIMESTAMP",
  ]

  ## 収集動作
  ## tail_only=true: 新規エントリのみ収集(cursor 不要)
  ## tail_only=false: 最後の位置から読み取る(cursor 必須)
  tail_only = true
  max_entries_per_batch = 1000

  ## cursor 管理(tail_only=false のときのみ使用)
  # save_cursor = true
  # cursor_file = "/usr/local/datakit/cache/journald.cursor"

  ## 外部バイナリ用の環境変数
  # envs = [
  #   "LD_LIBRARY_PATH=/usr/local/datakit/externals:$LD_LIBRARY_PATH",
  # ]

  ## ホスト側 systemd ライブラリ準備:
  ## - コンテナ/Kubernetes(Docker または Kubernetes): 自動的に true に強制されます。
  ## - 非コンテナのホスト: デフォルトでは無効です。手動で有効化する場合は copy_node_libs_files を明示してください。
  ## - コンテナ/kubernetes モードでは、copy_node_libs_files が空の場合、DataKit はまず
  ##   libsystemd.so* をコピーし、その後 "LD_LIBRARY_PATH=<dst> ldd libsystemd.so.0"
  ##   形式の依存関係探索を行い、足りない .so ファイルを自動でコピーします。
  # copy_node_libs = true
  ## 省略可能な上書きファイル一覧。設定した場合は、このパターン/ファイルだけをコピーします。
  # copy_node_libs_files = [
  #   "libsystemd.so*",
  #   "liblz4.so*",
  #   "libzstd.so*",
  #   "liblzma.so*",
  #   "libcap.so*",
  #   "libgcrypt.so*",
  #   "libgpg-error.so*",
  #   "libselinux.so*",
  #   "libmount.so*",
  #   "libblkid.so*",
  #   "libacl.so*",
  #   "libpcre2-8.so*",
  #   "libpcre.so*",
  # ]

  ## 外部バイナリへの追加引数
  # args = []

  [inputs.journald.tags]
    # 必要に応じてカスタムタグを追加
    # environment = "production"
    # cluster = "k8s-cluster-1"

設定後、DataKit を再起動します。

ConfigMap で収集器設定を注入 するか、ENV_DATAKIT_INPUTS を設定して有効化できます。

設定オプション

オプション デフォルト値 説明
paths []string ["/var/log/journal", "/run/log/journal"] Journal ディレクトリのパス
units []string [] systemd unit 名でフィルタ(glob パターン対応、例: *.service
priorities []string [] 優先度でフィルタ: emergalertcriterrwarningnoticeinfodebug
exclude_fields []string [] 収集から除外する journal フィールド(例: _BOOT_ID_MACHINE_ID
tail_only bool true 新しいエントリのみ収集します(起動時に過去ログをスキップ)
max_entries_per_batch int 1000 1 バッチあたりの最大収集件数
save_cursor bool true 再起動後に復旧できるよう読み取り位置を永続化します
cursor_file string /usr/local/datakit/cache/journald.pos cursor 位置を保存するパス
mount_dir string "/rootfs" コンテナ/Kubernetes モードでのみ使う rootfs マウントディレクトリ。DataKit は絶対 paths の前置きと、ホスト側動的ライブラリ準備のソースルートとしてこれを使用します
copy_node_libs bool false(コンテナまたは Kubernetes では自動的に true に強制) external collector 起動前に、mount_dir からホスト側動的ライブラリを DataKit の external-libs ディレクトリへコピーするかどうか。コンテナまたは Kubernetes 環境(datakit.Docker || config.IsKubernetes())では自動で有効になります
copy_node_libs_files []string [] コピーする動的ライブラリのファイル名または glob 一覧。明示設定した場合はその一覧のみをコピーします。コンテナ/Kubernetes の自動モードで空の場合、DataKit はまず libsystemd.so* をコピーし、その後 LD_LIBRARY_PATH=/usr/local/datakit/externals/systemd-libs ldd libsystemd.so.0 形式の依存関係探索を行って不足する .so を自動補完します。非コンテナ/Kubernetes で copy_node_libs=true のまま空にすると設定エラーとして起動に失敗します

ログフィールド

journald

Systemd ログです。注意: 利用可能なフィールドは systemd のバージョンによって異なります。各フィールドの説明にあるバージョン表記(例: v188+、v205+)を参照してください。

Tags & Fields Description
host
(tag)
ホスト名(_HOSTNAME から、v188+)
service
(tag)
サービス識別子(SYSLOG_IDENTIFIER_SYSTEMD_UNIT、または _COMM から)
CODE_FILE デバッグ用のソースコードファイル名(v188+)
Type: string
Unit: N/A
CODE_FUNC デバッグ用の関数名(v188+)
Type: string
Unit: N/A
CODE_LINE デバッグ用のソースコード行番号(v188+)
Type: int
Unit: N/A
COREDUMP_CMDLINE クラッシュ時の完全なコマンドライン(v188+)
Type: string
Unit: N/A
COREDUMP_CWD クラッシュ時のカレントワーキングディレクトリ(v188+)
Type: string
Unit: N/A
COREDUMP_EXE クラッシュしたバイナリの実行可能パス(v188+)
Type: string
Unit: N/A
COREDUMP_GID クラッシュしたプロセスの GID(v188+)
Type: int
Unit: N/A
COREDUMP_HOSTNAME クラッシュ時のホスト名(v188+)
Type: string
Unit: N/A
COREDUMP_PID クラッシュしたプロセスの PID(v188+)
Type: int
Unit: N/A
COREDUMP_ROOT ルートディレクトリ、通常は /(v188+)
Type: string
Unit: N/A
COREDUMP_SIGNAL クラッシュを引き起こしたシグナル番号(v188+)
Type: int
Unit: N/A
COREDUMP_STACKTRACE 完全なスタックトレースのバックトレース(v188+)
Type: string
Unit: N/A
COREDUMP_TIMESTAMP クラッシュ時刻のマイクロ秒値(v188+)
Type: int
Unit: timeStamp,usec
COREDUMP_UID クラッシュしたプロセスの UID(v188+)
Type: int
Unit: N/A
COREDUMP_UNIT クラッシュした system unit(v198+)
Type: string
Unit: N/A
COREDUMP_USER_UNIT クラッシュした user unit(v198+)
Type: string
Unit: N/A
DOCUMENTATION ドキュメント URL http/https/file/man/info(v246+)
Type: string
Unit: N/A
ERRNO メッセージに関連付けられた Unix エラー番号(v188+)
Type: int
Unit: N/A
INVOCATION_ID systemd コードメッセージ用の invocation ID(v245+)
Type: string
Unit: N/A
MESSAGE_ID 128 ビットのメッセージ識別子(UUID 形式、v188+)
Type: string
Unit: N/A
OBJECT_AUDIT_LOGINUID 対象の login UID(v205+)
Type: int
Unit: N/A
OBJECT_AUDIT_SESSION 対象の audit セッション ID(v205+)
Type: int
Unit: N/A
OBJECT_CMDLINE 対象プロセスの完全なコマンドライン(v205+)
Type: string
Unit: N/A
OBJECT_COMM 対象プロセスの comm(v205+)
Type: string
Unit: N/A
OBJECT_EXE 対象プロセスの実行可能パス(v205+)
Type: string
Unit: N/A
OBJECT_GID 対象プロセスの GID(v205+)
Type: int
Unit: N/A
OBJECT_PID 対象プロセスの PID、設定には UID 0 が必要です(v205+)
Type: int
Unit: N/A
OBJECT_SYSTEMD_CGROUP 対象の cgroup パス(v205+)
Type: string
Unit: N/A
OBJECT_SYSTEMD_INVOCATION_ID 対象の invocation ID(v235+)
Type: string
Unit: N/A
OBJECT_SYSTEMD_OWNER_UID 対象セッション所有者の UID(v205+)
Type: int
Unit: N/A
OBJECT_SYSTEMD_SESSION 対象のセッション ID(v205+)
Type: string
Unit: N/A
OBJECT_SYSTEMD_UNIT 対象の unit 名(v205+)
Type: string
Unit: N/A
OBJECT_SYSTEMD_USER_UNIT 対象の user unit 名(v205+)
Type: string
Unit: N/A
OBJECT_UID 対象プロセスの UID(v205+)
Type: int
Unit: N/A
SYSLOG_FACILITY Syslog facility 0-23(v188+)
Type: int
Unit: N/A
SYSLOG_PID syslog 由来のクライアント PID、_PID と異なる場合があります(v188+)
Type: int
Unit: N/A
SYSLOG_RAW MESSAGE が変更された、またはタイムスタンプが失われた場合の元の syslog 行(v240+)
Type: string
Unit: N/A
SYSLOG_TIMESTAMP 受信した元の syslog タイムスタンプ(v188+)
Type: string
Unit: N/A
TID 数値のスレッド ID(v247+)
Type: int
Unit: N/A
UNIT _SYSTEMD_UNIT の代替としてユーザーが指定した unit 名(v251+)
Type: string
Unit: N/A
USER_INVOCATION_ID user manager メッセージ用の user invocation ID(v245+)
Type: string
Unit: N/A
USER_UNIT _SYSTEMD_USER_UNIT の代替としてユーザーが指定した user unit 名(v251+)
Type: string
Unit: N/A
_AUDIT_LOGINUID kernel audit からの login UID(v188+)
Type: int
Unit: N/A
_AUDIT_SESSION kernel からの audit セッション ID(v188+)
Type: int
Unit: N/A
_BOOT_ID /etc/machine-id 由来の 128 ビット hex UUID(v188+)
Type: string
Unit: N/A
_CAP_EFFECTIVE 有効な capabilities のビットマスク(v206+)
Type: int
Unit: N/A
_CMDLINE 完全なコマンドライン、最も詳細なプロセス情報(v188+)
Type: string
Unit: N/A
_COMM 15 文字に切り詰められたコマンド名(v188+)
Type: string
Unit: N/A
_CONTAINER_ID nspawn/containers 用のコンテナ ID(v205+)
Type: string
Unit: N/A
_CONTAINER_IMAGE nspawn/containers 用のコンテナイメージ(v205+)
Type: string
Unit: N/A
_CONTAINER_NAME nspawn/containers 用のコンテナ名(v205+)
Type: string
Unit: N/A
_EXE 実行可能パス、フルパス(v188+)
Type: string
Unit: N/A
_GID グループ ID、信頼済み(v188+)
Type: int
Unit: N/A
_KERNEL_DEVICE kernel デバイス名の形式: bM:NcM:NnN+subsys:name(v189+)
Type: string
Unit: N/A
_KERNEL_SUBSYSTEM kernel サブシステム、例: blocknet(v189+)
Type: string
Unit: N/A
_LINE_BREAK 行終了情報: nulline-maxeofpid-change(v235+)
Type: string
Unit: N/A
_MACHINE_ID /etc/machine-id 由来の Machine ID(v188+)
Type: string
Unit: N/A
_NAMESPACE Journal namespace ID(v245+)
Type: string
Unit: N/A
_RUNTIME_SCOPE ランタイムスコープ: initrdsystemuser(v252+)
Type: string
Unit: N/A
_SELINUX_CONTEXT SELinux セキュリティコンテキストラベル(v188+)
Type: string
Unit: N/A
_SOURCE_BOOTTIME_TIMESTAMP CLOCK_BOOTTIME によるマイクロ秒単位の boottime タイムスタンプ(v257+)
Type: int
Unit: time,μs
_SOURCE_REALTIME_TIMESTAMP CLOCK_REALTIME によるマイクロ秒単位の source タイムスタンプ(v188+)
Type: int
Unit: timeStamp,usec
_STREAM_ID stdout ストリーム用の 128 ビット UUID ストリーム接続 ID(v235+)
Type: string
Unit: N/A
_SYSTEMD_CGROUP 制御グループパス(v188+)
Type: string
Unit: N/A
_SYSTEMD_INVOCATION_ID unit 起動ごとに一意な unit invocation ID(v233+)
Type: string
Unit: N/A
_SYSTEMD_OWNER_UID セッション所有者の UID(v188+)
Type: int
Unit: N/A
_SYSTEMD_SESSION ログインセッション ID(v188+)
Type: string
Unit: N/A
_SYSTEMD_SLICE slice unit 名、例: system.slice(v188+)
Type: string
Unit: N/A
_SYSTEMD_UNIT unit 名、例: sshd.service(v188+)
Type: string
Unit: N/A
_SYSTEMD_USER_SLICE user slice 名、例: user.slice(v188+)
Type: string
Unit: N/A
_SYSTEMD_USER_UNIT user セッション用の user unit 名(v188+)
Type: string
Unit: N/A
_TRANSPORT エントリの受信方法: auditdriversyslogjournalstdoutkernel(v205+)
Type: string
Unit: N/A
_UDEV_DEVLINK デバイスへの symlink。複数回現れる場合があります(v189+)
Type: string
Unit: N/A
_UDEV_DEVNODE /dev/ 配下のデバイスノードのフルパス(v189+)
Type: string
Unit: N/A
_UDEV_SYSNAME /sys/ 内のデバイス名(v189+)
Type: string
Unit: N/A
_UID User ID、信頼済みで偽装できません(v188+)
Type: int
Unit: N/A
__CURSOR エントリ cursor、address フィールドのエクスポートのみ(v188+)
Type: string
Unit: N/A
__MONOTONIC_TIMESTAMP マイクロ秒単位の monotonic タイムスタンプ、address フィールドのエクスポートのみ(v188+)
Type: int
Unit: time,μs
__REALTIME_TIMESTAMP 受信時刻のマイクロ秒値、address フィールドのエクスポートのみ(v188+)
Type: int
Unit: timeStamp,usec
__SEQNUM シーケンス番号、address フィールドのエクスポートのみ(v254+)
Type: int
Unit: N/A
__SEQNUM_ID シーケンス ID、address フィールドのエクスポートのみ(v254+)
Type: string
Unit: N/A
journald_timestamp _SOURCE_REALTIME_TIMESTAMP または __REALTIME_TIMESTAMP からの journal エントリのナノ秒タイムスタンプ(v188+)
Type: int
Unit: timeStamp,nsec
message ログメッセージ内容(MESSAGE から、v188+)
Type: string
Unit: N/A
pid プロセス ID(_PID または SYSLOG_PID から、v188+)
Type: int
Unit: N/A
priority 数値の優先度レベル 0-7(PRIORITY から、v188+)
Type: int
Unit: N/A
status 優先度からマップされたログステータスレベル: errorwarncriticalnoticeinfodebugunknown
Type: string
Unit: N/A

ユースケース

  • 特定サービスのログを収集する
[[inputs.journald]]
  units = ["nginx.service", "mysql.service", "docker.service"]
  priorities = ["err", "crit", "alert", "emerg"]
  tail_only = true
  • 冗長なフィールドを除外する
[[inputs.journald]]
  exclude_fields = [
    "_BOOT_ID",
    "_MACHINE_ID",
    "__MONOTONIC_TIMESTAMP",
    "_AUDIT_SESSION",
    "_AUDIT_LOGINUID",
  ]
  • Kubernetes ノードの journal 収集(自動モード)
[[inputs.journald]]
  paths = ["/var/log/journal", "/run/log/journal"]
  tail_only = true

説明:

  • collector は設定順に候補ディレクトリを解析し、最初に読み取り可能な journal ディレクトリのオープンを優先します
  • コンテナまたは Kubernetes 環境(datakit.Docker || config.IsKubernetes())では、DataKit が journald rootfs モードを自動で有効化します
  • コンテナ/Kubernetes モードでは、絶対パスに自動で mount_dir のプレフィックスが付きます(デフォルトは "/rootfs"
  • パス自体が <mount_dir>/var/log/journal のような journal ルートディレクトリの場合、collector は自動で machine-id 配下へ下りてからオープンします
  • kind、k3d などのコンテナ化ノード環境では、logger/journalctl の確認は宿主機ではなく node コンテナ内で行ってください

  • Kubernetes ノードの journal を収集し、起動前に宿主機の systemd 関連ライブラリを準備する

[[inputs.journald]]
  mount_dir = "/rootfs"
  paths = ["/var/log/journal", "/run/log/journal"]
  tail_only = true
  copy_node_libs = true
  copy_node_libs_files = [
    "libsystemd.so*",
    "liblz4.so*",
    "libzstd.so*",
    "liblzma.so*",
    "libcap.so*",
    "libgcrypt.so*",
    "libgpg-error.so*",
    "libselinux.so*",
    "libmount.so*",
    "libblkid.so*",
    "libacl.so*",
    "libpcre2-8.so*",
    "libpcre.so*",
  ]
  • すべてのログを収集する(デバッグ)
[[inputs.journald]]
  tail_only = false
  max_entries_per_batch = 500
  exclude_fields = []

トラブルシューティング

権限エラー

DataKit に journal ファイルの読み取り権限があることを確認してください。

# datakit ユーザーを systemd-journal グループに追加
sudo usermod -aG systemd-journal datakit

# DataKit を再起動
sudo systemctl restart datakit

ログが収集されない

  1. journald が実行中か確認します:
systemctl status systemd-journald
  1. journal ファイルが存在するか確認します:
ls -la /var/log/journal/
ls -la /run/log/journal/
  1. 現在の環境に journalctl がインストールされている場合は、追加検証として引き続き使用できます。コンテナ内に journalctl がない場合は、DataKit の互換性アラートと probe 結果を直接確認してください:
journalctl -n 10

起動ログに reason=unsupported-format が出る場合、現在の collector 実行時に使用している libsystemd のバージョンが対象 journal ファイル形式より古いことを示します。この場合、DataKit は警告を記録し、journald collector を inactive のままにして、部分的または誤解を招く収集結果の出力は継続しません。

この問題は EKS に限りません。Kubernetes では、DataKit が node 上の journal を収集する必要があり、コンテナイメージに含まれる libsystemd のバージョンが宿主機の journal ファイル形式に必要なバージョンより低い場合にも発生します。典型的な症状は次のとおりです。

  • Pod 内に journalctl が入っている場合、実行時に unsupported feature を返すことがあります
  • DataKit は起動していますが、journald collector は互換性警告の後に inactive のままになります

コンテナまたは Kubernetes 環境(datakit.Docker || config.IsKubernetes())では、DataKit はすでに宿主機の systemd 関連動的ライブラリ準備機能を自動で有効にしています。非コンテナ環境でも有効にしたい場合は、次のように設定できます。

[[inputs.journald]]
  copy_node_libs = true

有効化すると、DataKit は collector 起動前に、mount_dir(デフォルト "/rootfs")配下の候補システムライブラリディレクトリから動的ライブラリを自分の external-libs ディレクトリへコピーし、そのディレクトリを LD_LIBRARY_PATH の先頭に追加します。

コピー動作の詳細:

  • copy_node_libs_files が設定されていて空でない場合は、その一覧のみをコピーします。
  • コンテナ/Kubernetes の自動モードで copy_node_libs_files が空の場合、DataKit はまず libsystemd.so* をコピーし、その後コピー先で libsystemd.so.0 に対して ldd 依存関係を解析し、不足している .so を自動で補完します。
  • 非コンテナかつ非 Kubernetes で copy_node_libs=true かつ copy_node_libs_files が空の場合、DataKit は設定エラーを出し、collector を inactive のままにします。
  • copy_node_libs を有効にしてもライブラリ準備に失敗した場合、journald 収集器は inactive のままです(DataKit の他の収集器には影響しません)。

collector が journal のオープンに成功すると、external の journald.log に次のようなログが出力され、実行時にどの libsystemd が読み込まれたかを確認できます。

loaded libsystemd paths: [/usr/local/datakit/externals/systemd-libs/libsystemd.so.0.35.0]

制約の説明:

  • 宿主機の libsystemd が、DataKit が現在使用している journald external binary と必ず互換であるとは限りません
  • 宿主機の libsystemd のバージョンが低すぎる場合、external binary は動的リンク段階でシンボルやバージョン不一致により起動できないことがあります
  • 宿主機の libsystemd のバージョンが高すぎる場合でも、journal ファイルの読み取り時に unsupported feature が発生することがあります
  • したがって、copy_node_libs は前処理能力にすぎず、コピー後のライブラリが必ず互換であることを保証しません。最終的には起動ログと probe 結果を合わせて判断してください

宿主機の /usr/lib64 全体をそのまま LD_LIBRARY_PATH に追加しないでください。互換性のない glibc コンポーネントまで collector プロセスに取り込まれ、さらに診断しづらい問題を招く可能性があります。

起動ログに次が表示される場合:

resolved journal directory: target=...
opening journal from directory: ...

collector は現在ディレクトリ方式で journal を開いていることを意味します。これは live journal に対する推奨の方法でもあります。単一の .journal ファイルパスを主要な設定に手動で指定しないでください。

cursor ファイルの問題

cursor ファイルが壊れた場合(たとえばホスト再起動後)、収集器は自動的に tail モードへフォールバックし、新しい cursor を作成します。手動でリセットするには:

# cursor ファイルを削除
rm /usr/local/datakit/cache/journald.pos

# DataKit を再起動
sudo systemctl restart datakit

メモリ使用量が高い

デフォルトのバッチサイズは 1000 エントリです。メモリ使用量が問題になる場合は、バッチサイズを減らしてください。

[[inputs.journald]]
  max_entries_per_batch = 100

フィードバック

このページは役に立ちましたか?