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.
3 Réponses :
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
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.
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é.
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.
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.
Veuillez donner un exemple de la journalisation réelle de l'application et du résultat attendu.