Journalctl:将_SYSTEMD_UNIT字段添加到日志打印输出中

时间:2014-06-25 08:09:56

标签: logging docker systemd journal coreos

使用命令:

  

/ usr / bin / journalctl -o short -f | ncat {some-ip} {some port}

将日记输出转发到某个远程日志跟踪应用程序。

问题是我在打印输出中缺少systemd单元/服务名称,因此很难判断哪个服务生成了哪个日志行。

例如这是一个nginx行:

  

Jun 25 07:51:09 localhost bash [497] :10.23.132.98 - -   [25 / Jun / 2014:07:51:09 +0000]" GET /page.html HTTP / 1.1" 200 321   " HTTPS:// {IP}" " Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.36   (KHTML,像Gecko一样)Chrome / 35.0.1916.153 Safari / 537.36"

在日志中有 bash [497] - 进程的PID。如何在日志中添加更多数据?例如,此PID的docker容器名称还是systemd服务/单元名称?

4 个答案:

答案 0 :(得分:1)

不要使用-o short,它会删除信息!

尝试-o json-o verbose

答案 1 :(得分:1)

Python可以这样做:

from systemd import journal

j = journal.Reader()
j.this_boot()
j.add_match(_SYSTEMD_UNIT="newnginx.service")
for entry in j:
   print('{} {}'.format(entry['_SYSTEMD_UNIT'], entry['MESSAGE']))

(CentOS 7上的python)

答案 2 :(得分:0)

最后我以不同的方式实现了这个

每个service / systemd单元都有一个后执行脚本,使用:

  

/ usr / bin / journalctl -u {unit name} -o short -f | sed's / ^ / {unit name} /'| ncat {some-ip}   {some port}

现在我在日志行的开头有单位名称!我的日志收集器在消息中有单元名称!

示例

  

journalctl -u mongodb.service -o short -f | sed's / ^ / mongodb.service   /'| ncat {some-ip} {some port}

将输出:

  

mongodb Jun 26 09:11:35 localhost bash [1710]:   2014-06-26T09:11:35.714 + 0000 [rsHealthPoll] replset info   mongodb-0:27017心跳失败,正在重试

答案 3 :(得分:0)

而不是_SYSTEMD_UNIT字段使用容器名称。

我在这里登陆是因为docker stack/swarm缺少docker-compose logs功能来记录单个节点上的所有服务。

使用Docker Server版本:18.03.0-ce和docker编写版本3.6,可以将所有日志发送到journald并按服务名称记录它们。为了识别每个容器,用图像名称标记它们。请参阅docker-compose.dev.yml的日志记录部分

Docker撰写:

version: '3.6'
networks:
    skynet:
    driver: overlay
services:
    mongo:
        image: mongo:3
        networks:
            - skynet
        volumes:
            - /data/mongodb:/data/db
        logging:
            driver: "journald"
            options:
                tag: "{{.Name}}"
                labels: "com.docker.stack.namespace"

journalctl:

sudo journalctl -b -o short --all -f COM_DOCKER_STACK_NAMESPACE=skynet 

Docker Command:

docker stack deploy -c docker-compose.dev.yml skynet

将输出:skynet_mongo.1.ins4s13luwiekrri3m5a8vwwl

Apr 24 14:23:08 c-wrk skynet_mongo.1.ins4s13luwiekrri3m5a8vwwl[19410]: 2018-04-24T12:23:08.212+0000 I NETWORK  [listener] connection accepted from 10.0.0.10:36518 #3 (3 connections now open)

使用完整备注:

要查看可用标签,请使用:docker inspect -f {{.Config.Labels}} <docker-id>

可用标签使用:Customize log driver output

配置日记日志驱动程序:Docker Journald logging driver

着色日志输出:使用journalctl | ccze -A