2013-08-09 2 views
0

Venant d'un arrière-plan Java, j'ai l'habitude de journaliser des frameworks comme log4j, logback et slf4j. Cependant, quand je fais de la programmation PHP, je me trouve en utilisant echo et var_dump/print_r et j'écris des informations de journalisation sur (généralement) les pages web avec lesquelles je travaille. Je pense qu'il doit y avoir une meilleure façon de le faire en PHP aussi? Alors, quelle est la manière idiomatique de faire de la journalisation PHP?Quelle est la manière idiomatique de faire une journalisation générale en PHP?

J'ai rencontré log4php, et certains endroits suggèrent d'utiliser error_log également à des fins de journalisation générale. Ce qui complique encore plus, c'est que le code PHP que j'écris est généralement composé de modules dans un système plus grand, donc plusieurs modules peuvent être exécutés dans la même requête, et la journalisation devrait de préférence être isolée par module.

Toute contribution et suggestion sont appréciées.

+0

https://github.com/Seldaek/monolog est sympa. – lsouza

+0

On dirait qu'il nécessite PHP 5.3. C'est un showstopper. Il faut travailler avec 5.2 et plus. – NilsH

+0

Ouch ... Vous devriez vraiment mettre à jour PHP, au moins à 5.4, 5.5 si possible. –

Répondre

1

J'ai été un utilisateur de longue date de Log4PHP, et je peux le recommander fortement. :)

Mais la question de faire une journalisation correcte est plutôt difficile. J'utilise Log4PHP dans un environnement d'entreprise où plusieurs applications utilisent toutes la même journalisation, et elles supposent également que l'enregistreur est correctement configuré et prêt à l'emploi. Donc, c'est fondamentalement une situation très facile "Je suppose que la même exploitation est disponible partout".

Le développement de modules pour d'autres utilisateurs est une tâche complètement différente. Vous pouvez éventuellement utiliser votre propre enregistrement interne, mais où écrivez-vous ces messages de journal? Cela peut être considéré comme un comportement incorrect si votre module remplit de manière inattendue le disque dur. Votre module doit également se connecter à la cible sur laquelle le reste de l'application se connecte. Si votre module est assez petit, la journalisation pourrait ne pas être un gros problème, car vous pourriez communiquer toutes les situations d'erreur par d'autres moyens (comme lancer des exceptions ou retourner false et offrir une fonction d'erreur dédiée).

Il existe une définition d'une interface de consignation commune que tous les cadres de consignation pourraient éventuellement implémenter: PSR-3 Mais deux inconvénients rendent cette solution indisponible pour vous: 1. Log4PHP n'implémente pas actuellement cette interface et 2. utilise des espaces de noms et nécessite donc PHP 5.3 au moins. Cependant, la pensée générale derrière cela pourrait vous aider: Votre module devrait offrir un moyen d'accepter un enregistreur qui lui est transmis du monde extérieur. S'il n'y a pas d'enregistreur, il ne devrait pas se connecter. Et parce que vous pourriez vouloir tester votre journalisation, il devrait y avoir un wrapper qui présente une interface uniforme à vos modules et encapsule les différences de mise en œuvre désagréables de tous les enregistreurs. Commencez à offrir un wrapper PSR-3-Wrapper et un wrapper Log4PHP pour vos modules et réagissez à la demande du public pour les autres besoins de logs.

+0

Merci. C'est une excellente réponse! S'il y avait un mécanisme de journalisation «standard» utilisé dans le système, je le «connecterais» certainement. Mais comme ce n'est pas le cas, je dois considérer d'autres alternatives. La consignation en question est principalement la journalisation du débogage pour tracer les situations d'erreur et un moyen pour les utilisateurs des modules de rapporter ces traces (résultat des services Web appelés, etc.) pour localiser l'erreur. Peut-être vaut-il mieux «mourir» ou renvoyer faux, mais alors je perdrais beaucoup d'informations contextuelles. Mais là encore, il se peut que ce soit moi qui ne maîtrise pas PHP, et c'est possible autrement. – NilsH

+0

Si c'était juste moi en utilisant les modules, ce ne serait pas un problème. Mais l'objectif principal est de permettre la collecte de logs/traces auprès des utilisateurs du module lorsqu'ils rencontrent des problèmes. – NilsH

+0

Les utilisateurs inexpérimentés ne pourraient probablement pas trouver les fichiers journaux de toute façon. Mais dans un tel cas, vous aurez probablement besoin d'une simple solution "instantanément allumer" pour la journalisation afin d'obtenir des informations de base. – Sven

Questions connexes