我部署了一个flask / RQ环境,以使用docker环境在弹性beantalk上执行作业。我使用logspout容器将日志发送到papertrail。
该应用偶尔会发送一条大型日志消息(200K)。
这似乎导致logspout容器崩溃,并出现以下错误:
write tcp XXX.XXX.XXX.XXX:XXXXX->YYY.YYY.YYY.YYY:YYYYY: write: connection reset by peer
具有更多神秘的回溯信息:
goroutine 77 [running]:
log.Panicf(0x555c1fa7eb08, 0x15, 0xc00038df08, 0x1, 0x1)
/usr/lib/go/src/log/log.go:345 +0xc2
github.com/gliderlabs/logspout/adapters/syslog.(*Adapter).Stream(0xc00007d2c0, 0xc000096f60)
/src/adapters/syslog/syslog.go:259 +0x2c9
github.com/gliderlabs/logspout/router.(*RouteManager).route(0xc0000a9230, 0xc0000db760)
/src/router/routes.go:164 +0xbf
github.com/gliderlabs/logspout/router.(*RouteManager).Run.func1(0xc0000a9230, 0xc0000db760)
/src/router/routes.go:190 +0x37
created by github.com/gliderlabs/logspout/router.(*RouteManager).Run
/src/router/routes.go:189 +0xed
该容器在我的Dockerrun.aws.json文件中被标记为必不可少的,因此在失败时会重新启动。但是,这导致其他容器停止。有一条日志表明其他容器确实在接收信号15。
需要花费10秒钟以上的时间来停止的容器,它们会迅速发送信号9并被硬杀死,这导致RQ不会将作业放回队列中,从而使其“丢失”。
我不确定应该如何进行,因为这里似乎存在一些问题。
1-如何防止logspout在大型日志上崩溃?有一个选项可以使用UDP将日志发送到papertrail。这会引起任何安全问题吗?
2-在杀死容器时,如何让docker(或beantalk或ecs代理?)等待10秒钟以上才能发送SIGKILL信号9? (我没有使用docker stop,因为一个必需的容器死了,所以容器会自动停止)