Nous avons plusieurs applications qui génèrent leurs propres fichiers journaux en texte brut, que je voudrais transmettre à un serveur syslog distant pour une journalisation centralisée. Je n'ai pas accès à root
ces machines et je ne peux pas non plus reconfigurer syslog
pour rediriger la sortie vers une machine distante.
J'ai trouvé des solutions en ligne, mais ce sont principalement des scripts bash faits maison, et je recherche quelque chose de plus robuste qui soit adapté à la mise en œuvre dans un environnement de production potentiellement à volume élevé.
De préférence quelque chose conçu avec un oeil pour une petite empreinte, un démon d'arrière-plan qui continue de fonctionner, qui peut suivre un grand nombre de lignes, etc. - Quelles solutions sont actuellement disponibles?
Réponses:
Vous avez déjà rejeté les "scripts bash d'autres personnes", mais c'est une solution assez courante - une utilisation créative de la
logger
commande peut suivre un fichier et envoyer son contenu ailleurs.Personnellement, je ne ferais pas cela dans un environnement de production.
Une meilleure option qui nécessite moins de piratage de scripts est utilisée
rsyslogd
et le module d'entrée de fichier texte comme yoonix mentionné - Ceci est une solution assez décente bien qu'il existe un potentiel de perte de lignes lors d'une rotation de fichier, et si vous êtes sur un système Linux avecrsyslog
comme votre démon syslog, il n'y a pas beaucoup de travail supplémentaire requis.syslog-ng
prend également en charge une source d'entrée de fichier avec des fonctionnalités similaires àrsyslog
.À mon humble avis, la meilleure solution - même si elle nécessite de modifier l'application générant ces journaux - est de se connecter directement à syslog. Vous ne voulez pas passer par des étapes intermédiaires, des fichiers, etc. -
syslog
est le SYStem LOGger, et les choses qui écrivent des journaux sur une plate-forme Unix devraient les envoyer à syslog.L'implémentation de ceci est, malheureusement, laissée comme un exercice pour le lecteur (et le développeur d'application) et peut ne pas être possible si vos développeurs sont inexistants, paresseux ou incompétents ....
la source
rsyslog
configuration en cours d'exécution sur le système. Vous ne devez PAS exécuter deux démons Syslog. Pour ne pas être impoli, mais vous devez arrêter d'essayer de le faire mal *: Chaque solution appropriée à ce scénario nécessite des actions administratives (root) sur le serveur ou une modification de l'application. Vous allez devoir faire face à cette réalité et faire face à tout groupe au sein de votre organisation qui a ses racines dans les systèmes en question, sinon cette question est hors sujet (vous essayez de contourner les politiques de votre organisation) ....Vous pouvez utiliser logstash avec l' entrée de fichier et la sortie syslog .
Par exemple, créez une configuration avec le ou les fichiers que vous souhaitez surveiller et les informations de votre serveur syslog.
file-to-syslog.conf:
Le journal de démarrage avec
la source
J'ai piraté ensemble
tail.c
etlogger.c
en un seul programme compilé à petite empreinte (binaire) qui est léger, rapide et stable. Tant qu'il dispose d'un accès en lecture aux fichiers journaux, il fonctionne sans avoir besoin du privilège root.J'ai également apporté quelques améliorations à l'enregistreur natif et ajouté une nouvelle capacité (facultative) d'insertion d'une chaîne de texte au début de chaque ligne de journal avant qu'elle ne soit envoyée au serveur de journal. Le résultat est un programme qui peut être exécuté par lui-même, sans avoir besoin d'utiliser des tubes shell (c'est-à-dire pas besoin
tail logfile | logger
). Il s'exécutera pour toujours jusqu'à ce qu'il soit explicitement tué ou qu'il rencontre une erreur d'écriture sur la prise réseau. Il continue même de s'exécuter si le fichier journal est tourné ou même disparaît (il continuera simplement à regarder si le fichier réapparaît.)Il est facile à utiliser: donnez-lui simplement un ou plusieurs fichiers journaux à surveiller, et chaque fois qu'une nouvelle ligne est écrite dans le fichier, il enverra une copie de cette ligne au serveur syslog local ou distant que vous spécifiez. Plus la chaîne de texte supplémentaire si vous utilisez cette option.
En fait, j'ai terminé le programme en décembre, mais j'attendais que Yahoo prenne le droit d'auteur et le rende disponible, ce qu'ils ont maintenant fait. (Je l'ai écrit dans le cadre de mon travail chez Yahoo).
informations sur le programme filelogger et lien de téléchargement:
la source
Il existe plusieurs façons de résoudre ce problème. Mais très, très première chose que vous devez faire est: transmettre les journaux à l' aide syslog lui - même .
Syslog (et de nombreux remplacements pour syslog) ont des fonctionnalités intégrées pour transférer la journalisation vers un autre serveur syslog à une adresse différente. Vous pouvez facilement le faire en modifiant le fichier de configuration et en ajoutant l'adresse à laquelle transférer l'installation. Par exemple, ajouter cette ligne à:
... transmettrait toutes les installations à la machine au 192.168.1.1, qui (espérons-le) fait fonctionner le service. L'exemple que je donne ici est pour rsyslog, qui est le serveur stock syslog sur Debian, bien qu'il devrait fonctionner pour beaucoup d'autres. Consultez la documentation de votre implémentation de syslog avec
man syslog
et voyez ce qu'il dit à propos du "transfert".Le serveur syslog distant peut être tout ce que vous aimez. Il existe même des produits, comme Splunk , qui regroupent ces journaux dans une seule vue avec un tableau de bord Web, une recherche, des notifications événementielles, etc. etc. Vous pouvez en voir plus ici: http://www.splunk.com/ If qui ne répond pas à vos besoins, vous pouvez utiliser autre chose. Il y a même des serveurs syslog qui seront transférés dans une base de données SQL!
Bien sûr, vous pourriez écrire votre propre script / programme / service pour le faire pour vous, mais pourquoi réinventer la roue quand elle est à la fois faite pour vous et déjà donnée?
Edit: Alors je suis retourné et relu la question, et j'ai remarqué plusieurs commentaires. Cela ressemble:
Abordons donc chacun d'eux dans l'ordre:
root
pour configurer la journalisation. Nous avons seulement besoin d'accéder à l'API syslog.root
n'est pas obligatoire pour écrire dans le syslog; si tel était le cas, tous les services qui abandonnent les privilèges ne pourraient pas écrire de diagnostics dans les fichiers journaux.Re: vidages de texte, c'est normal. cependant, vous devriez pouvoir utiliser un sous-shell pour diriger la sortie de STDERR et STDOUT vers un programme qui appelle l'API syslog. Ce n'est pas sorcier, c'est loin d'être fragile, et c'est bien documenté. En fait, c'est l'une des raisons pour lesquelles la redirection de sortie existe même. Une commande simple qui pourrait être lancée dans un script shell unique serait:
(my-application 2> & 1 | my-syslog-shunt) &
si vous avez la possibilité de modifier le code source de votre application, vous devez y écrire un shunt pour vider la sortie texte dans syslog au lieu d'un fichier texte brut. Cela ne devrait pas être trop difficile; tout ce que vous faites est de prendre les lignes que vous voulez sortir et de les envelopper avec un appel. Toutefois....
vous n'avez peut-être pas du tout accès au code source, vous ne pouvez donc pas le faire. Ce qui signifie que quelque chose comme # 3 ci-dessus fonctionnerait bien.
la source
Runtime.exec("logger ..."
) OK, merci.Je réponds à ma propre question.
swatch a peut-être fonctionné, mais je n'ai pas réussi à faire fonctionner le module Sys :: Syslog de perl sur l'hôte, et / usr / bin / logger installé sur l'hôte ne prend pas en charge la journalisation sur le serveur distant (util-linux-ng- 2.17.2).
Donc, la première chose que j'ai faite a été de télécharger le code source d'util-linux-2.20.1 pour lequel le programme d'enregistrement prend en charge la journalisation à distance. Lors des tests, il est devenu évident qu'une limite était imposée au nombre de caractères autorisés sur la ligne de journal. En fouillant dans le code source, j'ai trouvé une limite de 400 caractères codée en dur. (Si vous ne me croyez pas, exécutez "strings / usr / bin / logger | grep 400" sur n'importe quel système Linux).
Cette limite n'est pas acceptable pour la journalisation de type apache (y compris nodejs), j'ai donc modifié le code et augmenté la limite à 4096. Pendant que j'y étais, j'ai également ajouté une nouvelle option de ligne de commande qui permet d'insérer une option chaîne de texte au début de chaque ligne de journal. Je l'ai fait parce que les journaux nodejs n'incluent pas le nom d'hôte comme on pourrait le voir dans apache.
À ce stade, j'ai pu exécuter un script shell avec "tail -F -n 0 [logfile] | ./modified_logger ...." et cela a fonctionné. Mais j'avais quelques inquiétudes à propos de l'exécution de cela depuis supervise (daemontools) ou même en arrière-plan, car si l'un ou l'autre côté du tuyau se termine, il y a un risque que tout le tuyau se termine. J'avais également des inquiétudes (bien que non testées) sur les performances.
J'ai donc décidé de combiner la fonctionnalité de queue avec la fonctionnalité d'enregistreur dans un seul fichier binaire exécutable qui contournerait la nécessité d'utiliser des canaux Unix ou des programmes externes. J'ai fait cela en piratant tail.c de gnu coreutils et en incorporant ce dont j'ai besoin dans le programme d'enregistrement modifié.
Le résultat est un nouveau binaire (taille 117k) que j'appelle "filelogger" et qui surveille en permanence un ou plusieurs fichiers et enregistre chaque nouvelle ligne dans un syslog local ou distant, via UDP ou TCP. Il fonctionne comme un charme. J'ai pu faire une petite analyse comparative et il enregistre environ 17000 lignes (1,8 Mo) en environ 3 secondes sur des sous-réseaux avec un vlan et quelques commutateurs physiques entre eux, sur un serveur distant exécutant syslog-ng.
pour exécuter le programme, vous faites quelque chose comme ceci (soit au premier plan, en arrière-plan ou supervisé avec daemontools):
./filelogger -t 'access' -d -p local1.info -n [hôte de connexion distant] -u / tmp / ignoré -a $ (nom d'hôte) / tmp / monfichier1 / tmp / monfichier2 ...
/ tmp / monfichier1 et / tmp / monfichier2 sont les fichiers surveillés.
Le "-a" est la nouvelle option que j'ai ajoutée. Dans ce cas, j'insère le nom d'hôte local au début de chaque ligne de journal.
Ces solutions étaient exactement le type de solution que je cherchais lorsque j'ai posé la question et, comme il s'est avéré, elles n'existaient pas avant que je ne les fasse moi-même. :)
la source