■ 事象
→ 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
/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]: 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"}
以上です。