[{"data":1,"prerenderedAt":200},["ShallowReactive",2],{"$f2bPm0iWuxZdo7dTOcEbusfApqYnqE0Q7gdMPv0JJkTw":3},[4],{"id":5,"date":6,"date_gmt":7,"guid":8,"modified":10,"modified_gmt":11,"slug":12,"status":13,"type":14,"link":15,"title":16,"content":18,"excerpt":21,"author":23,"featured_media":24,"comment_status":25,"ping_status":25,"sticky":20,"template":26,"format":27,"meta":28,"categories":29,"tags":31,"class_list":32,"_links":40,"_embedded":84},36,"2022-09-26T17:00:00","2022-09-26T15:00:00",{"rendered":9},"http:\u002F\u002Fcms.lcdev.fr\u002F?p=36","2026-07-06T15:47:27","2026-07-06T13:47:27","laravel-ajouter-des-informations-supplementaires-aux-logs","publish","post","https:\u002F\u002Fcms.lcdev.fr\u002Flaravel-ajouter-des-informations-supplementaires-aux-logs\u002F",{"rendered":17},"Ajouter des informations supplémentaires aux logs Laravel",{"rendered":19,"protected":20},"\n\u003Cp class=\"wp-block-paragraph\">La gestion des logs sur Laravel, c&rsquo;est génial ! Sans configuration ou avec seulement quelques lignes, on peut facilement choisir où enregistrer les logs, ses journaux d&rsquo;informations absolument indispensables au bon maintient d&rsquo;une application.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Malheureusement, on peut rapidement manquer d&rsquo;information, notamment en production, pour bien comprendre comment le bug s&rsquo;est produit et pouvoir ainsi le résoudre.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Fort heureusement, Laravel propose de personnaliser tout ça et l&rsquo;on peut facilement ajouter des informations complémentaires à chaque log.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ce tutoriel est issu d&rsquo;un cas pratique où j&rsquo;avais besoin d&rsquo;ajouter ces 4 informations aux logs :\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Utilisateur connecté ou visiteur dans le cas contraire\u003C\u002Fli>\n\n\n\n\u003Cli>IP de l&rsquo;utilisateur\u003C\u002Fli>\n\n\n\n\u003Cli>Méthode de la requête (GET, POST, PUT&#8230;)\u003C\u002Fli>\n\n\n\n\u003Cli>URI (= URL + paramètre GET de la requête)\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">Personnaliser l&rsquo;écriture des logs\u003C\u002Fh2>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">Ajouter des informations\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Pour commencer, il vous faut créer une classe qui sera instanciée à chaque log et qui s&rsquo;occupera de personnaliser les données. Personnellement, j&rsquo;ai créé une classe \u003Cstrong>CustomizeFormatter\u003C\u002Fstrong>, dans \u003Cem>app\u002FLogging\u002FCustomizeFormatter.php\u003C\u002Fem>. Vous êtes libre de renommer cette classe et de la placer dans un autre dossier, ceci à peu d&rsquo;importance.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Dans mon cas, j&rsquo;avais besoin d&rsquo;injecter (via l&rsquo;injection des dépendances) la Request. Vous pouvez personnaliser le constructeur selon vos besoins, voir le supprimer.\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>&lt;?php\u003Cbr>​\u003Cbr>namespace App\\Logging;\u003Cbr>​\u003Cbr>use Illuminate\\Http\\Request;\u003Cbr>use Monolog\\Formatter\\LineFormatter;\u003Cbr>​\u003Cbr>class CustomizeFormatter\u003Cbr>{\u003Cbr> &nbsp; &nbsp;protected $request;\u003Cbr>​\u003Cbr> &nbsp; &nbsp;public function __construct(Request $request = null) {\u003Cbr> &nbsp; &nbsp; &nbsp; &nbsp;$this-&gt;request = $request;\u003Cbr> &nbsp;  }\u003Cbr>}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Il faut ensuite une fonction qui prend en paramètre un tableau $record. Cette variable contient toutes les informations du log qui va être inséré dans les fichiers journaux. La variable doit ce même tableau, avec les données additionnelles. J&rsquo;ai appelé cette fonction \u003Cem>processLogRecord\u003C\u002Fem>.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Voici ce que contient la variable $record, si on essaie de créer un log avec \u003Ccode>Log::info('test')\u003C\u002Fcode> :\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>array:7 &#91; ▼\u003Cbr> &nbsp;\"message\" =&gt; \"test\"\u003Cbr> &nbsp;\"context\" =&gt; &#91;]\u003Cbr> &nbsp;\"level\" =&gt; 200\u003Cbr> &nbsp;\"level_name\" =&gt; \"INFO\"\u003Cbr> &nbsp;\"channel\" =&gt; \"local\"\u003Cbr> &nbsp;\"datetime\" =&gt; Monolog\\DateTimeImmutable @1637680814 {#554 ▼\u003Cbr> &nbsp; &nbsp;-useMicroseconds: true\u003Cbr> &nbsp; &nbsp;date: 2021-11-23 16:20:14.637234 Europe\u002FMonaco (+01:00)\u003Cbr>  }\u003Cbr> &nbsp;\"extra\" =&gt; &#91;]\u003Cbr>]\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Nous allons ajouter nos informations complémentaires dans le tableau \u003Cem>extra\u003C\u002Fem>.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">\u003Cem>Pensez à bien merge vos données avec celles qui pourraient déjà être présente dans la variable $record[&lsquo;extra&rsquo;], sous peine de perdre des données.\u003C\u002Fem>\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>public function processLogRecord(array $record): array {\u003Cbr> &nbsp; &nbsp;\u002F\u002F Only if Request could be injected\u003Cbr> &nbsp; &nbsp;if ($this-&gt;request) {\u003Cbr> &nbsp; &nbsp; &nbsp; &nbsp;$record&#91;'extra'] += &#91;\u003Cbr> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'user' =&gt; $this-&gt;request-&gt;user()-&gt;email ?? 'guest',\u003Cbr> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'ip' =&gt; $this-&gt;request-&gt;getClientIp(),\u003Cbr> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'method' =&gt; $this-&gt;request-&gt;getMethod(),\u003Cbr> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'uri' =&gt; $this-&gt;request-&gt;getUri()\u003Cbr> &nbsp; &nbsp; &nbsp;  ];\u003Cbr> &nbsp;  }\u003Cbr>​\u003Cbr> &nbsp; &nbsp;return $record;\u003Cbr>}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">Choisir les informations à afficher pour chaque log\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Une fois les données que vous souhaitez ajouter dans la variable \u003Cem>$record[&lsquo;extra&rsquo;]\u003C\u002Fem>, il vous faut créer une fonction \u003Cem>__invoke()\u003C\u002Fem> qui sera appelé à chaque instanciation de la classe et qui a pour but de :\u003C\u002Fp>\n\n\n\n\u003Col class=\"wp-block-list\">\n\u003Cli>appeler la fonction pour ajouter des données complémentaires\u003C\u002Fli>\n\n\n\n\u003Cli>personnaliser le format d&rsquo;affichage du log\u003C\u002Fli>\n\u003C\u002Fol>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Pour afficher une information précédemment ajoutée, l&rsquo;IP par exemple, il vous suffit d&rsquo;utiliser le shortcode suivant : \u003Cem>%extra.ip%\u003C\u002Fem>.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Vous pouvez utiliser et personnaliser le code ci-dessous, qui est une bonne base.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">A noter qu&rsquo;il faut utiliser \\n pour effectuer un retour à la ligne.\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>public function __invoke($logger) {\u003Cbr> &nbsp; &nbsp;foreach ($logger-&gt;getHandlers() as $handler) {\u003Cbr> &nbsp; &nbsp; &nbsp; &nbsp;$handler-&gt;pushProcessor(&#91;$this, 'processLogRecord']);\u003Cbr> &nbsp; &nbsp; &nbsp; &nbsp;$handler-&gt;setFormatter(new LineFormatter(\u003Cbr> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;\"&#91;%datetime%] %channel%.%level_name%: %message%\\nUser : %extra.user%\\nIP : %extra.ip%\\nURL: %extra.method% %extra.uri%\\n%context% %extra%\\n\\n\", 'Y-m-d H:i:s'));\u003Cbr> &nbsp;  }\u003Cbr>}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">Appliquer la personnalisation\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Maintenant que notre classe est prête à personnaliser les données des logs, il ne reste plus qu&rsquo;à configurer son utilisation.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Dans le fichier \u003Cem>config\u002Flogging.php\u003C\u002Fem>, rajouté une clé \u003Cem>tap\u003C\u002Fem> avec pour valeur un tableau qui contient la classe que vous venez de créer, le tout dans la configuration de log que vous souhaitez personnaliser.\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>'daily' =&gt; &#91;\u003Cbr> &nbsp; &nbsp;'driver' =&gt; 'daily',\u003Cbr> &nbsp; &nbsp;'tap' =&gt; &#91;\\App\\Logging\\CustomizeFormatter::class], \u002F\u002F Add this line\u003Cbr> &nbsp; &nbsp;'path' =&gt; storage_path('logs\u002Flaravel.log'),\u003Cbr> &nbsp; &nbsp;'level' =&gt; 'debug',\u003Cbr> &nbsp; &nbsp;'days' =&gt; 14,\u003Cbr>],\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Vos logs devraient désormais être agrémentés de données supplémentaires ! Bon débogage !\u003C\u002Fp>\n",false,{"rendered":22,"protected":20},"\u003Cp>Ajouter des informations aux logs Laravel utiles lors du débogage, notamment en production\u003C\u002Fp>\n",1,11,"open","","standard",{"footnotes":26},[30],4,[],[33,14,34,35,36,37,38,39],"post-36","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-laravel",{"self":41,"collection":47,"about":50,"author":53,"replies":57,"version-history":60,"predecessor-version":63,"wp:featuredmedia":67,"wp:attachment":70,"wp:term":73,"curies":80},[42],{"href":43,"targetHints":44},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fposts\u002F36",{"allow":45},[46],"GET",[48],{"href":49},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fposts",[51],{"href":52},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Ftypes\u002Fpost",[54],{"embeddable":55,"href":56},true,"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fusers\u002F1",[58],{"embeddable":55,"href":59},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fcomments?post=36",[61],{"count":23,"href":62},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fposts\u002F36\u002Frevisions",[64],{"id":65,"href":66},37,"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fposts\u002F36\u002Frevisions\u002F37",[68],{"embeddable":55,"href":69},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fmedia\u002F11",[71],{"href":72},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fmedia?parent=36",[74,77],{"taxonomy":75,"embeddable":55,"href":76},"category","https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fcategories?post=36",{"taxonomy":78,"embeddable":55,"href":79},"post_tag","https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Ftags?post=36",[81],{"name":82,"href":83,"templated":55},"wp","https:\u002F\u002Fapi.w.org\u002F{rel}",{"author":85,"wp:featuredmedia":102,"wp:term":176},[86],{"id":23,"name":87,"url":88,"description":26,"link":89,"slug":87,"avatar_urls":90,"_links":94},"lcdev","http:\u002F\u002Fcms.lcdev.fr","https:\u002F\u002Fcms.lcdev.fr\u002Fauthor\u002Flcdev\u002F",{"24":91,"48":92,"96":93},"https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F8578aee4d4c25728b0f2cb389c2c80a414b27a57d2a499ce695a879ec3e1fd97?s=24&d=mm&r=g","https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F8578aee4d4c25728b0f2cb389c2c80a414b27a57d2a499ce695a879ec3e1fd97?s=48&d=mm&r=g","https:\u002F\u002Fsecure.gravatar.com\u002Favatar\u002F8578aee4d4c25728b0f2cb389c2c80a414b27a57d2a499ce695a879ec3e1fd97?s=96&d=mm&r=g",{"self":95,"collection":99},[96],{"href":56,"targetHints":97},{"allow":98},[46],[100],{"href":101},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fusers",[103],{"id":24,"date":104,"slug":105,"type":106,"link":107,"title":108,"author":23,"featured_media":109,"caption":110,"alt_text":26,"media_type":111,"mime_type":112,"media_details":113,"source_url":150,"_links":154},"2026-07-06T15:26:36","ajouter-information-log","attachment","https:\u002F\u002Fcms.lcdev.fr\u002Fformulaire-elementor-wordpress-0-spam-avec-cette-methode\u002Fajouter-information-log\u002F",{"rendered":105},0,{"rendered":26},"image","image\u002Fpng",{"width":114,"height":115,"file":116,"filesize":117,"sizes":118,"image_meta":151},1920,1080,"2026\u002F07\u002Fajouter-information-log.png",93155,{"medium":119,"large":125,"thumbnail":131,"medium_large":136,"1536x1536":142,"full":148},{"file":120,"width":121,"height":122,"filesize":123,"mime_type":112,"source_url":124},"ajouter-information-log-300x169.png",300,169,14260,"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-content\u002Fuploads\u002F2026\u002F07\u002Fajouter-information-log-300x169.png",{"file":126,"width":127,"height":128,"filesize":129,"mime_type":112,"source_url":130},"ajouter-information-log-1024x576.png",1024,576,59225,"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-content\u002Fuploads\u002F2026\u002F07\u002Fajouter-information-log-1024x576.png",{"file":132,"width":133,"height":133,"filesize":134,"mime_type":112,"source_url":135},"ajouter-information-log-150x150.png",150,11917,"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-content\u002Fuploads\u002F2026\u002F07\u002Fajouter-information-log-150x150.png",{"file":137,"width":138,"height":139,"filesize":140,"mime_type":112,"source_url":141},"ajouter-information-log-768x432.png",768,432,43488,"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-content\u002Fuploads\u002F2026\u002F07\u002Fajouter-information-log-768x432.png",{"file":143,"width":144,"height":145,"filesize":146,"mime_type":112,"source_url":147},"ajouter-information-log-1536x864.png",1536,864,94434,"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-content\u002Fuploads\u002F2026\u002F07\u002Fajouter-information-log-1536x864.png",{"file":149,"width":114,"height":115,"mime_type":112,"source_url":150},"ajouter-information-log.png","https:\u002F\u002Fcms.lcdev.fr\u002Fwp-content\u002Fuploads\u002F2026\u002F07\u002Fajouter-information-log.png",{"aperture":152,"credit":26,"camera":26,"caption":26,"created_timestamp":152,"copyright":26,"focal_length":152,"iso":152,"shutter_speed":152,"title":26,"orientation":152,"keywords":153,"alt":26},"0",[],{"self":155,"collection":159,"about":162,"author":165,"replies":167,"wp:attached-to":170,"curies":174},[156],{"href":69,"targetHints":157},{"allow":158},[46],[160],{"href":161},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fmedia",[163],{"href":164},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Ftypes\u002Fattachment",[166],{"embeddable":55,"href":56},[168],{"embeddable":55,"href":169},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fcomments?post=11",[171],{"embeddable":55,"post_type":14,"id":172,"href":173},8,"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fposts\u002F8",[175],{"name":82,"href":83,"templated":55},[177,199],[178],{"id":30,"link":179,"name":180,"slug":181,"taxonomy":75,"_links":182},"https:\u002F\u002Fcms.lcdev.fr\u002Fcategory\u002Flaravel\u002F","Laravel","laravel",{"self":183,"collection":188,"about":191,"wp:post_type":194,"curies":197},[184],{"href":185,"targetHints":186},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fcategories\u002F4",{"allow":187},[46],[189],{"href":190},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fcategories",[192],{"href":193},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Ftaxonomies\u002Fcategory",[195],{"href":196},"https:\u002F\u002Fcms.lcdev.fr\u002Fwp-json\u002Fwp\u002Fv2\u002Fposts?categories=4",[198],{"name":82,"href":83,"templated":55},[],1784120105599]