打日志的疑问
来源:3-5 微服务的监控与可观测性
feixiang1209
2021-08-12 22:15:50
问题一:
打日志同步转异步不太懂,是把打日志写到 go func里么? 还是写打channel里给不同goroutine打日志呢?
问题二:
在k8s的场景下,pod中container打印的日志最终会在宿主机的日志磁盘文件中, 在容器里 log.Println(xxx) 的日志是先写page cache么,那磁盘上可以马上能获取到么(是不是和脏页的刷新有关系)
1回答
异步就是:
select { case [内存 buffer] <- [你的日志内容]: default: }
buffer 另一端有消费 goroutine 负责向磁盘写(可以做batch
这种在压力高的时候,内存 buffer 会满,所以会丢日志,只适用于一部分场景。
2. 在k8s的场景下,pod中container打印的日志最终会在宿主机的日志磁盘文件中, 在容器里 log.Println(xxx) 的日志是先写page cache么,那磁盘上可以马上能获取到么(是不是和脏页的刷新有关系)
这个场景我不是特别熟悉,不过我印象中打开文件的时候有一个 O_DIRECT 的 flag,如果没有这个 flag,一般都是要走缓冲区的
主动调 fsync 应该也可以刷磁盘,不过一般也就数据库软件才会搞这些,普通应用比较少这么干的
相似问题