Journalctl : add _SYSTEMD_UNIT field into log printout

倖福魔咒の 提交于 2019-12-23 19:20:15

问题


Using the command:

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

To forward journal output to some remote log tracking app.

Problem is that I'm missing the systemd unit / service name in the printout making it hard to tell which service produces what log line.

for example this is a nginx line :

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, like Gecko) Chrome/35.0.1916.153 Safari/537.36"

In the log there is bash[497] - the PID of the process. How can I add more data to the log ? For example the docker container name of this PID or the systemd service/unit name ?


回答1:


Don't use -o short, it removes information!

try -o json or -o verbose




回答2:


Python can do this:

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']))

(python on CentOS 7)




回答3:


In the end ive implemented this in a diffrent way

each service / systemd unit has a post execute script that uses :

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

now i have the unit name in the begining of the log line ! and my log collector has unit names in the message !

example

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

will output :

mongodb Jun 26 09:11:35 localhost bash[1710]: 2014-06-26T09:11:35.714+0000 [rsHealthPoll] replset info mongodb-0:27017 heartbeat failed, retrying




回答4:


Instead of _SYSTEMD_UNIT field use the container name.

I landed here because docker stack/swarm is missing the docker-compose logs feature to log all service on a single node.

With Docker Server Version: 18.03.0-ce and docker compose version 3.6 it is possible to send all logs to journald and log them by service name.In order to identify each container, tag them with the image name. See the logging section of docker-compose.dev.yml

Docker Compose:

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

Will output: 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)

Use full notes:

To view available labels use: docker inspect -f {{.Config.Labels}} <docker-id>

Available tags use: Customize log driver output

Config journald log driver: Docker Journald logging driver

Colorize log output: use journalctl | ccze -A



来源:https://stackoverflow.com/questions/24403387/journalctl-add-systemd-unit-field-into-log-printout

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!