队列(Queues)
实际上,队列在整个日志的生命周期中都存在,它是Rsyslog的核心,一般情况下,我们感觉不到它的存在;然而,从日志的产生到被处理的过程,都必须经过两个队列,一个是主消息队列(main message queue),另一个是动作队列(action queue)。通过下面的图片,可以理解得更加清楚:
从上图中可以看到,日志产生后,先经过预处理器然后就被压入main message queue等待后续的处理,在进入action queue之前,日志被解析器和过滤器处理,它们的作用是读取rsyslog.conf配置文件中设置的规则,和日志中的内容进行对比,然后发送到合适的action queue,一旦日志进入到这个action queue之后,就会从主消息队列中删除。
日志真正被处理的阶段发生在进入action queue之后,action processor(动作处理器)会从action queue中获取最先进入队列的日志进行处理,根据规则进行日志的输出,例如写入文件,录入数据库、发送到远程服务器,甚至是把它们丢弃。
rsyslog.conf中每一条规则的action都有一个action queue,这种queue默认类型是direct queue,但严格来说,它不属于队列,虽然名字中有queue字样。direct queue通常处理简单的行为,例如把日志写入本地文件。
在direct queue下,同一条日志如果被多个动作处理器消费,这个时候,同一条日志会被复制到各个动作队列中,那么可能会造成的现象是,当你使用discard丢弃日志的时候,会发现discard指令没有生效,原因是:discard指令丢弃的是原始日志的副本,而原始的日志会继续活动在原来的工作流中。
主消息队列(main message queue)
rsyslog中只有一个主消息队列,任何消息都要先进入这个队列,然后直到进入到动作队列之后消息才会从这个队列中删除。通常,我们都不会太过在意主消息队列的设置,因为默认的设置已经工作得很好;往往rsyslog中的关于队列的配置,都是针对动作队列的,这也是我们接下来要说的。
动作队列(action queue)
消息经过主消息队列之后,就被rule processor解析和处理,然后根据预先配置的规则压入各自的动作队列,动作队列之后消息最终被消费掉,例如输出到指定的地方。正是如此,往往我们都会根据实际情况对动作队列的行为作出一些适当的调整。
注意事项
如果消息最终不能被消费(输出到指定位置),那么这些消息就会停留在先前的队列中。这就有可能会导致队列被填满,一旦队列填满,后续的输入消息就不能再进入消息队列,最终造成某些服务无法进行日志记录,最坏的后果是导致该服务无法正常提供服务。比如某次故障时, CPU/Disk/Mem 都正常, 但某些进程异常卡顿, 排查2天, 竟然发现是 rsyslog 的锅: 因为 ES 挂了, rsyslog-elasticsearch 队列被打满且阻塞, 然而 rsyslog 默认主队列是 direct, 也就是必须等待elasticsearch子列队超时才返回, 导致 sshd, sudo , rsync , php.syslog等凡是用到 syslog 的地方被阻塞, 后果很严重!!! 所以合理配置主队列和动作队列的类型及丢弃策略非常必要!!!
队列的种类
队列的类型划分为下面4种:
- Direct queue
- Disk queue
- In-memory queue (LinkedList/FixedArray)
- Disk-Assisted In-memory queue
设置队列类型的语法如下:
$<Object>QueueType <QueueTypeValue> #Object可以代表MainMsg或Action
Direct Queue
Direct queue是默认的行为,它不是一种队列。通常输出到本地硬盘的时候都是使用这种类型。
而Direct queue是唯一一个会把执行结果(成功/失败)从消费者(action processor)返回给生产者的队列。action processor正是通过这个返回值提醒action queue,让action queue取回这些处理失败的消息,如此循环,直到消息处理成功。
Disk Queue
Disk queue使用硬盘作为消息缓冲设备,而不会使用任何内存作为缓冲。因此,它的最大好处是可靠,缺点是,它的写入速度是最慢的。如果不是必须,不推荐使用这种队列。
当Disk queue写入文件的时候,它是以块的方式接收消息的,一个数据块是一个文件,每一个数据块默认是10m,文件有一个前缀,可以通过$<Object>QueueFileName
配置。文件的默认大小可以使用$<Object>QueueMaxFileSize
设置。
每一个队列可以使用不同的位置保存数据,通过$WorkDirectory
指令设置,这个指令要在队列创建之前配置。
In-memory Queue
这种类型的队列把所有的消息都保存在内存中,因此它的处理速度非常快,缺点是当电脑关闭或死机的时候,所有未被处理的消息都会丢失。如果希望电脑关机的时候保存这些消息,可以使用$<Object>QueueSaveOnShutdown
设置。
有两种类型的内存队列,它们是:
- FixedArray queue
- LinkedList queue
main message queue默认是FixedArray Queue, main message queue的默认上限是10000个消息。
FixedArray队列预先分配一定的内存来保存这些消息,它的缺点是,无论你的日志有多少,它都需要完全占用这些内存;好处是当数据量不大的时候,它的性能是最好的。
LinkedList队列和FixedArray队列不同,它的内存是运行时分配的,会根据数据量的不同而作出调整,好处是内存利用率高,LinkedList队列适合使用在一些突发数据量大的场景。
Disk-Assisted In-memory Queue
这种队列实际上是以内存队列为主,Disk Queue为辅的队列。在正常情况下,不会使用辅助的Disk queue,但当内存队列被填满,或者主机关闭的时候,Disk Queue就会被激活,数据被写入硬盘。结合两者使用,可以同时满足速度和数据的可靠性。
这种类型的队列创建指令是(以action queue为例子):
$ActionQueueType LinkedList
$ActionQueueFileName fileName
也就是说,在建立一个普通的内存队列之后,再使用指令设置一个保存文件,两者组合在一起之后,就成了Disk-Assisted In-memeory Queue。
$<Object>QueueHighWatermark和$<Object>QueueLowWatermark
$<Object>QueueHighWatermark的作用是:当队列中的数据超过这个设置的值的时候,要么把数据保存,要么把数据丢弃,如果是Disk-Assisted In-memory Queue,队列中的数据超过这个值,Disk Queue就会被激活。
$<Object>QueueLowWatermark的作用:和上面的相反,这是一个低水位设置,当数据小于这个值的时候,就停止相关的操作,如果是Disk-Assisted In-memory Queue,数据低于这个值,Disk Queue就会被取消激活状态。
限制队列的容量
上面的参数中,对于容量限制的指令有两个,它们是:
- $<Object>QueueSize <number>
- $<Object>QueueHighWaterMark <number>
两者之间有细微的差别,$<Object>QueueSize用于设置队列的总容量,即队列可容纳的消息数量。
而$<Object>QueueHighWaterMark只用于disk-assisted类型的队列,当队列中的消息数量达到这个值之后,消息就会被写入到硬盘。但是这种行为是有依赖性的,仅当日志的输出目标无法到达的时候(数据库无法访问,远程服务器离线等),它才会发生。
丢弃消息(Discarding Messages)
控制这个行为的指令是$<Object>QueueDiscardMark
,当队列中的消息达到这个指定的值时,消息就会被丢弃。至于丢弃哪一种消息,则由$<Object>QueueDiscardSeverity
指令控制,这个指令接受以文字表示的等级或以数字表示的等级。具体的等级和对应的数字如下:
Numerical Code Severity
0 Emergency: system is unusable
1 Alert: action must be taken immediately
2 Critical: critical conditions
3 Error: error conditions
4 Warning: warning conditions
5 Notice: normal but significant condition
6 Informational: informational messages
7 Debug: debug-level messages
队列的终止
我们不能控制队列的终止,只有在系统被关闭的那一刻,队列才会结束。当队列终止的时候,可能会遇到这样的情况:队列中依然有数据尝试进入。这种情况rsyslog会试图处理这些数据,如果希望控制这些数据的处理时间,可以使用这个指令:$<Object>QueueTimeoutShutdown <milliseconds>
。当时间超过这个值,队列中的所有数据被丢弃。
另一种情况是,当超时后,依然希望队列处理完当前正在被处理的数据再关闭,那么可以使用$<Object>QueueTimeoutActionCompletion
指令,它设置了处理当前数据的时间,也就是说除了当前正在被处理的消息外,其他任何的消息都被丢弃。
如果不希望丢弃任何消息,可以使用$<Object>QueueSaveOnShutdown
指令。这个指令要求队列是Disk Queue或者Disk-assisted Queue。
为什么我们需要队列
把这个问题放到最后才说,是有原因的,因为到这个位置,才比较清楚队列都干了什么。知道它的作用,才能回答这个问题。从上面几种队列可以看到,队列的作用无非是两种,一种是加速,另一种是可靠。那么,现在再回答一个问题,为什么默认Action Queue是Direct Queue(不进入队列)?
原因很简单:比起其他操作,例如写入数据库或者是通过网络协议传输日志,直接写入硬盘速度是最快的,也是最可靠的,因此,它使用的是Direct Queue。参考: rsyslog performance: main and action queue workers
那么另一个问题是:我们什么时候使用队列?这个问题其实可以根据上面的解释回答,也就是在一些慢操作和可靠性不高的场景(写入数据库、网络传输)。
填满队列
如果队列已达到配置的最大条目数或磁盘空间,则该队列最终将满。如果是这样,rsyslogd会限制数据元素提交者。例如,如果这是可靠的输入(TCP,本地日志套接字),则将减慢消息始发者的速度,这对于此方案来说是一个很好的解决方案。
节流期间,磁盘辅助队列将继续写入磁盘,并且还会根据严重性以及常规出队和处理继续丢弃消息,从而丢弃消息。因此,机会很容易通过简单的节流来解决。但是请注意,对于不可靠的源(例如UDP消息接收),节流是非常不希望的。因此,完全进入节流模式不是一件好事。
我们不能无限地保持处理,即使在节流时也是如此。例如,限制本地日志套接字的时间太长会导致系统整体陷入停顿。为避免这种情况,如果没有可用空间,则rsyslogd在配置的时间段(“ $ <object> QueueTimeoutEnqueue ”,以毫秒为单位)后超时。作为最后的选择,它然后丢弃新到达的消息。
如果您不喜欢节流,请将超时设置为0-然后将立即丢弃该消息。如果您使用高超时时间,请确保您知道自己在做什么。如果设置了较高的主消息队列入队超时,则可能导致系统完全挂起。相同的问题不适用于操作队列。
速率限制
速率限制提供了一种防止rsyslogd处理事情太快的方法。例如,它可以防止接收器系统超载。
当前,只有有限的速率限制功能可用。“ $ <object> QueueDequeueSlowdown ”伪指令允许指定应延迟多长时间(以微秒为单位)。虽然简单,但仍然功能强大。例如,在UDP发送操作上使用1000微秒的DequeueSlowdown延迟可确保一秒钟内发送的消息不超过1,000(实际上更少,因为处理本身还需要一些时间)。
处理时限
可以将队列设置为仅在特定时间范围内使消息出队(处理)。例如,如果您只想在非高峰时段传输大量消息,例如当您到中央服务器的网络路径上的带宽有限时,这很有用。
当前,仅支持单个时间范围,更糟糕的是,只能按小时指定时间范围。在这方面扩展rsyslog的功能并不难-到目前为止还没有要求。因此,如果您需要更多细粒度的控制,请告诉我们,我们可能会实现它。有两个配置指令,应同时使用两个指令,否则结果将不可预测:“ $ <object> QueueDequeueTimeBegin <hour> ”和“ $ <object> QueueDequeueTimeEnd <hour> ”。hour参数必须以24小时格式指定(因此10pm是22)。在 rsyslog Wiki中可以找到此参数的用例。
性能
维护队列涉及的锁定可能会对性能产生巨大影响。它的大小以及是否存在,在很大程度上取决于配置和实际用例。但是,在使数据元素出队时,队列能够处理所谓的“批处理”。对于批处理,多个数据元素可同时出队(通过一次锁定调用)。队列使所有可用元素出队,直到配置的上限(<object> DequeueBatchSize <number>)。重要的是要注意,实际上限取决于可用性。队列引擎将永远不会等待批次填充。因此,即使配置了较高的上限,如果队列中没有等待的其他元素,批处理也可能包含更少的元素,甚至只有一个。
批处理可以大大提高性能。但是请注意,这会影响消息传递到队列工作线程的顺序,因为每个工作线程现在都作为批消息接收。同样,批处理大小越大,允许的工作线程的最大数量越高,则需要的主内存就越多。对于繁忙的服务器,大批处理大小(大约1,000个甚至更多的元素)可能有用。请注意,使用批处理时,即使在仅磁盘模式下运行,主内存也必须在内存中保存BatchSize * NumOfWorkers对象(最坏的情况)。因此,如果您在主消息队列中使用默认的5个工作线程并将批处理大小设置为1,000,则需要做好准备,以使主消息队列除了配置的队列大小限制外,在主内存中最多容纳5,000条消息!
队列对象的默认最大批处理大小为8,但是对于使用队列的rsyslog处理的实际部分,存在不同的默认值。因此,您需要检查这些对象的默认设置。
终止队列
终止进程听起来很容易,但是可能很复杂。实际上,终止正在运行的队列是队列对象可以执行的最复杂的操作。从用户的角度来看,您看不到这一点,但是对于开发人员来说,以正确的顺序完成所有工作非常困难。
当队列结束时仍有队列排队时,就会产生复杂性。Rsyslog尝试保留尽可能多的内容。首先,有一个定期的队列超时(“ $ <object> QueueTimeoutShutdown ”,以毫秒为单位指定):给队列工作人员指定的时间段来完成对队列的处理。
如果在那段时间之后队列中仍然有数据,则指示工作程序完成当前数据元素,然后终止。这实质上意味着任何其他数据都将丢失。还有另一个超时(“ $ <object> QueueTimeoutActionCompletion ”,也以毫秒为单位),它指定工作人员必须完成当前元素的时间。如果该超时时间到期,则将取消所有剩余的工作进程,并关闭队列。
如果您不希望在关机时丢失数据,可以将“ $ <object> QueueSaveOnShutdown ”参数设置为“ on”。这需要磁盘队列或磁盘辅助队列。如果设置,rsyslogd确保在终止之前将所有队列元素保存到磁盘。其中包括工作人员开始处理的数据元素,由于处理时间过长而需要取消。对于大队列,此操作可能很长。没有超时适用于必需的关机保存。
用法
队列参数可与以下语句一起使用:
- action(): 行动()
- ruleset(): 规则集()
- main_queue()
需要在应该影响的操作或规则集中配置队列。如果未配置任何内容,则将使用默认值。因此,默认规则集仅具有默认主队列。默认情况下不设置特定操作队列。
要完全了解队列参数及其交互方式,请务必阅读 队列文档。
配置参数
注意
与其他配置对象一样,此对象的参数不区分大小写。
queue.filename
类型 | 默认 | 强制性 | obsolete legacy 指示 |
字 | 没有 | 没有 | $ActionQueueFileName |
用于队列文件的文件名。如果指定,则此参数启用磁盘辅助队列功能。如果未指定,则队列将在不将队列保存到磁盘的情况下运行,无论是在操作期间还是在关闭时。请参阅separate queue.saveonshutdown
参数以配置该选项。请注意,这实际上只是文件名。无法在此参数中指定目录。如果要在特定目录中创建文件queue.spoolDirectory
,请为此指定。文件名用于构建以完成队列文件的路径。
queue.spoolDirectory
类型 | 默认 | 强制性 | obsolete legacy 指示 |
字 | 没有 | 没有 | 没有 |
这是将存储队列文件的目录。请注意,该目录必须存在,它不是由rsyslog自动创建的。如果未指定spoolDirectory,则使用工作目录。
queue.size
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 50000分之1000 | 没有 | $ActionQueueSize |
这是队列中消息数量的最大大小。请注意,不支持将队列大小设置为非常小的值(大致低于100条消息),并且可能导致不可预测的结果。有关此限制的当前状态的更多信息,请参阅 rsyslog常见问题解答:“队列大小的下限”。
默认值取决于队列类型和rsyslog版本,如果需要特定值,请指定它。否则rsyslog会选择适合所讨论版本的内容。例如,在rsyslog rsyslog 8.30.0中,规则集队列的默认大小为50000,而配置为非直接的操作队列的大小为1000。
queue.dequeueBatchSize
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 128/1024 | 没有 | $ActionQueueDequeueBatchSize |
指定出列操作的最大批量大小。此设置会影响性能。根据经验,较大的批量(最大环境诱导的上限)可提供更好的性能。对于普通系统,通常不需要调整批量大小,因为默认值足够。规则集队列的默认值为1024,对于操作队列128。
请注意,这仅指定最大批量大小。如果rsyslog在出队时队列中没有尽可能多的消息,则批量将会变慢。如果要设置最小批量大小,可以使用queue.minDequeueBatchSize。
queue.minDequeueBatchSize
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 0 | 没有 | 没有 |
指定出列操作的最小批量大小。此设置对于ElasticSearch或ClickHouse等输出特别有用,您可以在其中限制HTTP请求的数量。使用此设置,当当前排队的消息较少时,队列引擎会等待 queue.minDequeueBatchSize.timeout毫秒。请注意,最小批量大小不能大于配置的最大批量大小。如果是,则会自动调整以匹配最大值。因此,如果有疑问,您需要指定两个参数。
queue.minDequeueBatchSize.timeout
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 1000 | 没有 | 没有 |
此参数仅在与queue.minDequeueBatchSize一起使用时才有意义,否则将被忽略。它指定rsyslogs等待新消息的时间(以毫秒为单位),以便可以达到最小批量大小。在此期间之后,即使批次低于最小尺寸,也会处理批次。此功能的存在是为了防止消息在不完整的批处理中停滞,因为没有新消息到达。我们希望将它设置为高于60.000(60秒)通常没有意义,但这是允许的。请注意,这可能会延迟日志处理的时间。
queue.maxDiskSpace
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 0 | 没有 | $ActionQueueMaxDiskSpace |
所有队列文件一起在磁盘上使用的最大大小。请注意,实际大小可能略大于配置的max,因为rsyslog从不写入部分队列记录。
queue.highWatermark
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | queue.size的90% | 没有 | $ActionQueueHighWaterMark |
这仅适用于磁盘辅助队列。当队列填满此数量的消息时,队列开始将消息脱机到磁盘。请注意,这不应该将这作为常规处理,因为磁盘队列模式比内存中队列模式慢得多。对于输出操作目标在某段时间内处于脱机状态的情况,应保留转到磁盘。
queue.lowWatermark
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | queue.size的70% | 没有 | $ActionQueueLowWaterMark |
这仅适用于磁盘辅助队列。达到高水位线时,队列会将数据写入磁盘。它一直这样做,直到达到低水位,然后队列恢复到内存模式。
queue.fullDelaymark
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 97%的queue.size | 没有 | 没有 |
队列应阻止可延迟消息时的消息数。消息不再处理,直到队列再次有足够的空间。如果消息可延迟取决于输入。例如,通过imtcp接收的消息是可延迟的(因为TCP可以推回),但是通过imudp接收的消息不是(因为UDP不允许回推)。此设置背后的意图是在几乎完整的队列中留出一些空间用于不可延迟的消息,如果队列空间不足,这些消息将丢失。请注意,如果您使用DA队列,将highdelaymark设置为低于高水位线,则队列永远不会激活磁盘模式以进行可延迟输入。所以这可能不是你想要的。
queue.lightDelaymark
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | queue.size的70% | 没有 | 没有 |
如果达到此标记,则发送方将受到限制(如果可能)。
queue.discardMark
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | queue.size的80% | 没有 | $ActionQueueDiscardMark |
指定rsyslog开始丢弃不太重要的消息的阈值。要定义应丢弃哪些消息,请使用queue.discardseverity参数。
queue.discardSeverity
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 8 | 没有 | $ActionQueueDiscardSeverity |
一旦达到参数queue.discardMark的阈值,就会删除优先级等于或低于指定值的排队消息。默认情况下,不会删除任何消息。您必须为此参数指定数字严重性值。
queue.checkpointInterval
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 0 | 没有 | $ActionQueueCheckpointInterval |
默认情况下,磁盘队列不会在每次队列写入磁盘时更新内务处理结构。这是出于性能原因。如果发生故障,数据仍将丢失(除非数据通过文件结构损坏)。但是,可以将磁盘队列设置为在检查点(每n个记录)上写入簿记信息,这样也可以使其更加可靠。如果检查点间隔设置为1,则不会丢失任何数据,但队列异常缓慢。
queue.syncqueuefiles
类型 | 默认 | 强制性 | obsolete legacy 指示 |
二进制 | 离 | 没有 | $ActionQueueSyncQueueFiles |
通过在每次写入操作之后发出(f)同步,可以使基于磁盘的队列非常可靠。将参数设置为“on”时会发生这种情况。激活此选项会降低性能,因此不应在没有充分理由的情况下启用它。请注意,惩罚还取决于queue.checkpointInterval频率。
queue.samplingInterval
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 0 | 没有 | 没有 |
版本8.23.0中的新功能。
此选项允许队列由特定时间间隔生成的事件填充。它提供了一种方法来为每个N个事件采样数据,而不是全部处理,以减少资源使用(磁盘,带宽…)
queue.type
类型 | 默认 | 强制性 | obsolete legacy 指示 |
字 | 直接 | 没有 | $ActionQueueType |
指定将使用的队列类型。可能的选项是“FixedArray”,“LinkedList”,“Direct”或“Disk”。有关更多信息,请阅读 队列文档。
queue.workerThreads
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 1 | 没有 | $ActionQueueWorkerThreads |
指定可以并行运行的最大工作线程数。
queue.workerThreadMinimumMessages
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | queue.size / queue.workerthreads | 没有 | $ActionQueueWorkerThreadMinimumMessages |
指定在创建另一个工作线程之前工作线程正在处理的消息数。此数字受参数queue.workerThreads的限制。例如,如果此参数设置为200,并且队列中有201条消息,则将创建第二个工作线程。
queue.timeoutWorkerthreadShutdown
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 60000 | 没有 | $ActionQueueTimeoutWorkerthreadShutdown |
启动工作线程后,它将处理消息,直到没有消息供他处理。此参数指定工作线程在超时之前必须处于非活动状态的时间。必须以毫秒为单位指定参数。这意味着默认值60000是1分钟。
queue.timeoutshutdown
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 一千五分之十 | 没有 | $ActionQueueTimeoutShutdown |
如果仍然包含消息的队列终止,它将等待指定的工作线程完成时间间隔。时间以毫秒为单位指定(1000毫秒为1秒)。操作队列的默认值为10,对于规则集队列,它为1500。
queue.timeoutActionCompletion
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 1000 | 没有 | $ActionQueueTimeoutActionCompletion |
当队列终止时,超时关闭结束并且队列中仍有数据,队列将完成当前数据元素然后终止。此参数指定处理此最后一个元素的超时。参数以毫秒为单位指定(1000毫秒为1秒)。
queue.timeoutEnqueue
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 2000 | 没有 | $ActionQueueTimeoutEnqueue |
队列已满时使用此超时值。如果rsyslog无法在超时期限内将消息入队,则会丢弃该消息。请注意,这是最后的设置(假设默认值用于队列设置或设置了适当的参数):所有可延迟输入(如imtcp或imfile)已在此阶段被推回。此外,丢弃较低优先级的消息(如果已配置)已经发生。因此,如果我们没有足够快地超时,我们会遇到其中一种情况:
- 如果使用imuxsock并且不涉及系统日志,则系统将变得无响应并且很可能需要硬重置。
- 如果使用imuxsock与imjournal转发活动,消息将丢失,因为该期刊丢弃它们(比rsyslog更具攻击性)
- 如果使用imjournal,日志将缓冲消息。如果日志用完了已配置的空间,则将丢弃消息。所以在这种模式下,丢弃移动到稍后的位置。
- 像imudp这样的其他非延迟源也会松散消息
因此,提供此设置是为了防止出现问题的情况,这些情况总是会导致邮件丢失或系统挂起。对于动作队列,人们可能会争论是否最好快速溢出到主队列。如果需要,可以通过设置非常大的超时值来轻松实现。当然,对于主队列来说也是如此,但是如果你这样做,你就会收到警告!
换句话说,您可以使用默认值来考虑此方案。阻止所有进度(无法传递消息):
- 所有可延迟的输入(tcp,relp,imfile,imjournal等)将无限制地阻塞(假设queue.lightdelaymark和queue.fulldelaymark设置为合理的,默认情况下它们是默认的)。
- imudp将丢失消息,因为操作系统将丢弃它们
- 通过UDP或imuxsock到达rsyslog的消息,并且这个严重程度高到不能被discardsever过滤,将阻塞2秒,试图将消息放入队列中(希望发生某些事情以便腾出空间)在队列中),然后被删除,以避免永久阻止机器。
然后,下一个要处理的消息也将被尝试2秒,等等。 - 如果这将进入操作队列,则日志消息将在这2秒内保留在主队列中,并且到达的其他日志将在主队列中的后面累积。
queue.maxFileSize
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 1M /16米 | 没有 | $ActionQueueMaxFileSize |
指定磁盘辅助队列文件的最大大小。参数可以用Mebibyte或Gibibyte表示,操作队列的默认值是1m,规则集队列的默认值是16m(1m = 1024 * 1024)。
queue.saveOnShutdown
类型 | 默认 | 强制性 | obsolete legacy 指示 |
二进制 | 离 | 没有 | $ActionQueueSaveOnShutdown |
此参数指定是否应在关闭时保存数据。
queue.dequeueSlowDown
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 0 | 没有 | $ActionQueueDequeueSlowDown |
规定应该延迟出列的时间。该值必须以微秒为单位指定(1000000us为1秒)。它可以用来减慢rsyslog的速度,因此它不会发送快速的东西。例如,如果在UDP发送操作中将此参数设置为10000,则该操作将无法每秒发出超过100条消息。
queue.dequeueTimeBegin
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 0 | 没有 | $ActionQueueDequeueTimeBegin |
使用此参数,您可以指定rsyslog以在特定时间段内处理队列。要定义时间范围,请使用24小时格式而不分钟。此参数指定begin和“queue.dequeuetimeend”结束时间范围。
queue.dequeueTimeEnd
类型 | 默认 | 强制性 | obsolete legacy 指示 |
整数 | 25 | 没有 | $ActionQueueDequeueTimeEnd |
使用此参数,您可以指定rsyslog以在特定时间段内处理队列。要定义时间范围,请使用24小时格式而不分钟。此参数指定结束,“queue.dequeuetimebegin”指定时间范围的开始。默认值25禁用时间窗口。
其他:
https://www.rsyslog.com/doc/v8-stable/rainerscript/queue_parameters.html
示例
以下是具有自己队列的TCP转发操作示例。
action(type =“omfwd”target =“192.168.2.11”port =“10514”protocol =“tcp”
queue.filename =“forwarding”queue.size =“1000000”queue.type =“LinkedList”
)
global (
maxMessageSize=”32M”
workDirectory=”/data1/ms/log/rsyslog”
)main_queue (
queue.filename=”mainQ”
queue.size=”2000000″
queue.type=”linkedlist”
queue.maxfilesize=”500M”
queue.maxdiskspace=”2G”
queue.workerthreads=”8″
queue.workerthreadminimummessages=”200000″
queue.discardseverity=”8″
queue.checkpointinterval=”10″
queue.timeoutshutdown=”10″
queue.timeoutactioncompletion=”10″
queue.timeoutworkerthreadshutdown=”10″
queue.saveonshutdown=”on”
queue.HighWatermark=”1200000″ #当内存队列长度达到此数时,开始回写磁盘。
queue.LowWatermark=”100000″ #当内存队列长度小于此数时,停止回写磁盘。
queue.DiscardMark=”2000000″ #超出此数后,会禁止新消息入队,丢弃消息。如果前一个被禁止, #那么丢弃数据将无针对性
queue.TimeoutEnqueue=”0″ #超时此数立即丢弃该消息,TCP或local_socket方式下,预防资源夯住,引起崩溃
queue.DequeueBatchSize=”500″ #优化带宽,设置每批次传输元素量,尽可能每次传输更多的数据
)# 监控 rsyslog
module (load=”impstats” interval=”60″ severity=”6″ log.syslog=”on” format=”json-elasticsearch” resetCounters=”on”)
网络相关资料
:
- 官网:https://www.rsyslog.com/
- 源项目: rsyslog项目自述文件。
- 文档: rsyslog-doc项目自述文件