3
votes

Service Systemd et journalisation structurée

J'ai un service systemd qui est de type simple .

Je veux que mon service enregistre les paires clé-valeur.

Jusqu'à présent, mon service simple imprime simplement il se connecte à stdout dans une syntaxe de valeur-clé personnalisée.

Je voudrais éviter ma syntaxe de valeur-clé personnalisée, il utilise une méthode officielle de journalisation structurée.

Y a-t-il un moyen d'utiliser des journaux structurés avec systemd?

Par exemple, mon service écrit ceci dans stdout:

{"key1": "value1", "key2": 1234}

Ce serait formidable que systemd puisse lire la chaîne comme json.


1 commentaires

Veuillez donner un exemple de la journalisation réelle de l'application et du résultat attendu.


3 Réponses :


4
votes

Vous pouvez enregistrer des données structurées dans systemd , puis les afficher telles quelles ou au format json

Disons que nous enregistrons les paires clé-valeur au format json

sudo logger --journald <<end
MESSAGE_ID=67feb6ffbaf24c5cbec13c008dd72309
MESSAGE=The dogs bark, but the caravan goes on.
SYSLOG_IDENTIFIER=struct_logs
KEY=bark
VALUE=goes on
end


3 commentaires

J'utilise le type de service "simple". Existe-t-il un moyen de laisser la sortie standard du processus accéder à un journal structuré?


Si j'ai bien compris votre réponse, alors le json n'est qu'une chaîne pour systemd / journalctl.


Oui, juste une chaîne.



3
votes

Jetez un œil à Journalisation structurée dans journald à partir d'un conteneur Docker ; votre application doit utiliser la méthode sd_journal_send si vous souhaitez spécifier des champs personnalisés.

Si votre application n'est pas en mesure de le faire, vous pouvez également afficher json - qui se retrouvera dans le MESSAGE , vous pouvez ensuite analyser vous-même. Par exemple, j'ai écrit SystemdJournal2Gelf pour envoyer les entrées de journal à Graylog et il prend également en charge la sortie json dans le MESSAGE , en l'envoyant à Graylog en tant que champs séparés pour le filtrage

Si vous ne voulez pas modifier l'application, vous pouvez utiliser un script séparé - quelque chose comme ceci: p >

[Service]
ExecStart=/bin/sh -c '/bin/my-app | while read l; do echo "$l" | logger --journald; done'

Vous pouvez même convertir json en paires clé / valeur si vous le souhaitez, ou utiliser StandardOutput pour envoyer votre sortie standard à une socket sur laquelle vous avez un service d'écoute séparé.


1 commentaires

J'ai aussi pensé à un tel emballage. Mais je ne suis pas sûr que la gestion du signal pour le redémarrage fonctionne toujours si vous enveloppez le service réel.



1
votes

Eh bien, systemd ne facilite pas la journalisation structurée à partir d'un flux de texte. Il souhaite que vous preniez une dépendance sur sa bibliothèque et que vous utilisiez sd_journal_send (voir par exemple http://0pointer.de/blog/projects/journal-submit.html ). Je n'ai trouvé aucune norme de "forme de texte" qui permette à systemd de comprendre que votre ligne ne doit pas être regroupée dans les champs MESSAGE mais plutôt être interprétée comme une paire clé-valeur. Je suppose qu'une solution serait d'écrire un processus d'aide qui analyse votre stdout, puis d'appeler l'enregistreur systemd. Vous dirigeriez ensuite votre processus stdout vers

Cependant, j'ai trouvé cette réponse qui redirige directement dans le journald prise. Avec une utilisation intelligente de jq, vous pouvez écrire quelque chose qui exploite cela. Mais cela semble hacky: je ne sais pas si systemd a vraiment l'intention de garder une compatibilité sur cette socket.


0 commentaires