多进程同时写一个日志文件,如何保证并发安全?

首先单条日志体积可能很大,短则 1 Bytes,多则 1024TB

我看到有些方式是使用文件锁,但是文件是一个很慢的东西,锁又是一个很慢的东西,把这两个很慢的东西结合在一起使用,那速度不是很感人吗?

用多进程就是为了快,但是现在又要引入文件锁,那不是又变成蜗牛了。

业内有什么『多进程同时写一个日志文件,如何保证并发安全?』优雅高效的解决方案吗?


比如 python 的一个日志组件: concurrent-log-handler 用的就是文件锁

Uses file locking to ensure exclusive write access Note: file locking is advisory, not a hard lock against external processes

但是我还看到了 python 的一个日志库: loguru,使用了一个 enqueue 的东西

enqueue (bool, optional) – Whether the messages to be logged should first pass through a multiprocess-safe queue before reaching the sink. This is useful while logging to a file through multiple processes. This also has the advantage of making logging calls non-blocking.

这个 enqueue 对应的好像就是 IPC 中的消息队列? 就是每个进程都往队列里面写 log,而不是直接写 fs。那么这个写 fs 的谁来做?有了解 loguru 这个机制的吗?或者其他语言中有类似的东西吗?有了解的可以讲讲吗?

Comments
登录后评论
Sign In
·

RingBuffer,内存开辟一块缓冲区,写日志这个功能还是交给单线程做,多线程去写缓冲区就好了

·

我自己设计了一个库:总体思路是3个线程和一个任务队列,一个前台线程充当生产者,两个后台线程。这两个后台线程又有生产者和消费者,生产者后台线程负责与前台线程交换Buffer,并把【持久化Buffer】这个任务放到任务队列中,消费者后台线程只需要负责从任务队列中取出Task执行就好了。这个思路是参考了陈硕muduo库里日志库的设计,我在此之上添加了一个线程解决了单个后台线程来不及持久化的问题。