求救!找不到egg中处理多进程日志的源码
发布于 4 年前 作者 yansong 2915 次浏览 来自 问答

egg文档中日志部分有提到一个特性:多进程日志(https://eggjs.org/zh-cn/core/logger.html)

但是看过egg-logger, egg-bin, egg-core, egg源码, 都没有看到关于多进程日志处理。

求问,哪里可以找到这一块的处理?

11 回复

@atian25 感谢回答

这一句只是开了一个追加的可写流。没看到有特别的地方。

难道多进程日志指的是每个worker都往这一个文件里去打印日志么?

我说的多进程日志,比如:log4js日志,默认所有的worker会发送日志到master进程,然后master进程统一打印。

@yansong 不是有个writable的判断吗,发生不安全写会直接报错,不过一般每个进程都会单独的日志文件,就像pm2一样

@dlutwuwei 你说的writable只是写之前的判断,基本上所有的写操作都会加上这个判断。

不过这个跟多进程日志无关。

我只想搞懂egg的多进程日志具体是怎么去做的。

@atian25 能再详细解答一下么

egg-logger 我记得是 直接多个进程不停的往同一个文件写入的。你是在纠结,会不会多个进程写入发生错误或者冲突吗?可以看我的发帖记录,是同一个问题么

@zhangxh1023 看了下应该是同一个问题。 很早之前用 log4js 1.0 的时候,log4js的机制就是多个进程写一个日志文件。一打压,worker很容易就因为日志堆积而崩溃了。而且日志全是乱的。

目前用log4js的cluster模式后,一打压,会导致master进程内存堆积严重,CPU打满,继而导致maser无法接收正常请求。 所有想了解一下 eggjs 的处理方式。

你是怎么理解当前 eggjs 的方式呢

@yansong 我觉得吧,多进程往同一个文件内追加日志,没问题。而且我当时自己试了一下也确实没发现问题。 之前搜到的讨论的帖子。 https://cnodejs.org/topic/5784ba5b49e4faa95429c6d2

本来就只需要加 flag a 打开的可写流可以多进程向同一个文件写的。。。底层是安全的,只是顺序不保证而已。 原因是 unix 下使用 flag a 打开的可写流对应的 libuv 文件池实现是 UV_FS_O_APPEND,即 O_APPEND,而 O_APPEND 本身在 man 手册里就定义为原子操作,内核保证了对这个可写流的并发写是安全的不需要在应用层额外加锁(除了在 NFS 类的文件系统上并发写会造成文件信息丢失或者损坏)

NFS 类的网络挂载的文件系统主要是靠模拟掉底层的 api 来实现的类本地操作,显然无法在竞争条件下完美还原这类的原子操作 api,所以如果你的日志要写到类似 oss 云盘挂载本地的这种就不能这么干,多进程写的话必须在应用层自己手动加锁

嗯,大致明白了。感谢大家的回答~ @hyj1991 @zhangxh1023

回到顶部