关于日志配置中的日志事件是什么意思

环境信息

  • EMQX 版本:5.0.8
  • 操作系统及版本:docker
  • 其他

问题描述

我在看有关日志配置的文档 console_handler,在这个文档中有一句话:日志处理进程将日志事件打印到 EMQX 控制台。

对于这句话,我有两个问题:

  1. 日志事件是什么意思?
  2. 启用后会使用独立的进程打印日志,如果不启用是使用 emqx 的进程打印日志?

另外一个问题就是 log_overload_kill,只有启用了日志处理进程才生效?

我的天啊,越看问题越多,是因我能力太差了吗?

console_handler 中的 sync_mode_qlen 属性,默认值是 100,小于 100 是用异步,假设 现在是 20 那么是使用几个线程异步呢?

sync_mode_qlen 属性和 log_overload_kill 的 qlen 属性,应该怎么配合?

日志是排查重要途径之一,生产环境要抬高日志级别,否则大量日志的产生会影响性能
image
不启用出现问题时,不好追踪问题出现的原因。

谢谢你的回答

但是在哪里配置单个日志文件的大小呢?

还有就是,我还是没有明白,我上面提出的问题。

  1. 日志事件是什么意思? 就是需要记录日志的时候
  2. 启用后会使用独立的进程打印日志,如果不启用是使用 emqx 的进程打印日志?
    独立进程是说emqx进程里会启动erlang的独立进程(相当于操作系统的线程来做),总的来说,还是emqx的进程在打印日志的。

另外一个问题就是 log_overload_kill,只有启用了日志处理进程才生效?
没出现问题,就不要调他就行了。

谢谢你,

但是这个问题呢?
console_handler 中的 sync_mode_qlen 属性,默认值是 100,小于 100 是用异步,假设 现在是 20 那么是使用几个线程异步呢?

在emqx内部所有的线程都可以需要/也有权限记录日志。
记录日志分2步:

  1. A线程把日志内容在本线程内做好序列化成二进制
  2. 线程再二进制传给落盘的线程(每一个handler都是一个落盘线程。)
    当落盘线程还缓存着小于sync_mode_qlen 个二进制没有存到磁盘时,A线程直接异步把二进制传给它就去忙自己的事了。如果大于了,则是同步模式,要=落磁盘成功。这样可以防止落盘线程压力过大,内存OOM掉。

好难理解啊,落盘线程就是之前说的独立进程吗?

就是说 A 线程传递给落盘线程的时候,会先判断落盘线程有没有超过 sync_mode_qlen ,超过了后就会一直等待,直到 落盘程序的缓存低于 sync_mode_qlen 的时候,A 线程再异步传递给落盘线程?

但是这里又有一个问题,假设落盘程序的缓存已经满了,这个时候 A 线程要先进行了等待,然后 B 线程再在进行了等待,那么当落盘程序的缓存减少了,那么是 A 线程先发送给落盘程序,还是 B 线程先发送,就是说,这两个是有顺序的还是无序的?

还有就是你说的 A 线程,可以理解成一个客户端吗?

抱歉,我是第一次使用 EMQX,所以有些地方不理解,导致问题有点多。