直到这周,当这个博客某处出错了证据住在服务器上的docker日志,这意味着它有效地住在无处。一个用户可以碰撞一个错误,告诉我关于它,而我调试工具是滚动终端输出寻找大约匹配他们消息的时间戳。时间来修复那。
想法是简单的:每次一个服务写一个错误响应,它也写一行到一个error_log表。路径、状态、错误代码、消息、请求id、用户如果有一个。admin面板得到一个日志标签那从两个服务读并合并他们到一个列表我能过滤。用户说"它大约八点打破了",我过滤到那个窗口而我看到完全什么他们的请求碰撞。
第一个设计决定那出来错误:我只记录了5xx错误,在理论上4xx意思用户做错误的东西和5xx意思我做。但4xx反应通常是线索。一堆413s意思某个人保持碰撞一个上限我设置太低。一个429s流意思要么一个攻击要么一个权限漏洞。所以网扩展到5xx加一个策划几个:403、413和429。不每一个404从一个机器人扫描wordpress.php,那会只是噪音用一个数据库账单。

这个一个中间的细微漏洞是关于上下文。明显代码通过请求的上下文到数据库插入。但通过请求已经写了时间错误响应,那样的上下文可以已经取消了,这杀死插入。关于失败的日志行得到失去因为失败发生了。修复是给插入它自己分离的上下文用一个短超时:
ctx, cancel := context.WithTimeout(context.Background(), errorLogInsertTimeout)
defer cancel()
if err := q.InsertErrorLog(ctx, db.InsertErrorLogParams{ ... }); err != nil {
log.Printf("error_log insert failed: %v", err)
}而且注意当插入本身失败什么发生:一个平日志线,没有更多。一个事物一个错误日志记者必须永远不做是产生一个它自己的错误响应,因为那个错误会得到记录,这可能失败,这会得到记录。我有读充分的悼文要充分害怕那个循环。
标签也得到一个删除按钮每行和一个清除-全部,因为一个日志你不能清除只是成为一道旧噪音的墙你停止读。行比90天旧扫除他们自己出现和分析事件,同样清洁工人,同样时间表。
是一个两表错误日志用在浏览器一个合并一个伟大的可观测性平台?不。有一个正确中央日志记录服务为v2素描,用批处理和重试当网络掉下去。但那是一个设计为以后。什么我需要这周是停止通过docker日志调试,而那问题现在用两个表和一个admin标签解决。