Log dans le sens décroissant

Avatar du membre
Eléphant du PHP | 88 Messages

04 sept. 2016, 18:27

Bonjour, j'ai besoin d'au petit coup de main svp.

Je me suis codé un petit script pour envoyer des logs d'information.
Dans l'état actuelle, les logs sont dans le sens : des plus ancien en haut, et les plus récent en bas.
Je souhaiterai inverser ce sens (que les logs les plus récents soient en haut).

Voici mon code actuelle :

Code : Tout sélectionner

<?php /** * Envoyer un log d'information de l'app (pour les fichiers qui sont dans le dossier "app") * * @param string $message * @param string $file - Pour éventuellement y logger dans un fichier spécifique */ public function infoApp($message, $file='infos-app') { $pathFileLog = ($file !== null) ? ROOT.'/logs/'.$file.'.log' : ROOT.'/logs/infos-app.log'; if (file_exists($pathFileLog)) { $fp = fopen($pathFileLog, 'a+'); fseek($fp, SEEK_END); $messageFinal = '# '.$this->dateTime->format('d/m/Y H:i:s').' - URL : '.getActiveUrl().' - IP : '.Request::getIp().' - Message :'."\r\n".$message."\r\n"."\r\n"; fwrite($fp, $messageFinal); fclose($fp); } else { $this->renderException('File "'.$pathFileLog.'" not found'); } }
Ensuite, dans mes Controllers, pour envoyer un log j'ai juste à faire ceci (je fait un appel static car j’utilise une Façade) :

Code : Tout sélectionner

<?php Log::infoApp('Message : Info...');
Comme faire ceci Svp ?

Merci beaucoup.

Mammouth du PHP | 2703 Messages

04 sept. 2016, 21:00

ouvrir un nouveau fichier, y écrire la nouvelle ligne, récupérer le contenu du log et l'écrire dans le nouveau fichier, fermer les fichiers, supprimer le log, renommer le nouveau fichier.

mais si l'écriture doit être rapide car appelée fréquemment, il vaux mieux laisser l'ordre actuel, et inverser à la lecture du log plutôt qu'à l'écriture.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 sept. 2016, 09:31

salut,

tu peux simplement utiliser fseek pour mettre le curseur en début de fichier.
Par contre si le problème c'est la l'affichage tu peux très bien lire le fichier a l'envers, par exemple avec la fonction file et par courir le tableau du plus grand index au plus petit ou simplement utiliser la fonction array_reverse et un foreach ;)

un fichier de log est toujours du plus ancien au plus récent autant faire "comme tout le monde" histoire de simplifier la vie des gens qui pourront utiliser ton appli ;)


@+
Il en faut peu pour être heureux ......

Avatar du membre
Eléphant du PHP | 88 Messages

05 sept. 2016, 09:57

Ok, merci à tous.

j'ai déjà lu la doc de fseek hier, et je n'et pas trouvé la solution. si tu peut m'aider, ça serai super.

Perso, je préfère du plus récent au plus ancien, (si le fichier fait plusieurs millier lignes, c'est plus simple), et Laravel utilise ce sens d'affichage.

Merci.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

05 sept. 2016, 13:31

fseek($fp,0); ?

l'affichage et le stockage c'est pas la même chose ;)
si ton fichier fait plusieurs milliers de ligne cela peux être gourmand.

tu peux simplifier ton code en file_put_content('lefichier','les données',FILE_APPEND) voir avec flag LOCK_EX

sinon tu peux te baser sur des solutions de log existantes (voir éprouvée) comme log4php[/php] qui va te permettre.

un article sur le sujet qui parle justement de laravel : [url]https://www.sitepoint.com/effective-php-logging-loggly/
(qui parle en plus de truc compatible psr3 ;) )

@+
Il en faut peu pour être heureux ......