Bonjour,
Afin de ne pas tout mélanger, j’utilise plusieurs logs :
wifilightV2
wifilightV2_cmd
wifilightV2_Tuya
wifilightV2_inc
Sur mes tests les 4 logs sont bien affichés mais chez les utilisateurs du plugin, seul le premier logs est affiché.
Il y a quelque chose à faire côté code ou côté utilisateur ?
Merci pour votre aide
Le core n’écrit probablement pas le log du tout car pas de config de log level (seul le log portant le nom du plug-in est géré par la class helper log) donc c’est la config log par défaut qui est en warning ou error probablement.
Chez toi il doit être en debug (config par défaut dans la config jeedom) ou alors tu as fait l’insert en db de la config.
Bref, avoir plusieurs log (écrit par le code Php) n’est pas une option viable.
Cela fonctionne pour les démons python on nodejs car c’est eux qui écrivent et pas le core.
Merci pour ta réponse rapide
je n’ai pas fait d’insert en db
donc c’est parce que je suis en debug, par défaut sur Jeedom dans sa globalité, c’ets bien ça ?
J’ai eux le même problème avec jeemate, le seul moyen que j’ai trouvé pour géré le multi logs, a été de réécrire une partie de la class log dans le plugin.
Mes modifications sont dans les main de l’équipe jeedom, a voir si c’est intégrées ou pas.
Le plus simple je pense, plutôt que de réécrire la class log, crées ton propre logger (utilises monolog, c’est aussi la class que le core utilise, ainsi tu n’as même pas besoin de faire le moindre require etc car le core le fait déjà);
Donc créé une instance de monolog en définissant le path du log, le logformat et le loglevel à l’aide des fonctions de la class log du core;
si on reprend la doc de monolog ici: https://github.com/Seldaek/monolog
cela va donner qlqch comme ceci adapté pour ton plugin, pour ton log wifilightV2_cmd, en supposant que ce code se trouve dans la class wifilightV2:
// create a log channel
$log = new Logger(__CLASS__ .'_cmd); // name will be pluginid_cmd e.a.
//create line formatter (same than jeedom core)
$formatter = new LineFormatter(str_replace('\n', "\n", self::getConfig('log::formatter')));
//create handler
$handler = new StreamHandler(log::getPathToLog(__CLASS__ . '_cmd'), log::getLogLevel(__CLASS__); // important ! for the loglevel take the one from the plugin and not one by "sub-log" so user can define log level of all logs via the existing interface
$handler->setFormatter($formatter);
$log->pushHandler($handler);
// add records to the log
$log->warning('Foo');
$log->error('Bar');
5 lignes de code sans impacter le core et tu as une solution simple
je n’ai pas testé ceci, juste écrit le code sur community, il reste à placer cela dans une fonction de la class et adapter un peu selon le besoin mais je pense que l’idée est assez clair; si pas, demandes
un grand merci et avec les correctifs, cela donne :
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
class wifilightV2 extends eqLogic {
public static function daemonTuya() {
// create a log channel
$log = new Logger(__CLASS__ . '_Tuya'); // name will be pluginid_cmd e.a.
//create line formatter (same than jeedom core)
$formatter = new LineFormatter(str_replace('\n', "\n", log::getConfig('log::formatter')));
//create handler
$handler = new StreamHandler(log::getPathToLog(__CLASS__ . '_Tuya'), log::getLogLevel(__CLASS__)); // important ! for the loglevel take the
$handler->setFormatter($formatter);
$log->pushHandler($handler);
$log->warning( '>>>>Daemon Started');
Je ne pense pas que tu as besoin des sysloghandler.
Par contre un désavantage de ce code c’est que tu n’es plus compatible avec les users qui on configuré syslog comme log handler.
Il est possible de le rendre compatible en s’inspirant de la class log du core; d’un autre côté la plupart des utilisateurs utilisent les fichiers par défaut donc le préciser dans la doc peut suffire
Je ne connais pas syslog, est-ce que ça permet d’envoyer les logs dans un système comme kibana par exemple? et syslogUdp aussi je suppose?
C’est dommage que la classe log du core n’implémente pas les fonctions de base debug() info() warn() et error() , pour mon plugin j’ai créé une classe qui les ajoute, c’est une facilité.