【问题标题】:Is there a command line tool that will auto pretty-print json?是否有可以自动打印 json 的命令行工具?
【发布时间】:2017-03-28 15:15:06
【问题描述】:

我知道像“jq”这样的工具可以让你在命令中添加一个管道并对其进行格式化,但你不能将它用于显示来自本地服务器的实时 json 日志之类的情况。有没有工具可以做到这一点?

【问题讨论】:

  • 你应该可以使用带有“--unbuffered”选项的jq...
  • @Milney 我的意思是命令不允许添加 ' | jq' 因为它无法识别它。
  • 喜欢什么命令?你应该可以用任何东西做到这一点......
  • 你说的是 Json 日志?你不能只是尾随文件然后通过管道将其传输到 jq 吗?
  • @Milney 就像运行 Node/django/rails 服务器一样,我认为您不能在运行服务器的命令之后附加管道。当这些服务器运行时,它们会输出 json 格式的日志。

标签: json bash shell command-line terminal


【解决方案1】:

我假设您使用安装了systemd 的默认Linux 发行版,并且所有服务都将与systemd 通信以创建协议条目。

过去 linux 只创建日志文件,但它们变得很大。然后他们添加了logrotate 以保持更干净。

最新的 linux 发行版使用systemd 来存储协议条目,这要好得多。

要阅读协议,您需要先找到您正在寻找的服务。
列出与systemd 连接的所有服务调用...

systemctl list-units | grep service

如果你真的不能使用管道,你可以不用grep 来使用它。

无论如何,选择您喜欢的服务并通过journalctl 调用其协议。这里有一些例子......

journalctl -u ssh.service -p warning -n 30  # (sudo) last 30 warnings and errors SSH created 
journalctl -u apache2.service -p err --no-pager # (sudo) all Apache entries without using the pager (less)
journalctl -k -p err --since today  # (sudo) kernel error messages of today

将选项-o json-o json-pretty 添加到其中,您将获得所需的输出。您还可以添加选项-F--follow 以显示最近的日记帐条目,并在新条目附加到日记帐时连续打印它们。这样你就可以用conky 制作很酷的背景。

您还可以通过systemctl 获取服务状态...

systemctl status apache2.service    # (sudo) status of Apache

这样你就可以漂亮的打印出来了……

来自本地服务器的实时 json 日志

如你所愿,不使用jq ...

admin@suse:~$ journalctl -u apache2.service -p warning -n 1 -o json-pretty --no-pager
{
    "__CURSOR" : "s=65cbb17b253f44c0b800cee690cfb9ee;i=187fd;b=d3effa777ddf4ba9b4f82f126be4439e;m=51cb2bb2d53;t=54b7c4c9ffbeb;x=9fd3b1bc1e50a798",
    "__REALTIME_TIMESTAMP" : "1490372117134315",
    "__MONOTONIC_TIMESTAMP" : "5620815834451",
    "_BOOT_ID" : "d3effa777ddf4ba9b4f82f126be4439e",
    "_TRANSPORT" : "syslog",
    "_SYSTEMD_SLICE" : "system.slice",
    "_MACHINE_ID" : "dc3b59f36cc34cfa8873c5b530577a2a",
    "_HOSTNAME" : "suse",
    "SYSLOG_FACILITY" : "1",
    "_UID" : "33",
    "_GID" : "33",
    "PRIORITY" : "4",
    "SYSLOG_IDENTIFIER" : "/usr/lib/cgi-bin/captainlog/search.sh",
    "MESSAGE" : "Request for the specified frontend is not possible. REMOTE_ADDR: xxxx:xxx:xxxx:xxxx:xxxx:xxxx:xxx:xxxx",
    "_COMM" : "logger",
    "_CAP_EFFECTIVE" : "0",
    "_SYSTEMD_CGROUP" : "/system.slice/apache2.service",
    "_SYSTEMD_UNIT" : "apache2.service",
    "SYSLOG_PID" : "21314",
    "_PID" : "21314",
    "_SOURCE_REALTIME_TIMESTAMP" : "1490372117133991"
}

Here is a good guide I found on the internet.

【讨论】:

    猜你喜欢
    • 2019-06-25
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多