[Docker] awslogs-datetime-format の指定方法に注意
背景
- Dockerの
awslogsログドライバでは,awslogs-datetime-formatオプションがあり,指定した形式の日時がログのある行に含まれていれば,続く行も同じ日時とみなされる - Stacktrace のようにログレコードが複数行にわたる場合,ログレコードが細分化されずに一つにまとまるので便利である
状況
- AWS ECS のタスク定義 JSON において,
awslogs-datetime-formatを以下のように[日時]となるように指定すると,タスク起動に失敗した
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "AWSLOGS_GROUP_NAME",
"awslogs-datetime-format": "[%Y-%m-%d %H:%M:%S]",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "PREFIX"
}
}
同様の事例
-
docker runコマンドで--log-optを指定して起動するとき,以下のようにawslogs-datetime-formatを指定すると,コンテナの立ち上げに失敗する
$ docker run --log-driver=awslogs \
--log-opt awslogs-region=us-east-1 \
--log-opt awslogs-group=myLogGroup \
--log-opt awslogs-datetime-format='[%b %d, %Y %H:%M:%S]' \
centos:latest /bin/bash
docker: Error response from daemon: failed to initialize logging driver: awslogs could not parse multiline pattern key "[\\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[1,2][0-9]|3[0,1])T(?:[0,1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]+00:00]": error parsing regexp: invalid character class range: `}-(`.
原因
- Docker の awslogs ログドライバにおいて
awslogs-datetime-formatオプションの Pythonstrftime形式の値は,正規表現に書き換えられる.その際,エスケープされていない[ ]は正規表現と解釈されて失敗する
解決方法
-
[ ]を\[ \]にエスケープする
$ docker run --log-driver=awslogs \
--log-opt awslogs-region=us-east-1 \
--log-opt awslogs-group=myLogGroup \
--log-opt awslogs-datetime-format='\[%b %d, %Y %H:%M:%S\]' \
centos:latest /bin/bash
- JSON ではさらに
\を\\にエスケープしなければならないため,\[ \]は\\[ \\]とする.最終的に以下のようになる
"logConfiguration": {
"logDriver": "awslogs",
"options": {
"awslogs-group": "AWSLOGS_GROUP_NAME",
"awslogs-datetime-format": "\\[%Y-%m-%d %H:%M:%S\\]",
"awslogs-region": "ap-northeast-1",
"awslogs-stream-prefix": "PREFIX"
}
}