tl;dr
- FuelPHP と CloudWatchLogs を組み合わせた時にハマったのでメモ
- 導入までのあれこれは公式ドキュメントとかを参照
起きたこと
都内某日
「CloudWatch Logs が Tokyo にも来たし、遊んでみるぜー」
「FuelPHPでログは fuel/app/logs に日付単位で生成されるので、ワイルドカードを使ってfileを指定すればいいよなー」
/etc/awslogs/awslogs.conf
[/fuelphp/logs]
datetime_format = %b %d %H:%M:%S
file = /path/to/fuel/app/logs/20*/*/*
buffer_duration = 5000
log_stream_name = {instance_id}
initial_position = start_of_file
log_group_name = /fuelphp/logs
awslogsをstartして、AWSマネージメントコンソールで確認
「よしよし、上手くうごいてる♪」
一夜明けて
「あれ?今日の分のログがとれてない?」
「再起動してもダメポ...」
「/var/log/awslogs.log になんか変なエラー出てるお...」
(ノ`Д´)ノ彡┻━┻
原因
- ユニークであるべきsequenceTokenが重複した状態でPutLogEventsしてるのが原因
- (要出典というかちゃんとは追ってないけど、)どうもこのsequenceTokenのジェネリ方がline単位でのハッシュ値(?)的な感じっぽげ
- FuelPHPのLogクラスの罠のせいで、ログファイル最初の1行目が重複しちゃう
- その結果、sequenceTokenが重複しちゃってあぼーん
解決方法
- Logクラスをオーバライドしちゃう
- そもそもFuelPHPのLogクラス使いにくいと思ったり...
- FuelPHPを使わない
- 混ぜるな危険...
- agent を自作する
- 本家のもpythonスクリプトだし...