我使用omfwd操作从服务器A转发日志。 该操作具有以下模板集: template(name="toRemoteFormat" type="list") { property(name="timestamp" dateFormat="rfc3339") constant(value=" ") property(name="$.service") constant(value=" ") property(name="syslogtag" position.from="1" position.to="32") property(name="msg" spifno1stsp="on" ) property(name="msg") constant(value="\n") } 在接收服务器B (实际的系统日志服务器)上,使用omfile操作将日志事件写入文件。 该操作具有以下模板集: template(name="defaultMsg" type="list") { property(name="timestamp" dateFormat="rfc3339") constant(value=" ") property(name="hostname") constant(value=" ") property(name="syslogtag" position.from="1" position.to="32") property(name="msg" spifno1stsp="on" ) property(name="msg") constant(value="\n") } 我无法理解这些模板如何组合。 我假设使用toRemoteFormat模板格式化离开服务器A的日志事件。 但是,我可以清楚地看到写在服务器B上的日志是用defaultMsg模板格式化的。 服务器A上模板的作用是什么? 正如你所看到的,这些格式之间的区别在于服务器A为日志事件添加了一个$.servicevariables,并且我需要服务器A上的模板来应用。 但是,服务器B没有可用的$.servicevariables,所以我不能在那里使用该模板。
我试图使用ommail通过电子邮件发送通知。 一切工作正常,但我喜欢发送mailbody多行。 module(load="ommail") template (name="mailBody" type="string" string="%msg%") template (name="nodeupdateSubject" type="string" string="Slurm Node Update on Cluster") template (name="nodeerrorSubject" type="string" string="Slurm Node Error on Cluster") if $programname == 'slurmctld' then { if $msg contains "update_node" then { action(type="ommail" server="<server>" port="25" mailfrom="<email>" mailto="<email>" body.enable="on" subject.template="nodeupdateSubject" action.execonlyonceeveryinterval="60") } else if $msg contains "error" then { action(type="ommail" server="<server>" port="25" mailfrom="<email>" […]
我使用日志logging驱动程序运行Docker,并且使用rsyslog(v8.29.0)来收集这些消息,并将它们写入使用容器信息注释的文件。 我遇到的问题是,我无法使用$!中的消息属性 命名空间模板除非我第一次移动到例如本地$. 命名空间。 我从这个configuration开始: module(load="imjournal" StateFile="imjournal.state") template(name="ContainerTemplate" type="list") { property(name="timereported" dateFormat="rfc3339" caseConversion="lower") constant(value=" ") property(name="$!CONTAINER_NAME") constant(value=" ") property(name="$!CONTAINER_ID") constant(value=" ") property(name="msg") constant(value="\n") } if (strlen($!CONTAINER_NAME) > 0) then { action(type="omfile" file="/var/log/containers.log" template="ContainerTemplate") } 即使定义了$!CONTAINER_NAME和$!CONTAINER_ID ,它们也会在生成的模板中展开为空string。 我可以像这样解决它,通过使用现有属性的值显式设置新的属性: template(name="ContainerTemplate" type="list") { property(name="timereported" dateFormat="rfc3339" caseConversion="lower") constant(value=" ") property(name="$.container_name") constant(value=" ") property(name="$.container_id") constant(value=" ") property(name="msg") constant(value="\n") } if […]
我刚刚设置了RSYSLOG 8.16。 我没有改变任何默认的conf文件或默认模板(除了得到RSYSLOG运行和工作)。 我没有添加自定义模板。 日志似乎正在工作,但是到自定义位置的日志数据仍然被复制到系统日志。 我很确定我已经确定了默认模板中的违规行,但迄今为止我所做的任何调整似乎都是通过中断所有logging到syslog的日志来修复这个doublelogging。 这是我的自定义模板: $template TmplAuth, "/var/log/client_logs/%HOSTNAME%/%PROGRAMNAME%.log" $template TmplMsg, "/var/log/client_logs/%HOSTNAME%/%PROGRAMNAME%.log" authpriv.* ?TmplAuth *.info;mail.none;authpriv.none;cron.none ?TmplMsg 这里是我的默认模板的未评论的部分: auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog kern.* -/var/log/kern.log mail.* -/var/log/mail.log mail.err /var/log/mail.err news.crit /var/log/news/news.crit news.err /var/log/news/news.err news.notice -/var/log/news/news.notice *.emerg :omusrmsg:* daemon.*;mail.*;\ news.err;\ *.=debug;*.=info;\ *.=notice;*.=warn |/dev/xconsole 老实说,我不介意通过自定义模板的格式来运行一切,甚至是来自本地系统的东西,但是我不知道是否有这样的规则可以写,或者如果我必须重写所有那些默认configuration中的项目指向自定义模板。 或者,我也很好奇我怎么写这个,以便本地机器信息通过正常的过程,但通过模板logging来自外部系统的任何信息。 如果我想稍后改变某些事情,我会对如何达成任何结果的一些指导感兴趣。 大多数情况下,我只想摆脱目前信息翻倍的情况。
我们目前正在运行rsyslog版本7.4.7。 我们的日志文件中的当前格式是: 2017-10-19T14:06:01.123456-04:00 server-1 systemd: Created slice user-9999.slice. 这种格式包括高精度格式(六个零)。 如何创build一个模板或configurationrsyslog只包含三个零: 2017-10-19T14:06:01.123-04:00 server-1 systemd: Created slice user-9999.slice.
假设我在ubuntu 16.04上有很多systemd服务单元,如下所示: [Unit] Description=Do something script After=default.target [Service] ExecStart=/usr/local/sbin/some-script-x.sh Type=simple StandardOutput=syslog StandardError=syslog SyslogIdentifier=some-script [Install] WantedBy=default.target 另外我已经configurationrsyslog像这样: if $programname == 'some-script-x' then /var/log/some-script-x.log 完成。 服务日志写入他们的日志。 我想旋转/var/log/some-script-x.log像默认的日志文件,如syslog。 我有一个configuration原型: /var/log/some-script-x.log { rotate 30 daily missingok notifempty delaycompress compress postrotate invoke-rc.d rsyslog rotate > /dev/null endscript } 但系统已经有一个文件/etc/logrotate.d/rsyslog ,其中包含以下的invoke-rc.d rsyslog rotate > /dev/null 。 在这种情况下,系统日志服务器会有多个循环调用。 这让我担心。 如何告诉rsyslog我只想旋转特定的服务日志。 或者如何正确设置旋转,没有额外的电话?
Rsyslog在发送端和/或源端被阻塞/冻结,从而导致服务器总体停滞/缓慢,这从一个问题开始,并且继续/多less涉及: Rsyslog队列和性能影响 我认为这是一个很好的post,有很好的答案,触及我最近的一些问题。 我对rsyslog本身有很多疑问 – 甚至在阅读了数十次的文档并为它提供了一些基础设施之后,我将重点关注那些与我看到的这个post / current问题有关的问题 也许一些configuration可以在问题之前提供帮助;现在让我们来看看这样的事情,但是我甚至直接在两个规则集上都有这个configuration, 我只是为了有一些想法而把它放在这里,不要把它当作绝对的完整configuration,因为我不确定哪种方式对于服务器和客户端的压力较小,而不是放松事件,失去一些事件的结局比拖延一切事情更为可取。 configuration示例 所以直接这个词:a)直接行动队列和b)直接规则集队列。 当消息被应用到这些直接排队的后面/后面(按照时间顺序排列)时,假设发生了什么? 正如所解释的, 直接意味着没有队列本身,但它说了一些关于“返回码(成功/失败)”,这是否意味着如果事件发送失败,发件人或上一个线程将被通知? 例如:我们在规则集(侦听器发送消息的地方)中有直接队列 – 不确定消息是否通过另一个“主队列”前往此规则集,在这里,我是这些规则集之后的侦听器是第一个整个生态系统“)+我们在行动前有直接排队,但是由于pipe道是满/目的地(tcp)不可达,所以我们不能完成这个行动。 项目清单 行动的直接队列的线程/工作者将通知线程/工作者规则集的直接队列(都在相同的服务器系统上),这又将通知本地OS /或者可能客户端/发送器rsyslog / client / sender OS事件不能被写入,一切都将最终与本地和远程服务器被冻结/冻结? 如果这是真的(在上面),那么将动作和规则集队列都configuration为LinkedList或只将规则集队列configuration为LinkedList将解决此问题? (也许通过强制甚至timeoutenqueue为0) 项目清单 或者把它放在一个不同的格式中 – 直接和LinkedList在与客户端/发送者/生产者的通信方面有什么不同,哪一个会减less压力/哪一个可以configuration给发送者(即使它是在同一个系统上的rsyslog远程或以前的工人)容易的时候? 总是我有印象,我明白,或者我已经接近理解rsyslog中的队列,但总是现实,我拍我。 例如,我首先想到,把所有东西都设置为直接的,不会给系统带来压力,信息会来,它会被发送,而不会被检查,如果这样做的话,但是如果没有排队,它就会丢失。我不确定这是怎么回事。 反过来,我认为LinkedList或其他types的队列确实将消息保留在队列中,并根据一些configuration细节(timeoutenqueue)将消息保留在之前的队列中,因此给系统带来一些压力。 项目清单 我们当然可以扩展与pipe道/文件和ompipe / omfile行为有关的问题,毕竟这里可能是最后一个碰撞,如果这里有一个问题,它可以触发一个多米诺骨牌回到远程发件人一路回来通过在本地系统上configuration的所有队列。 我认为,虽然我们有pipe道作为目的地和ompipeconfiguration在他们面前,没有反馈从操作系统rsyslog如果行动成功(从经验观察说);虽然有pipe道作为目的地和使用omfile似乎有很多的反馈,因为pipe道似乎感觉真的很快(我们假设pipe道根本没有读取,只是为了简单起见),队列开始真的很快填充 – pipe道+ ompipe似乎不是pipe道接受更多消息的情况。 我有点担心把这两个主题(队列+ ompipe / omfile),但也许看到整个上下文可以帮助有经验的人推荐或解释一些rsyslog的行为 非常感谢,这里的帮助是非常需要的! 否则真的很好的信息,真的很好,但我想我仍然错过服务器端的这些细节,而客户端上的一些选项已被解释kb PS:我可能发布这里 – http://kb.monitorware.com – 以及我不知道在哪里答案有更大的机会popup:)
现在,我想分析日志从Python的库logging ,我想通过logger的名字是logger的属性过滤日志。 我想我可以使用正则expression式从msg或rawmsg提取logger的名称。 但是这个问题是很难findrsyslog只是支持一个基本的正则expression式。 我曾尝试过像前瞻性的组合和向后看的组合。 而且我也找不到即使是一个简单的捕获组的使用。 在rsyslog中是否有捕获组支持? 顺便说一下,我使用的是centos6.9,所以rsyslog的版本是v5。
我想问关于从主机邮件属性的问题。 http://www.rsyslog.com/doc/v7-stable/configuration/properties.html 我在RHEL 7.3上使用rsyslog 7.4.7 。 但是,从主机邮件属性似乎将主机名设置为小写字母,即使大写字母用于在/ etc / hosts / / etc / hosts文件 [root@RHEL73-1 log]# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0.2.12 RHEL73-1 10.0.2.13 RHEL73-test 但是,从主机收到远程日志的日志被设置为小写字母 。 Debug line with all properties: FROMHOST: 'rhel73-test', fromhost-ip: '10.0.2.13', HOSTNAME: 'RHEL73-2', PRI: 30, syslogtag 'systemd:', programname: 'systemd', APP-NAME: 'systemd', PROCID: […]
有一个来自程序(即supervisord)的日志inputrsyslog。 他们的消息从" real-program-name rest of the message" ,我试图: 将real-program-name设置为real-program-name而不是supervisord 从消息中删除程序名称。 我目前正在这样做: if ($programname == "supervisord") then { set $.programname = re_extract($msg, "^ ([^ ]+)", 0, 1, $programname); set $.msg = re_extract($msg, "^ [^ ]+ (.+)", 0, 1, $msg); } (编辑:我用$!而不是$.试过,同样的问题) 在我的configuration文件/脚本中的以下行是 if ($programname startswith "real") then {…} 所以日志告诉我,程序名是否被真正的程序名取代 日志说: processBATCH: next msg 0: <14>Nov 22 […]