当前位置: 首页 > 知识库问答 >
问题:

将转发的rsyslogs写入journald以便能够根据syslog_identifier筛选它们?

养振濂
2023-03-14

你好StackOverflow众神/常客/用户!

我目前正在为服务器上运行的两个应用程序开发一个日志系统。

下面是上下文:

    null

    [Unit]
    Description="Algo EP"
    [Service]
    Type=simple
    User=me
    WorkingDirectory=/home/me/bin
    ExecStart=/home/me/bin/AlgoEp
    StandardOutput=syslog
    StandardError=syslog
    SyslogIdentifier=dev1_algo_ep
    [Install]
    WantedBy=multi-user.target

    null

    [Unit]
    Description="Algo MDW"
    [Service]
    Type=simple
    User=me
    WorkingDirectory=/home/me/bin
    ExecStart=/home/me/bin/AlgoMdw
    StandardOutput=syslog
    StandardError=syslog
    SyslogIdentifier=dev1_algo_mdw
    [Install]
    WantedBy=multi-user.target

    null

    [Unit]
    Description="Algo EP"
    [Service]
    Type=simple
    User=me
    WorkingDirectory=/home/me/bin
    ExecStart=/home/me/bin/AlgoEp
    StandardOutput=syslog
    StandardError=syslog
    SyslogIdentifier=dev2_algo_ep
    [Install]
    WantedBy=multi-user.target

我希望在使用journalctl(systemd-journal)对dev1进行ssh时能够读取每个服务的日志。

如下所示:JournalCTL-T DEV1_ALGO_EP-T DEV1_ALGO_MDW-T DEV2_ALGO_EP

因此,我在dev2上添加了rsyslog.d/algo-ep.conf:

if $programname == 'dev2_algo_ep' then {          
        action(type="omfwd"                       
           queue.type="linkedlist"                
           queue.filename="algo_fwd"              
           queue.saveOnShutdown="on"              
           action.resumeRetryCount="-1"           
           target="dev1" port="514" protocol="tcp"
        )
}

并在dev1上添加了rsyslog.d/algo.conf:

module(load="imtcp")
module(load="omjournal")

ruleset(name="remote-dev2") {
        action(type="omjournal")
}

input(type="imtcp" port="514" ruleset="remote-dev2")

在这一点上,没有问题,我在journalctl中获得了journalctl-r:

Nov 23 13:27:47 dev1 dev2_algo_ep[3142]:[15246]:  Ep Server listening on localhost:10001...
Nov 23 13:27:47 dev1 dev2_algo_ep[2421]:[15246]:  Ep Server stops...
[...]
me@dev1:~$ journalctl -t dev2_algo_ep
-- Logs begin at Fri 2018-06-01 13:54:11 CEST, end at Fri 2018-11-23 13:27:47 CET. --
me@dev1:~$
  1. 使用特定的SYSLOG_IDENTIFIER将日志从dev2导出到dev1?
  2. 还是在dev1上接收日志并在将其发送到journald之前设置特定的SYSLOG_IDENTIFIER?
  3. 还是仅仅这样做?

提前感谢您的建议,您的帮助和您的信息!

[编辑]似乎对rsyslog+journald的组合知之甚少。我在手册页中没有找到任何东西(除了在dev1上创建一个模板以在接收时重建日志的可能性,但在我看来很奇怪)。

共有1个答案

耿玄裳
2023-03-14

由于您已经从journalctl获得了日志,因此可以使用json格式检查所需行的字段,例如检查syslog_identifier字段中的值。

下面的行显示syslog_identifiernginx,因此可以使用journalctl-t nginx

