[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"
}
}