La bibliothèque Monolog permet de journaliser différentes informations lors de l'exécution de scripts PHP.
Son intégration via un framework de développement tel que Symfony, CakePHP se fait de manière quasi automatique mais s'il s'agit de l'utiliser dans un script fait à la main, c'est un petit peu plus compliqué.
Voici ma méthode (qui peut certainement être améliorée):
Cette bibliothèque pouvant être utilisée dans plusieurs projets, j'ai donc décidé de l'installer dans un dossier commun à tous mes projets web (/var/www/).
Je vais donc l'installer dans le dossier /var/www/commun
$ cd /var/www
$ mkdir commun
$ chown -R www-data:www-data commun
$ cd commun
Cette bibliothèque utilisant les namespaces, il est nécessaire d'installer la bibliothèque ClassLoader qui va nous permettre d'utiliser tout simplement les namespaces dans nos différents scripts.
Toutes les installations seront faites à l'aide de la commande git
$ apt-get install git
$ git clone https://github.com/symfony/ClassLoader.git
$ git clone https://github.com/Seldaek/monolog.git
$ git clone https://github.com/php-fig/log.git
Trois projets sont donc installés dans le dossier commun
Pour protéger l'accès à ce dossier (/var/www/commun):
$ echo "Deny From All" > .htaccess
Pour l'utilisation des namespaces, il est nécessaire de créer un fichier de paramétrage des namespaces (toujours dans le dossier /var/www/commun):
$ cat monolog.php
<?php
require_once __DIR__.'/ClassLoader/ClassLoader.php';
use Symfony\Component\ClassLoader\ClassLoader;
$loader = new ClassLoader();
$loader->register();
$loader->addPrefix('Monolog', __DIR__.'/monolog/src');
$loader->addPrefix('Psr', __DIR__.'/log');
Ce fichier intègre donc la classe ClassLoader.php et configure les namespaces Monolog & Psr nécessaire à l'utilisation de la bibliothèque monolog.
L'installation et le paramétrage est terminé, passons à la manière d'utiliser cette bibliothèque.
Je vais créer un projet test ainsi que deux fichiers index.php et init_log.php.
Le fichier index.php contiendra mon projet et le fichier init_log.php la configuration du fichier de log de mon projet.
$ cd /var/www
$ mkdir test
$ chown -R www-data:www-data test
$ cd test
Pour la documentation de monolog, tout est expliqué sur la page github du projet https://github.com/Seldaek/monolog
Détail de ma configuration:
$ nl init_log.php
1 <?php
2 require_once '/var/www/commun/monolog.php';
3 use Monolog\Logger;
4 use Monolog\Handler\RotatingFileHandler;
5 use Monolog\Handler\StreamHandler;
6 use Monolog\Formatter\LineFormatter;
7 $dateFormat = "Y-m-d H:i:s";
8 $output = "[%datetime%] %channel% %level_name%: %message% %context% %extra%\n";
9 $formatter = new LineFormatter($output, $dateFormat);
10 $stream = new StreamHandler(__DIR__.'/test.log', Logger::DEBUG); // Pour obtenir un fichier de log global
11 // $stream = new RotatingFileHandler(__DIR__.'/test.log', Logger::DEBUG); // Pour obtenir un fichier de log par jour (fichier horodaté)
12 $stream->setFormatter($formatter);
13 $logger = new Logger('test');
14 $logger->pushHandler($stream);
Ligne 2, j'inclus le fichier monolog.php qui contient toute la configuration de monolog.
Ligne 3 à 6, déclaration des différents use comme indiqué surla page du projet.
Ligne 7 à 9, je redéfini le format des données dans les logs.
Ligne 10 ou 11, permet d'indiquer l'emplacement du fichier de log ainsi que la manière dont il sera nommé et le niveau de log (DEBUG, INFO, WARNING etc etc...). Comme indiqué dans les commentaires, soit un fichier de log global (test.log), soit un fichier de log journalier et horodaté (test-2015-08-14.log).
Ligne 12, affectation du format défini au fichier de log.
Ligne 13 à 14, création d'un nouveau logger nommé test (avec le nom du projet par exemple).
Il est possible d'avoir un seul fichier de log commun pour plusieurs projets. Du coup, il sera facile de parser le fichier de log en se basant sur le nom du projet indiqué lors de la création du logger (ligne 13)
Utilisation dans mon fichier index.php:
$ cat index.php
<?php
require_once __DIR__.'/init_log.php';
...
$logger->addInfo('Connexion', array(
'User' => $user,
'Nom' => $nom,
'Prénom' => $prenom,
));
J'inclus mon fichier init_log.php et j'écris tout ce que je veux dans mon fichier de log à l'aide de la commande $logger->addInfo().
Le premier paramètre est une chaine de texte et le second un tableau.
Difficile de faire plus simple.