Bonsoir à tous,
Le topic initial est ancien mais j'en ai eu un vrai besoin et j'ai essayé de faire quelque chose d'équivalent avec les défauts signalés en moins, en particulier la capacité de logger des messages rapprochés de façon la moins intrusive/plus transparente possible pour le code 'envoyeur'...
C'est ma première contribution à ce forum, dont j'ai abondamment profité, c'est mon premier retour.
J'espère bénéficier de votre indulgence, au moins sur la forme. (quand j'y pense :j'espère ne pas avoir réinventé ici l'eau tiède d'un autre post?)
Et, en attendant : Bonne Année à tous
Le post initial reste valide et une base solide.
Les différences sont:
# il n'y a pas (plus) besoins de scène complémentaire à la VD.
# La VD utilise TCP plutôt que UDP pour côser au syno (c'est donc à modifier dans le paramétrage des journaux de synology, cf 1er post de ce sujet, c'est la seule modification de ce côté).
Pourquoi?: UDP n'est pas fait pour ASSURER la réception d'un message et encore moins la date de réception et encore moins l'ordre de réception. C'est fait pour émettre un flux sans se poser de question sur la réception. TCP c'est le contraire :-)
# L'idée est de stocker rapidement les message à envoyer dans une pile (FIFO) pour pouvoir s'assurer d'avoir tous les messages à envoyer
# Les messages empilés sont dépilés par bloc toutes les 3s (c'est la seule solution que j'ai trouvée pour ne pas avoir de conflit read/write, mais je suis à l'écoute..)
Vu de l'extérieur:
Les messages à envoyer sont json.encodés dans le champ 'logTemp' de la VD puis 'empilés' en appuyant sur le bouton 'Empil' (voir plus bas code à ajouter), le reste se passe tout seul :
Ils sont dépilés régulièrement (tte les 3s):
# vers le NAS si leur niveau de sévérité est égal ou dépasse ce qui est indiqué dans le label 'MinLevel',
# poubellisés sinon.
Le Label MinLevel peut être changé en cliquant sur les bouton '+' ou '-'.
Cela permet de moduler la charge des journaux selon que l'on est en train de tester quelque chose ou non...
Le bouton 'reset' est au fond un bouton de debug. Mais il est recommandé d'appuyer dessus avant de tenter d'envoyer un 1er log.
La 'nouvelle' VD se présente ainsi:
pour envoyer quelque chose au journal, la base est d'ajouter dans la scène/VD où cela est nécessaire le code suivant :
local vd_id = 175 -- id de VI_SynoLog (à remplacer................)
msg={sev = "warning", Time=os.time(), orig= "Test Syslog Message", mess = "Text for a warning"} --évidemment à ajuster au besoin, selon toute logique orig devrait permettre d'identifier la scène ou la VD qui émet le message.
fibaro:call(vd_id, "setProperty", "logTemp", json.encode(msg)) --La VD utilise intensivement les 'champs' log et logTemp, ne pas les utiliser à autre chose SVP
fibaro:call(vd_id, "pressButton", 1)
(voir plus loin pour les pb de synchro)
Ce code 'empile' le message (daté de son heure propre, pas de l'heure d'émission vers le synology) il sera envoyé un peu plus tard, mais il s'agit d'un journal! (journal finalement lu plus tard histoire de comprendre les 'scoops' dont on a été informé par ailleurs :-) on n'est pas sur BFM!)
La pile contient 10 messages (10 message/3secondes) Il est très simple d'augmenter ou diminuer cette dose dans le code associé au bouton 1
Le label 'In' est le nombre de message empilés, le label 'Out' est le nombre de messages envoyés vers le synology (ou filtrés vers la poubelle par 'MinLevel').
Si les deux valeurs sont égales c'est que tout a été traité.
Si In est < Out cékia1bug!!!
"plus loin pour les pb de synchro" c'est ici:
Pour les puristes ou ceux qui pensent avoir à envoyer plein de log importants à leur NAS je recommande:
local vd_id = 175 -- id number of VI_SynoLog (à remplacer................)
Time= os.time()
while ((fibaro:getValue(vd_id, "logTemp") ~= "") and (os.difftime(os.time(),Time) < 2)) do
fibaro:sleep(100)
end
msg={sev = "warning", Time=os.time(), orig= "Test Syslog Message", mess = "Text for a warning"}
fibaro:call(vd_id, "setProperty", "logTemp", json.encode(msg)
fibaro:call(vd_id, "pressButton", 1)
Les très puristes pourraient ajouter un if ((fibaro:getValue(vd_id, "logTemp") ~= "") avant d'appuyer sur le bouton, dans la pratique les choses vont tellement vite mon brave monsieur...
Dans mon cas j'ai intégré ces lignes dans un code générique d’encapsulation de fibaro:debug, activé si une variable 'severity' est non nulle
Installation: charger le vfib (sur une HC2 :-)), Renseigner IP du NAS et Port (514), cliquer sur le bouton 'Reset', envoyer un message de test (le plus simple est de copier un des codes ci dessus dans une scène test)
PS1: en cours de fonctionnement le label 'Data' contient le dernier lot de messages envoyés, cela permet de se faire, par sondage, une idée de la nécessité d'augmenter la taille de la fifo.
PS2: J'ai forcé le champ 'host' à HC2 dans dans le bouton 'Send' (2). Rien n’empêche de modifier...
PS3: 'évidement' ce qui est json.encodé par l’émetteur doit être intelligible par ce qui est lu en appuyant sur le bouton 'Send'... Mais le fait de d'encoder json garanti que le reste est étanche aux modifications
J'ai decouvert 2 bug (lecture de l'IP et timeout pas efficace). c'est corrigé par cette version 0.2
VI_SynoLog0.2.vfib