Amr*_*hit 17 logs arch-linux systemd systemd-journald
我有一个系统运行多个守护进程(作为 systemd 单元),它们将日志信息输出到 Arch Linux 的日志中。我想将其中一些单元文件的日志输出定向到我指定其位置的单独文本文件中,实质上是为单元子集创建一个日志文件。我该怎么做呢?
dok*_*000 15
更新:对于较新的 systemd 版本(自 systemd 236 起),这实际上是可能的。见systemd.exec为StandardOutput和StandardError的节。那些支持以下选项,作为摘录:
该文件:路径选项可以被用来连接一个特定的文件系统对象到标准输出。语义类似于 StandardInput= 的相同选项,见上文。如果 path 引用文件系统上的常规文件,则将其打开(如果尚不存在则创建)以在文件开头写入,但不会截断它。如果标准输入和输出被定向到同一个文件路径,它只被打开一次,用于读取和写入和复制。当指定的路径引用文件系统中的 AF_UNIX 套接字时,这特别有用,因为在这种情况下,仅为输入和输出创建单个流连接。
append:path类似于上面的 file:path,但它以追加模式打开文件。
截断:路径与上面的 file:path 类似,但它在打开文件时会截断文件。对于具有多个命令行的单元,例如具有多个 ExecStart= 的 Type=oneshot 服务,或具有 ExecCondition=、ExecStartPre= 或 ExecStartPost= 的服务,输出文件将重新打开,因此为每个命令行重新截断。如果输出文件在另一个进程仍然打开文件时被截断,例如通过 ExecReload= 与 ExecStart= 同时运行,并且另一个进程继续写入文件而不调整其偏移量,则文件指针之间的空间两个进程可能用 NUL 字节填充,产生一个稀疏文件。因此, truncate:path 通常只对一次只运行一个进程的单元有用,例如具有单个 ExecStart= 而没有 ExecStartPost=、ExecReload=、ExecStop= 或类似的服务。
[...]
在FD:名称选项连接标准输出到一个特定的,由插座单元提供了一个名为文件描述符。名称可以指定为该选项的一部分,跟在“:”字符之后(例如“fd:foobar”)。如果未指定名称,则隐含名称“stdout”(即“fd”等效于“fd:stdout”)。必须通过 Sockets= 选项提供至少一个定义指定名称的套接字单元,并且文件描述符名称可能与其包含的套接字单元的名称不同。如果找到多个匹配项,将使用第一个匹配项。有关命名描述符及其顺序的更多详细信息,请参阅 systemd.socket(5) 中的 FileDescriptorName=。
原答案:
上游似乎这是不可能的和不需要的(将 stdout/stderr 重定向到单个文件)参见例如http://lists.freedesktop.org/archives/systemd-devel/2012-March/004705.html - 阅读整个线程以了解更多信息上下文信息这是如何工作的。
您可以做的是记录到系统日志,然后写入单个文件。或者反过来,如果该单元调用某个可以自己写入日志的程序,则使用该程序将其记录到文件中。
您可能还想查看 systemd 服务的查看 stdout/stderr
您可以使用当前设置执行的操作是将
journalctl -u yourunitname > yourlogfile_for_yourunitname
您的单元“yourunitname”的整个日志输出定向到一个文件中。
在后一部分中,您还应该从上述邮件列表线程中查看 Lennart 的提示:
在最近的 systemd 版本上,类似的东西
systemd-journalctl -o cat _SYSTEMD_UNIT=postgresql.service
应该创建一个非常简单的输出,只包含实际的消息而没有其他任何内容。您甚至可以通过“-f”并使其生效。”
编辑:
实际上,对于较新的 systemd 版本,命令只是journalctl,据我所知,上述长命令与上述长命令相同journalctl -u yourunitname
,您也可以-f
在那里“跟踪”输出(如 tailf 或 tail -f 中)。
归档时间: |
|
查看次数: |
32520 次 |
最近记录: |