AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 847238
Accepted
Eric Duncan
Eric Duncan
Asked: 2017-04-29 11:02:13 +0800 CST2017-04-29 11:02:13 +0800 CST 2017-04-29 11:02:13 +0800 CST

问:journalctl 用自己的元数据为消息添加前缀?

  • 772

如何journald在日志消息中使用元数据为日志条目添加前缀?

我想我可能必须查看其中一个详细输出,过滤掉换行符和所有额外信息,只找到我正在寻找的项目(日期时间、Docker CONTAINER_NAME、消息),然后将其余的全部忽略到一行。

可以使用类似的东西awk来去除换行符,只抓取 X、Y、Z 行,并将它们显示在一行上吗?那么 args 如何知道对每条 X、Y、Z 行进行分组?我的意思是,args 如何知道每个“分组”?

更多信息如下。


这是我正在记录到日志的两个不同 docker 容器中的两行:

Apr 28 18:09:43 rschool dockerd[1366]: [pid: 9|app: 0|req: 1/1] 68.180.230.53 () {48 vars in 934 bytes} [Fri Apr 28 14:09:42 2017] GET /enrollment/info-sessions/ => generated 17175 bytes in 1072 msecs (HTTP/1.0 200) 3 headers in 112 bytes (1 switches on core 0)
Apr 28 18:09:43 rschool dockerd[1366]: 68.180.230.53 - - [28/Apr/2017:18:09:43 +0000] "GET /enrollment/info-sessions/ HTTP/1.1" 200 3495 "-" "Mozilla/5.0 (Macintosh; IntelMac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36" "-"

如您所见,您无法分辨哪个日志条目属于哪个 docker 容器。

有元数据可用于查看完整的日志消息。这是其中一条消息,当查看时journald -o verbose:

_UID=0
_GID=0
_SYSTEMD_SLICE=system.slice
_BOOT_ID=f4a6e9569f0349d1817bd92ab779ebe3
_MACHINE_ID=a62f158e48fc45eeb32afaef98d24d5b
_HOSTNAME=rschool
_TRANSPORT=journal
_CAP_EFFECTIVE=3fffffffff
_PID=1366
_COMM=dockerd
_EXE=/usr/bin/dockerd
_CMDLINE=/usr/bin/dockerd -H fd://
_SYSTEMD_CGROUP=/system.slice/docker.service
_SYSTEMD_UNIT=docker.service
CONTAINER_NAME=rschool_web_1
CONTAINER_ID=732e5bf0d0a1
CONTAINER_ID_FULL=732e5bf0d0a1cc110cacce68850143aa3534
CONTAINER_TAG=rschool_web/rschool_web_1/732e5bf0d0a1
MESSAGE=[pid: 9|app: 0|req: 1/1] 68.180.230.53 () {48 vars in 934 bytes} [Fri Apr 28 14:09:42 2017] GET /enrollment/info-sessions/ => generated 17175 bytes in 1072 msecs (HTTP/1.0 200) 3 headers in 112 bytes (1 switches on core 0)
_SOURCE_REALTIME_TIMESTAMP=1493402983899475
Fri 2017-04-28 18:09:43.901030 UTC [s=9d2777df7c3e4658a6d3d2c7896376ce;i=13ca;b=f4a6e9569f0349d1817bd92ab779ebe3;m=c91fe4d38;t=54e3dfa5ca862;x=f8ee400046f7d86f]
PRIORITY=6

但是 journald 似乎与-o verbose.

使用 journald 的 Docker 日志驱动程序的一部分,它添加了诸如CONTAINER_NAME- 这正是我正在寻找的东西。

如何使用类似于的格式显示 CONTAINER_NAME -o short?

journald
  • 1 1 个回答
  • 853 Views

1 个回答

  • Voted
  1. Best Answer
    Eric Duncan
    2017-04-29T11:02:13+08:002017-04-29T11:02:13+08:00

    好的,我在打字时找到了答案。虽然它非常冗长。所以一个 bash 别名会有所帮助(见最后)。把它变成一个“维基答案”,因为我花了很长时间才输入并找到答案。也许有一天它可以帮助别人。


    有可用的 JSON 输出格式-o json。

    我们可以用来jq从 json 中挑选东西,格式化并连接它们,然后将它们显示在一个单一的文件中。

    journalctl -f -n 100 -o json | jq -r '.__REALTIME_TIMESTAMP + " " + .PRIORITY + " " + ._HOSTNAME + " " + ._SYSTEMD_UNIT + " " + .CONTAINER_TAG + " " + .MESSAGE'
    

    我使用 dockertag选项来指定自定义标签。例如,我的docker-compose.production.yml覆盖看起来像:

    version: '2'
    services:
        nginx:
            restart: always
            ports:
                - "80:80"
                - "443:443"
            logging:
                driver: journald
                options:
                    tag: "{{.ImageName}}/{{.Name}}/{{.ID}}"
    

    这给了我这样的一行:

    1493405629162557 6 rschool docker.service nginx:1.12.0-alpine/rschool_nginx_1/0f6b8d772957 X.X.X.X - - [28/Apr/2017:18:53:49 +0000] "GET / HTTP/1.1" 200 4399 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36" "-"
    

    这正是我所追求的。这也与所有其他日记条目兼容:

    1493405535267844 4 rschool   [UFW BLOCK] IN=eth0 OUT= MAC=9e:51:e1...:08:00 SRC=X.X.X.X DST=X.X.X.X LEN=439 TOS=0x00 PREC=0x00 TTL=57 ID=41599 DF PROTO=UDP SPT=5273 DPT=5060 LEN=419 
    

    如果你不使用 docker log 标签,你可以只使用 CONTAINER_NAME:

    journalctl -f -n 100 -o json | jq -r '.__REALTIME_TIMESTAMP + " " + .PRIORITY + " " + ._HOSTNAME + " " + ._SYSTEMD_UNIT + " " + .CONTAINER_NAME + " " + .MESSAGE'
    

    这应该适用于所有 Docker 容器,无论 linux 系统日志记录到日志。

    剩下的就是把它变成一个 bash 别名以便快速引用。将此添加到您的~/.bash_aliases和中source ~/.bash_aliases:

    alias journalctlf="journalctl -f -n 100 -o json | jq -r '.__REALTIME_TIMESTAMP + \" \" + .PRIORITY + \" \" + ._HOSTNAME + \" \" + ._SYSTEMD_UNIT + \" \" + .CONTAINER_NAME + \" \" + .MESSAGE'"
    

    (“f”代表格式化)

    然后你可以journalctld直接运行,并用 docker 容器名称沐浴在 jorunald 的荣耀中。

    • 2

相关问题

  • 不要将 ISC DHCP 服务器的“无免费租约”消息写入 systemd 日志

  • 结合本地和远程日志日志

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve