{"id":230767,"date":"2022-12-04T09:51:00","date_gmt":"2022-12-04T06:51:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=230767"},"modified":"2022-12-04T17:15:17","modified_gmt":"2022-12-04T14:15:17","slug":"lendo-e-entendendo-os-logs-de-erros-do-wordpress-parte-2","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/pt-pt\/lendo-e-entendendo-os-logs-de-erros-do-wordpress-parte-2\/","title":{"rendered":"Lendo e entendendo os logs de erros do WordPress, parte 2"},"content":{"rendered":"\n<p><strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/lendo-e-entendendo-os-logs-de-erros-do-wordpress-parte-1\/\" title=\"Da \u00faltima vez\">Da \u00faltima vez<\/a><\/strong>, passamos pelo seguinte:<\/p>\n<ol>\n<li>configurando constantes de depura\u00e7\u00e3o,<\/li>\n<li>localizar um arquivo de log de erros,<\/li>\n<li>entender como ler o arquivo de log,<\/li>\n<li>Entendendo os rastreamentos de pilha<\/li>\n<li>Entendendo como ler a pilha<\/li>\n<\/ol>\n<p>Por mais legal que isso seja, ainda \u00e9 importante entender como gravar dados no log de erros de um aspecto program\u00e1tico. Ou seja; uma coisa \u00e9 se o seu trabalho gerar erros, avisos ou avisos.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162973-61e747bcebed4.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162973-61e747bcebed4.png\" alt=\"Lendo e entendendo os logs de erros do WordPress, parte 2\"><\/a><\/p>\n<p>\u00c9 outra coisa se voc\u00ea quiser entender como gravar informa\u00e7\u00f5es no arquivo para pesquisa e depura\u00e7\u00e3o manualmente.<\/p>\n<p>Neste post, continuaremos fazendo exatamente isso para entender melhor os logs de erros do WordPress.<\/p>\n<h2>Entendendo os logs de erros do WordPress, parte 2<\/h2>\n<p>Qual \u00e9 o objetivo de escrever no log de erros, afinal? Quero dizer, \u00e9 mesmo parte do processo de depura\u00e7\u00e3o?<\/p>\n<p>Do <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/lendo-e-entendendo-os-logs-de-erros-do-wordpress-parte-1\/\" title=\"post anterior\">post anterior<\/a><\/strong> :<\/p>\n<blockquote>\n<p>Mas e o caso de quando queremos despejar algo para obter informa\u00e7\u00f5es sobre o que o WordPress ou PHP est\u00e1 vendo? Isso tamb\u00e9m \u00e9 \u00fatil.<\/p>\n<\/blockquote>\n<p>Quando os programadores pensam em depura\u00e7\u00e3o, muitos deles pensam em usar um depurador real (ou seja, um software), definir pontos de interrup\u00e7\u00e3o e percorrer o c\u00f3digo para observar o valor das vari\u00e1veis \u200b\u200benquanto o programa \u00e9 executado.<\/p>\n<p>Vamos chegar a esse ponto, mas antes de fazer isso, vamos dar uma olhada em como podemos gravar no log de erros para nos dar uma vis\u00e3o sobre o desempenho do nosso trabalho.<\/p>\n<p>Afinal, uma coisa \u00e9 o nosso trabalho estar lan\u00e7ando avisos, erros e avisos. Outra \u00e9 se h\u00e1 informa\u00e7\u00f5es que queremos ver. E \u00e9 a\u00ed que a grava\u00e7\u00e3o no log de erros entra em a\u00e7\u00e3o.<\/p>\n<h3>Entendendo as fun\u00e7\u00f5es do PHP<\/h3>\n<p>Para gravar no log de erros, \u00e9 importante entender duas fun\u00e7\u00f5es do PHP:<\/p>\n<ol>\n<li><strong><a href=\"https:\/\/secure.php.net\/manual\/en\/function.error-log.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">log_erro<\/a><\/strong><\/li>\n<li><strong><a href=\"https:\/\/secure.php.net\/manual\/en\/function.print-r.php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">print_r<\/a><\/strong><\/li>\n<\/ol>\n<p>No que diz respeito \u00e0 fun\u00e7\u00e3o error_log, observe que sua finalidade \u00e9:<\/p>\n<blockquote>\n<p>Envie uma mensagem de erro para as rotinas de tratamento de erros definidas<\/p>\n<\/blockquote>\n<p>Na maioria dos casos, isso \u00e9 configurado para gravar no arquivo de log para n\u00f3s por meio da configura\u00e7\u00e3o padr\u00e3o do WordPress e do PHP. Mas h\u00e1 mais do que isso, porque geralmente queremos gerar os valores de vari\u00e1veis, matrizes, objetos e assim por diante.<\/p>\n<p>Para isso, precisa ser capaz de usar <strong>print_r<\/strong> em conjunto com <strong>error_log<\/strong>. <strong>print_r<\/strong> faz o seguinte:<\/p>\n<blockquote>\n<p>Imprime informa\u00e7\u00f5es leg\u00edveis por humanos sobre uma vari\u00e1vel<\/p>\n<\/blockquote>\n<p>E se voc\u00ea ler o manual, notar\u00e1 que s\u00e3o necess\u00e1rios dois argumentos, sendo que o segundo deve ser definido como <strong>true<\/strong> se voc\u00ea quiser que o resultado de uma fun\u00e7\u00e3o seja impresso no arquivo de log.<\/p>\n<p>Especificamente, como o manual afirma:<\/p>\n<blockquote>\n<p>Se voc\u00ea quiser capturar a sa\u00edda de <strong>print_r()<\/strong>, use o <code>return<\/code>par\u00e2metro. Quando este par\u00e2metro \u00e9 definido como <strong><code>TRUE<\/code><\/strong>, <strong>print_r()<\/strong> retornar\u00e1 as informa\u00e7\u00f5es em vez de imprimi-las.<\/p>\n<\/blockquote>\n<p>Portanto, a ideia geral de escrever o valor de um array, digamos $exampleArray, seria algo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/426e02bcfc411d43be6715b3e84ead7e#file-13-error-log-print-r-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\nerror_log(print_r($exampleArray, true));<\/code><\/pre>\n<p>Mas e no contexto do WordPress?<\/p>\n<h3>Escrevendo valores no log de erros no WordPress<\/h3>\n<p>Ent\u00e3o, o acima descreve as fun\u00e7\u00f5es que s\u00e3o constru\u00eddas no PHP que precisamos, mas como isso se parece no contexto do desenvolvimento do WordPress.<\/p>\n<p>Para fazer isso, digamos que implementamos uma vers\u00e3o do <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/usando-o-padrao-de-registro-no-wordpress\/\" title=\"Registry Pattern\">Registry Pattern<\/a><\/strong>. Em nossa implementa\u00e7\u00e3o do padr\u00e3o, tamb\u00e9m temos um m\u00e9todo chamado <strong>start<\/strong> que podemos chamar assim que todos os nossos objetos forem adicionados ao registro.<\/p>\n<p>Pode parecer algo <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/426e02bcfc411d43be6715b3e84ead7e#file-14-start-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">assim:<\/a><\/strong><\/p>\n<pre><code>&lt;?php\n\n\/**\n * Starts all of the objects stored is the registry by calling\n * the `start` method that's available on each of the objects.\n *\/\npublic function start()\n{\n    foreach ($this-&gt;storage as $obj) {\n        $obj-&gt;start();\n    }\n}<\/code><\/pre>\n<p>Agora, no que diz respeito \u00e0 implementa\u00e7\u00e3o, isso \u00e9 simples. Mas e se quisermos ver quais objetos est\u00e3o sendo invocados por meio de cada itera\u00e7\u00e3o do loop?<\/p>\n<p>A ideia por tr\u00e1s disso \u00e9 que podemos iterar pelos objetos armazenados e chamar um m\u00e9todo em cada um deles. Isso se baseia na ideia de que cada um dos objetos tem um m\u00e9todo dispon\u00edvel em cada um deles (que pode ser aplicado por uma <strong><a href=\"https:\/\/wordpress.mediadoma.com\/pt-pt\/programacao-orientada-a-objetos-entendendo-interfaces\/\" title=\"interface\">interface<\/a><\/strong> ).<\/p>\n<p>Primeiro, isso levanta uma quest\u00e3o: por que podemos querer fazer isso? Devido \u00e0 natureza do sistema de gerenciamento de eventos do WordPress, talvez queiramos ter certeza de que cada objeto que esperamos disparar dispara.<\/p>\n<p>Em segundo lugar, como podemos ver quais objetos est\u00e3o sendo invocados? \u00c9 aqui que a grava\u00e7\u00e3o no log de erros entra em a\u00e7\u00e3o. Usando os m\u00e9todos descritos acima, uma maneira de fazer isso seria fazer <strong><a href=\"https:\/\/gist.github.com\/tommcfarlin\/426e02bcfc411d43be6715b3e84ead7e#file-15-view-stored-objects-php\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">o seguinte<\/a><\/strong> :<\/p>\n<pre><code>&lt;?php\n\n\/**\n * Starts all of the objects stored is the registry by calling\n * the `start` method that's available on each of the objects.\n *\/\npublic function start()\n{\n    foreach ($this-&gt;storage as $obj) {\n        error_log(print_r($obj, true));\n        $obj-&gt;start();\n    }\n}<\/code><\/pre>\n<p>Isso resultar\u00e1 na seguinte sa\u00edda:<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162973-61e747c0a5923.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-162973-61e747c0a5923.png\" alt=\"Lendo e entendendo os logs de erros do WordPress, parte 2\"><\/a><\/p>\n<p>Aqui, voc\u00ea pode ver o objeto; \u00e9 namespace, s\u00e3o valores de propriedade (incluindo se as propriedades s\u00e3o ou n\u00e3o privadas, protegidas, p\u00fablicas e assim por diante).<\/p>\n<p>A partir da\u00ed, voc\u00ea pode fazer um pouco de depura\u00e7\u00e3o se a sa\u00edda for o que voc\u00ea n\u00e3o esperava ou talvez voc\u00ea possa usar isso para verificar se seu c\u00f3digo est\u00e1 fazendo o que voc\u00ea espera.<\/p>\n<p>Este \u00e9 apenas um exemplo, no entanto. Voc\u00ea pode, no entanto, despejar os valores da vari\u00e1vel <strong>$storage<\/strong> antes mesmo de iterar pelo loop. Essa escolha depende realmente de voc\u00ea e do que voc\u00ea deseja alcan\u00e7ar.<\/p>\n<h2>Usando os plugins instalados<\/h2>\n<p>Neste ponto, abordamos os aspectos fundamentais da depura\u00e7\u00e3o de c\u00f3digo por meio do uso de logs de erros.<\/p>\n<p>Agora, por\u00e9m, precisamos voltar nossa aten\u00e7\u00e3o para os plugins que foram discutidos alguns posts atr\u00e1s. Depois disso, eventualmente estaremos trabalhando at\u00e9 o Xdebug.<\/p>\n<p>Mas a seguir, veremos as ferramentas dispon\u00edveis para n\u00f3s no pr\u00f3prio WordPress.<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">Fonte de grava\u00e7\u00e3o:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/tommcfarlin.com\" class=\"external external_icon\">tommcfarlin.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00c9 outra coisa se voc\u00ea quiser entender como gravar manualmente as informa\u00e7\u00f5es no arquivo para fins de pesquisa e depura\u00e7\u00e3o. Neste post, continuaremos fazendo exatamente isso para entender melhor os logs de erros do WordPress.<\/p>\n","protected":false},"author":1,"featured_media":162974,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[898,722,846],"tags":[1170],"class_list":["post-230767","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-codigo-2","category-desenvolvedor","category-tutoriais","tag-affiai-pt-pt"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230767","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/comments?post=230767"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/posts\/230767\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media\/162974"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/media?parent=230767"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/categories?post=230767"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/pt-pt\/wp-json\/wp\/v2\/tags?post=230767"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}