おれさまラボ

インターネット技術を中心に、実際に手を動かして理解を深めるブログ。

td-agent で /var/log/messages の情報を読み込めない

■ 事象
→ td-agent の source に /var/log/messages を記入して td-agent を起動したところ、指定した path にログが生成されなかった。
 
■ 解決策
→ td-agentサービス を root ユーザーで起動する。
 
td-agent のログを確認すると、`Permission denied` というメッセージが毎秒出力されている事がわかり、実行ユーザーの権限に問題があるのではないかという仮説が立てられます。
[root@fluentd1 td-agent]# tail -f /var/log/td-agent/td-agent.log
2019-03-07 17:29:15 +0900 [error]: Permission denied @ rb_sysopen - /var/log/messages
  2019-03-07 17:29:15 +0900 [error]: suppressed same stacktrace
2019-03-07 17:29:16 +0900 [error]: Permission denied @ rb_sysopen - /var/log/messages
  2019-03-07 17:29:16 +0900 [error]: suppressed same stacktrace
2019-03-07 17:29:17 +0900 [error]: Permission denied @ rb_sysopen - /var/log/messages
  2019-03-07 17:29:17 +0900 [error]: suppressed same stacktrace
 
初期状態では、td-agentサービス は td-agent ユーザーで実行されるようです。
[root@fluentd1 td-agent]# ps aux | grep [t]d-agent
td-agent 15912  0.0  1.2 218032 24316 ?        Sl   17:26   0:00 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
td-agent 15915  4.1  2.3 256836 43416 ?        Sl   17:26   0:00 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid
 
/var/log/messages は root ユーザーが所有するファイルなので、td-agent ユーザーで実行された td-agentサービス からは /var/log/messages を読み取ることができません。
[root@fluentd1 ~]# ls -l /var/log/messages
-rw-------. 1 root root 326287  3月  7 17:49 /var/log/messages
 
そのため、td-agentサービス を rootユーザーで実行すれば、本事象は解決するはずです。
td-agentサービスは、systemctl によって管理されるので、rootユーザーで実行するためには、systemd のユニットファイルの設定値で、起動ユーザー/グループを変更します。
[root@fluentd1 td-agent]# cp -ip /lib/systemd/system/td-agent.service /lib/systemd/system/td-agent.service.20190307.bef
[root@fluentd1 td-agent]# vi /lib/systemd/system/td-agent.service
[root@fluentd1 td-agent]# diff /lib/systemd/system/td-agent.service /lib/systemd/system/td-agent.service.20190307.bef
8,9c8,9
< User=root
< Group=root
---
> User=td-agent
> Group=td-agent
[root@fluentd1 td-agent]# systemctl daemon-reload
[root@fluentd1 td-agent]# systemctl restart td-agent
[root@fluentd1 td-agent]# systemctl status td-agent
● td-agent.service - td-agent: Fluentd based data collector for Treasure Data
   Loaded: loaded (/usr/lib/systemd/system/td-agent.service; disabled; vendor preset: disabled)
   Active: active (running) since 木 2019-03-07 17:29:27 JST; 7s ago
  Process: 15957 ExecStop=/bin/kill -TERM ${MAINPID} (code=exited, status=233/RUNTIME_DIRECTORY)
  Process: 15966 ExecStart=/opt/td-agent/embedded/bin/fluentd --log /var/log/td-agent/td-agent.log --daemon /var/run/td-agent/td-agent.pid $TD_AGENT_OPTIONS (code=exited, status=0/SUCCESS)
Main PID: 15972 (fluentd)
   CGroup: /system.slice/td-agent.service
           tq15972 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/...
           mq15975 /opt/td-agent/embedded/bin/ruby /opt/td-agent/embedded/bin/fluentd --log /var/...
 
 
3月 07 17:29:26 fluentd1.oresamalabo.local systemd[1]: Stopped td-agent: Fluentd based data c...a.
3月 07 17:29:26 fluentd1.oresamalabo.local systemd[1]: Unit td-agent.service entered failed state.
3月 07 17:29:26 fluentd1.oresamalabo.local systemd[1]: td-agent.service failed.
3月 07 17:29:26 fluentd1.oresamalabo.local systemd[1]: Starting td-agent: Fluentd based data .....
3月 07 17:29:27 fluentd1.oresamalabo.local systemd[1]: Started td-agent: Fluentd based data c...a.
Hint: Some lines were ellipsized, use -l to show in full.
 
td-agent のログを確認すると、エラーが解消していることがわかります。
[root@fluentd1 td-agent]# tail -f /var/log/td-agent/td-agent.log
  </source>
  <match msg>
    @type file
    path /var/log/td-agent/messages-td
    buffer_path /var/log/td-agent/messages-td.*
  </match>
</ROOT>
2019-03-07 17:29:27 +0900 [info]: listening fluent socket on 0.0.0.0:24224
2019-03-07 17:29:27 +0900 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"
2019-03-07 17:29:27 +0900 [info]: following tail of /var/log/messages
^C
 
動作確認のために、logger コマンドを使って /var/log/message にログを書き込むと、/etc/td-agent/td-agent.conf で指定した path に JSON データが生成されます。
[root@fluentd1 td-agent]# cat /var/log/td-agent/messages-td.20190307.b5837cea121f0d1ab
2019-03-07T17:30:08+09:00       msg     {"message":"Mar  7 17:30:08 fluentd1 root: test"}
 
以上です。