如何从systemctl状态服务查看完整日志?

10r*_*nho 683 logs systemd

我用 来检查服务状态systemctl status service-name

默认情况下,我只看到几行,所以我添加-n50以查看更多。

有时,我想从头开始查看完整日志。它可能有 1000 行。
现在,我检查它,-n10000但这看起来不是很好的解决方案。

是否有类似于less命令的选项来检查完整的 systemd 服务日志?

lar*_*sks 971

只需使用journalctl命令,如:

journalctl -u service-name.service
Run Code Online (Sandbox Code Playgroud)

或者,仅查看当前启动的日志消息:

journalctl -u service-name.service -b
Run Code Online (Sandbox Code Playgroud)

对于 named <something>.service,您实际上可以只使用<something>,如下所示:

journalctl -u service-name
Run Code Online (Sandbox Code Playgroud)

但是对于其他类型的单元(套接字、目标、计时器等),您需要明确。

在上面的命令中,-u标志是 , 的缩写--unit,并指定您感兴趣的单位的名称。 -b是 , 的缩写--boot,并将输出限制为仅当前启动,这样您就不会看到很多旧消息。有关更多信息,请参阅journalctl 手册页

  • 附加 `-f` 将跟踪(打印)日志更新 (115认同)
  • 附加`-e` 将在末尾启动日志,无需滚动,但不会事先打印整个日志。 (79认同)
  • 附加 `--no-pager` 将打印完整日志,因此您不必滚动 (68认同)
  • 附加`--help`会让你看到所有可用的选项 (55认同)
  • 实际上,这对我没有帮助 - 我只想要输出,因为该单元是(重新)启动的。`sudo systemctl -n 99999 status` 给了我这个,但显然 journalctl 只能过滤“从启动”,而不是“从服务启动”。 (6认同)
  • 管道输出时不需要“--no-pager”。仅当输出到交互式终端时禁用寻呼机才有用。当您将输出通过管道传输到其他内容时,“journalctl”不使用分页器。 (2认同)

小智 49

systemctl通过添加-l标志,可以包括其状态列表的完整输出,而不被截断:

systemctl -l status service-name
Run Code Online (Sandbox Code Playgroud)

-l: 不要用省略号截断条目 (...)

--no-pager 可以添加以避免在输出是交互式终端时调用寻呼机。

  • 这个答案是错误的。输出保持截断。 (23认同)
  • 你能以某种方式明确你的答案吗?添加有关选项的一些解释,并毫不犹豫地[格式化](https://stackoverflow.com/editing-help) 您的答案! (7认同)

小智 18

使用 journalctl 查看系统日志

没有PagingPermalink 的情况下查看journalctl要将日志发送到标准输出并避免对它们进行分页,请使用 --no-pager 选项:

journalctl --no-pager

不建议您在没有首先过滤显示的日志数量的情况下执行此操作。

journalctl -u service-name.service

显示时间范围内的日志Permalink 使用 --since选项显示指定日期和时间之后的日志:

journalctl --since "2018-08-30 14:10:10"

使用 --until 选项显示指定日期和时间之前的日志:

journalctl --until "2018-09-02 12:05:50"

结合这些以显示两次之间的日志:

journalctl --since "2018-08-30 14:10:10" --until "2018-09-02 12:05:50"

更多信息


J11*_*J11 10

使用 journalctl

将日志写入文本文件

并自下而上阅读

journalctl -u service-name.service > file_name.txt

tail file_name.txt
Run Code Online (Sandbox Code Playgroud)


小智 7

大多数时候,使用以下 bash 命令既方便又容易:

journalctl -xefu service-name.service
Run Code Online (Sandbox Code Playgroud)

或者

journalctl -xefu service-name
Run Code Online (Sandbox Code Playgroud)

它的工作方式就好像进程是通过 shell 执行的,并且输出是动态变化的(类似于tail -f)。


Ten*_*ken 6

由于@Julien的答案似乎不再适用于我的系统(Debian 11),我终于屈服并劫持了我系统上的 systemctl :

systemctl() { 
    if [[ "${1-}" == "log" ]]; then  
        /usr/bin/journalctl -u "${@:2}"; 
    else /usr/bin/systemctl "$@";
    fi 
}
Run Code Online (Sandbox Code Playgroud)

将此 oneliner 添加到您的 .bashrc 中,您的 systemctl 将获得一个新的log“动词”来提供缺少的功能。不再浪费时间重新输入繁琐的命令。

作为额外的好处,此方法还可以让您访问所有选项journalctl(前提是它们在单位名称之后指定):

systemctl log named.service --since=today
Run Code Online (Sandbox Code Playgroud)