journalctl -o json
{ "__CURSOR" : "s=00000000000000000000000000000000;i=146c8;b=170127f0cd5441a3bea76fe326915bd0;m=bb5bba879;t=590367fad5ace;x=33cdab5cd2077705", "__REALTIME_TIMESTAMP" : "1565938628254414", "__MONOTONIC_TIMESTAMP" : "50293614713", "_BOOT_ID" : "170127f0cd5441a3bea76fe326915bd0", "_SELINUX_CONTEXT" : "unconfined\n", "_SYSTEMD_SLICE" : "system.slice", "_MACHINE_ID" : "4211ff3f594041f3966d836585a11a05", "_HOSTNAME" : "VM-0-4-ubuntu", "_TRANSPORT" : "journal", "_CAP_EFFECTIVE" : "0", "PRIORITY" : "5", "_UID" : "102", "_GID" : "106", "_COMM" : "rsyslogd", "_EXE" : "/usr/sbin/rsyslogd", "_CMDLINE" : "/usr/sbin/rsyslogd -n", "_SYSTEMD_CGROUP" : "/system.slice/rsyslog.service", "_SYSTEMD_UNIT" : "rsyslog.service", "_PID" : "3280", "_SYSTEMD_INVOCATION_ID" : "270801fdff7943bc83cd7cef242b3271", "CODE_FILE" : "omjournal.c", "CODE_LINE" : "270", "CODE_FUNC" : "send_non_template_message", "SYSLOG_FACILITY" : "16", "SYSLOG_IDENTIFIER" : "nginx", "MESSAGE" : "36.24.73.111 - - [16/Aug/2019:14:57:08 +0800] \"GET /favicon.ico HTTP/1.1\" 200 946 \"http://111.231.88.233/todo\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36\"", "_SOURCE_REALTIME_TIMESTAMP" : "1565938628254404" }

选项2如果找不到syslog_identifier,请检查rsyslog输入模块文档。IMFile具有tag参数,因此可以使用JournalCTL-T nginx获取日志。检查以下示例

module(load="imfile")
module(load="omjournal")

ruleset(name="nginx") {
    action(type="omjournal")
}

input(
    type="imfile"
    File="/var/log/nginx/access.log"
    tag="nginx"
    ruleset="nginx")
    null
 类似资料:
  • 使用这种格式,我需要编写一个bash脚本,其中我可以将Bucketname和FilesNames作为文本文件传递,它将作为BucketName1/File1,File2运行它..文件存储桶名称1/文件1,文件2....FileN 下面是我写的。但是我没有得到所需的输出。

  • 我需要使用Sheets API阅读Google工作表。我可以获取所有行,但是由于这些行有上万行并且将继续增长,我需要找到一种方法来过滤它们而不获取所有行。 我只需要一个SQL WHERE子句,其中包含一个或多个列的相等条件。例如,在工作表中有一个phoneNumber列,它是C列。我只需要获取该列的值等于某个值的行。 我目前使用的Google Sheets V4 API为Node.js.我使用的是

  • 我的页面结构 页面1(模板-作业页面) 第2页(模板-作业页) 第3页(模板-作业页) 第4页(模板-作业页) 后端开发人员(普通文件夹) null null 页面1(模板-作业页面) 第2页(模板-作业页) 第3页(模板-作业页) 第4页(模板-作业页) 我的问题是:我以这样一种方式编码,每当我击中(职业第1页),我得到的页面列表使用了一个工作页面模板,所以我得到了职业第1页的第1-8页列表和职

  • 我在Python中使用一个视频游戏的熊猫DataFrame,每个游戏都有一种类型。我正在尝试删除任何在DataFrame中出现次数少于一定次数的类型的视频游戏,但我不知道该怎么做。我确实发现了一个StackOverflow问题,这个问题似乎是相关的,但我根本无法破译这个解决方案(可能是因为我从未听说过R,而且我对函数编程的记忆充其量也很生疏)。 帮助?

  • 我创建了一个用户,他属于一个名为Security的组。在Camunda modeler中,我明确地将任务分配给了组设施。然而,在运行应用程序时,我可以看到属于组安全性的用户可以查看并声明分配给组设施的任务。 如何确保任务列表仅显示分配给特定用户组的任务?目标是用户可以查看另一个组的任务。