journalctl 的可选单位列表

Cod*_*Med 29 grep systemd

在 CentOS 7 服务器中,我想获取可以为其journalctl生成日志的可选单元列表。如何更改以下代码来完成此操作?

journalctl --output=json-pretty | grep -f UNIT | sort -u  
Run Code Online (Sandbox Code Playgroud)

在 CentOS 7 终端中,上述代码生成grep: UNIT: No such file or directory.

编辑:

以下 java 程序终止,但不打印所需 grep 的任何输出。除了终端版本之外,我该如何改变一些东西,以便 java 程序可以工作?

    String s;
    Process p;
    String[] cmd = {"journalctl --output=json-pretty ","grep UNIT ","sort -u"};
    try {
        p = Runtime.getRuntime().exec(cmd);
        BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while ((s = br.readLine()) != null)
            System.out.println("line: " + s);
        p.waitFor();
        System.out.println ("exit: " + p.exitValue()+", "+p.getErrorStream());
        BufferedReader br2 = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        while ((s = br2.readLine()) != null)
            System.out.println("error line: " + s);
        p.waitFor();
        p.destroy();
    } catch (Exception e) {}  
Run Code Online (Sandbox Code Playgroud)

gar*_*Red 38

journalctl 可以显示所有单元的日志——这些单元是否写入日志是另一回事。

列出所有可用的单位,因此所有可用的单位journalctl

systemctl list-unit-files --all
Run Code Online (Sandbox Code Playgroud)

至于您的java代码,为了使管道与Runtime.exec()您一起工作,您可以将命令放在脚本中并调用脚本或使用字符串数组,例如:

String[] cmd = {"sh", "-c", "command1 | command2 | command3"};
p = Runtime.getRuntime().exec(cmd);
Run Code Online (Sandbox Code Playgroud)

或者:

Runtime.getRuntime().exec(new String[]{"sh", "-c", "command1 | command2 | command3"});
Run Code Online (Sandbox Code Playgroud)


Evg*_*gin 22

man journalctl 说:

-F, --field= 打印指定字段可以在日志的所有条目中采用的所有可能的数据值。

所以,你可以运行:

journalctl --field _SYSTEMD_UNIT
Run Code Online (Sandbox Code Playgroud)

获取可以为其journalctl生成日志的可选单元列表

(默认情况下,只有root用户和谁是一些特殊群体成员的用户授予访问系统日志和其它用户的日志。该团体的成员systemd-journaladm以及wheel可以读取所有的日志文件。)

  • 这应该是公认的答案,因为“systemd 219”不支持当前接受的答案中提供的参数“list-unit-files --all”。 (2认同)