{"id":539,"date":"2024-04-22T06:00:00","date_gmt":"2024-04-22T09:00:00","guid":{"rendered":"https:\/\/adrianosantostreina.com.br\/blog\/?p=539"},"modified":"2024-04-29T15:06:45","modified_gmt":"2024-04-29T18:06:45","slug":"como-criar-e-ler-logs-em-android-com-delphi","status":"publish","type":"post","link":"https:\/\/adrianosantostreina.com.br\/blog\/como-criar-e-ler-logs-em-android-com-delphi\/","title":{"rendered":"Como criar e monitorar logs em Android com Delphi?"},"content":{"rendered":"\n<p>Desenvolver aplicativos robustos e eficientes envolve mais do que apenas escrever c\u00f3digo; \u00e9 essencial monitorar como um aplicativo se comporta em tempo real. A capacidade de criar e ler logs \u00e9 crucial para entender e melhorar o desempenho e a estabilidade de um aplicativo, al\u00e9m \u00e9 claro de facilitar a captura e corre\u00e7\u00e3o de bugs no aplicativo.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h4 class=\"wp-block-heading\">A Import\u00e2ncia dos Logs em Aplicativos<\/h4>\n\n\n\n<p>Logs s\u00e3o essenciais para qualquer aplicativo, pois oferecem uma vis\u00e3o clara do que est\u00e1 acontecendo <em>&#8220;sob o cap\u00f4&#8221;<\/em>. Com logs adequados, desenvolvedores podem rastrear o fluxo de execu\u00e7\u00e3o, monitorar o estado das vari\u00e1veis, e identificar e corrigir bugs de maneira eficiente.<\/p>\n\n\n\n<p>Claro que \u00e9 totalmente poss\u00edvel incluir breakpoints no Delphi e executar step-by-step, ou seja, linha a linha. Mas nem sempre isso ajuda, pois sabemos que a uma lentid\u00e3o no processo, j\u00e1 que precisamos estar conectados ao celular\/tablet por meio de USB ou wi-fi, e isso pode demorar o processo de debug. <\/p>\n\n\n\n<p>Uma parte cr\u00edtica tamb\u00e9m \u00e9 quando estamos trabalhando com Threads. Debugar um aplicativo Android que possui algum processo envolvido em Threads n\u00e3o \u00e9 uma tarefa simples. Portanto, \u00e9 muito importante a cria\u00e7\u00e3o de logs que v\u00e3o garantir uma melhor vis\u00e3o do que est\u00e1 acontecendo.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Logs auxiliam na depura\u00e7\u00e3o de erros<\/h4>\n\n\n\n<p>Logs s\u00e3o essenciais para o desenvolvimento de software, servindo como uma ferramenta fundamental para a depura\u00e7\u00e3o e an\u00e1lise de problemas em aplicativos. Quando um aplicativo falha ou se comporta de maneira inesperada, frequentemente, o primeiro recurso que os desenvolvedores consultam s\u00e3o os logs. Eles oferecem um registro cronol\u00f3gico das atividades do aplicativo, permitindo aos desenvolvedores rastrear o que o aplicativo estava fazendo no momento do problema.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Exemplos de Uso de Logs na Depura\u00e7\u00e3o<\/h4>\n\n\n\n<p>Suponha que um aplicativo m\u00f3vel trava quando o usu\u00e1rio tenta carregar dados espec\u00edficos. Sem logs, identificar a origem do problema pode ser como procurar uma agulha no palheiro. Com logs adequados, por\u00e9m, os desenvolvedores podem ver exatamente quais fun\u00e7\u00f5es estavam sendo executadas e quais dados estavam sendo processados no momento do travamento. Por exemplo:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Antes do Crash<\/strong><\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:sh decode:true \">INFO: Solicita\u00e7\u00e3o de dados iniciada para o usu\u00e1rio ID1234\nDEBUG: Dados recebidos: [dados parciais...]\nERROR: Falha na convers\u00e3o de dados tipo X\nCRITICAL: Aplicativo encerrado devido a exce\u00e7\u00e3o n\u00e3o tratada\n<\/pre><\/div>\n\n\n\n<p>Este log mostra claramente que o problema ocorreu durante uma &#8220;falha na convers\u00e3o de dados&#8221;, levando a uma &#8220;exce\u00e7\u00e3o n\u00e3o tratada&#8221; que causou o travamento do aplicativo. Com essa informa\u00e7\u00e3o, os desenvolvedores podem ir diretamente ao c\u00f3digo que lida com a convers\u00e3o dos dados e investigar a causa do erro.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Vantagens de ter Logs em aplica\u00e7\u00f5es<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Detec\u00e7\u00e3o R\u00e1pida de Problemas<\/strong>\n<ul class=\"wp-block-list\">\n<li>Logs proporcionam uma maneira r\u00e1pida de identificar onde e quando um problema ocorreu, o que pode economizar horas de depura\u00e7\u00e3o.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Monitoramento de Sa\u00fade do Aplicativo<\/strong>\n<ul class=\"wp-block-list\">\n<li>Logs n\u00e3o s\u00e3o \u00fateis apenas para depura\u00e7\u00e3o ap\u00f3s falhas; eles tamb\u00e9m podem ser usados para monitorar a sa\u00fade do aplicativo em tempo real, identificando lentid\u00e3o nas transa\u00e7\u00f5es ou aumento inesperado no uso de recursos.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Hist\u00f3rico Detalhado<\/strong>\n<ul class=\"wp-block-list\">\n<li>Manter um hist\u00f3rico de logs pode ajudar a identificar e analisar tend\u00eancias ou recorr\u00eancias de problemas, permitindo uma abordagem proativa na melhoria da aplica\u00e7\u00e3o.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Facilita\u00e7\u00e3o de Auditorias<\/strong>\n<ul class=\"wp-block-list\">\n<li>Em ambientes regulados, os logs fornecem uma trilha de auditoria que pode ser usada para verificar a conformidade com regulamentos de seguran\u00e7a ou operacionais.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Simplifica\u00e7\u00e3o do Suporte ao Cliente<\/strong>\n<ul class=\"wp-block-list\">\n<li>Com logs detalhados, as equipes de suporte podem rapidamente entender e resolver problemas relatados pelos usu\u00e1rios, melhorando a satisfa\u00e7\u00e3o do cliente.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">O que \u00e9 Logcat?<\/h4>\n\n\n\n<p><strong>Logcat <\/strong>\u00e9 uma ferramenta de linha de comando integrada ao Android que coleta e exibe logs do sistema e de aplicativos. Todos os aplicativos Android geram logs que podem ser acessados atrav\u00e9s do Logcat, tornando-o uma ferramenta indispens\u00e1vel para desenvolvedores.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/adrianosantos.link\/treinamentos\" target=\"_blank\" rel=\"noreferrer noopener\"><img fetchpriority=\"high\" decoding=\"async\" width=\"800\" height=\"150\" src=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/02\/Banner-Hotmart-1.png\" alt=\"\" class=\"wp-image-222\" srcset=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/02\/Banner-Hotmart-1.png 800w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/02\/Banner-Hotmart-1-300x56.png 300w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/02\/Banner-Hotmart-1-768x144.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Como funciona o Logcat?<\/h4>\n\n\n\n<p>Logcat funciona capturando mensagens de log baseadas em v\u00e1rios n\u00edveis de prioridade, como erro <strong>(E), aviso (W), informa\u00e7\u00e3o (I), depura\u00e7\u00e3o (D)<\/strong> e detalhado <strong>(V)<\/strong>. Essas mensagens ajudam desenvolvedores a entender o comportamento do aplicativo em diferentes condi\u00e7\u00f5es e configura\u00e7\u00f5es.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Comandos do Logcat<\/h4>\n\n\n\n<h4 class=\"wp-block-heading\"><\/h4>\n\n\n\n<p>Para usar o Logcat, uma ferramenta essencial na caixa de ferramentas de qualquer desenvolvedor Android, \u00e9 necess\u00e1rio que o dispositivo Android (celular ou tablet) esteja conectado ao computador. Isso pode ser feito de duas maneiras principais:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Conex\u00e3o USB<\/strong>: Conecte seu dispositivo Android ao computador via cabo USB. Certifique-se de que a depura\u00e7\u00e3o USB esteja ativada nas op\u00e7\u00f5es de desenvolvedor do dispositivo.<\/li>\n\n\n\n<li><strong>ADB via Wi-Fi<\/strong>: Para dispositivos que suportam conex\u00f5es sem fio, voc\u00ea pode conectar o dispositivo ao ADB via Wi-Fi. Isso geralmente requer que o dispositivo esteja na mesma rede que o computador e que voc\u00ea inicie a sess\u00e3o ADB via USB para configurar a conex\u00e3o Wi-Fi inicialmente. Aqui est\u00e3o os comandos para configurar o ADB via Wi-Fi:<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:sh decode:true \">adb tcpip 5555\nadb connect &lt;IP_DO_DISPOSITIVO&gt;:5555\n<\/pre><\/div>\n\n\n\n<p>Caso tenha d\u00favidas, assista a esse v\u00eddeo no nosso canal:<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe title=\"Conectando no seu Device por Wi Fi com ADB\" width=\"640\" height=\"360\" src=\"https:\/\/www.youtube.com\/embed\/5t0T_rSZv74?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Substitua <code>&lt;IP_DO_DISPOSITIVO&gt;<\/code> pelo endere\u00e7o IP real do seu dispositivo Android.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Capturando Logs com o Logcat<\/h4>\n\n\n\n<p>Uma vez que o dispositivo esteja conectado, voc\u00ea pode come\u00e7ar a capturar logs usando o Logcat atrav\u00e9s do seguinte comando no terminal ou prompt de comando:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"height-mode:1 height:50 width-mode:1 width:50 inline-margin:15 whitespace-before:1 whitespace-after:1 lang:delphi decode:true \">adb logcat\n<\/pre><\/div>\n\n\n\n<p>Este comando exibir\u00e1 todos os logs do sistema e de aplicativos gerados no dispositivo.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Comandos e filtros do Logcat<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Limpar o Buffer de Logs<\/strong>: Antes de iniciar a captura de logs, voc\u00ea pode querer limpar logs antigos para facilitar a visualiza\u00e7\u00e3o dos novos eventos.<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">adb logcat -c\n<\/pre><\/div>\n\n\n\n<p><strong>Filtrar por N\u00edvel de Prioridade<\/strong>: Se voc\u00ea estiver interessado apenas em mensagens de erro, por exemplo, voc\u00ea pode filtrar os logs por n\u00edvel de prioridade:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">adb logcat MyAppTag:D *:E\n<\/pre><\/div>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Este comando mostra todas as mensagens de Debug (e mais cr\u00edticas) para &#8220;MyAppTag&#8221; e silencia todos os outros logs.<\/li>\n\n\n\n<li><strong>Exportar para um Arquivo<\/strong>: Para salvar os logs em um arquivo, voc\u00ea pode redirecionar a sa\u00edda para um arquivo no seu sistema:<\/li>\n<\/ul>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">adb logcat -v time &gt; myapp_logs.txt\n<\/pre><\/div>\n\n\n\n<p>Voc\u00ea pode filtrar logs de um aplicativo espec\u00edfico usando tags. Por exemplo, para ver apenas os logs de um aplicativo com a tag &#8220;MyApp&#8221;, voc\u00ea usaria:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:sh decode:true \">adb logcat MyApp:D *:S\n<\/pre><\/div>\n\n\n\n<p>Isso mostra todas as mensagens de depura\u00e7\u00e3o (D) para &#8220;MyApp&#8221; e silencia os outros logs.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><\/h2>\n\n\n\n<p class=\"has-large-font-size\"><strong>Como enviar logs de um app Delphi para o Logcat?<\/strong><\/p>\n\n\n\n<p>O logging \u00e9 uma ferramenta crucial em qualquer plataforma de desenvolvimento, mas \u00e9 particularmente essencial no desenvolvimento de aplicativos m\u00f3veis com Delphi para Android. Implementar logs eficientes ajuda os desenvolvedores a entender o comportamento do aplicativo em condi\u00e7\u00f5es reais de uso, facilita a identifica\u00e7\u00e3o de erros e a an\u00e1lise de desempenho, e pode fornecer insights valiosos sobre como os usu\u00e1rios interagem com o aplicativo.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Vantagens do Logging via Delphi no Android<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Rastreamento de Erros e Exce\u00e7\u00f5es<\/strong>: Logs permitem que voc\u00ea capture informa\u00e7\u00f5es detalhadas sobre exce\u00e7\u00f5es e erros de runtime, o que \u00e9 crucial para diagn\u00f3stico r\u00e1pido e eficaz.<\/li>\n\n\n\n<li><strong>Monitoramento de Desempenho<\/strong>: Logs podem ser usados para monitorar o desempenho de partes cr\u00edticas do seu aplicativo, ajudando a identificar pontos de lentid\u00e3o ou potenciais vazamentos de mem\u00f3ria.<\/li>\n\n\n\n<li><strong>Auditoria e Seguran\u00e7a<\/strong>: Atrav\u00e9s dos logs, \u00e9 poss\u00edvel manter um registro de atividades importantes, como transa\u00e7\u00f5es ou modifica\u00e7\u00f5es de dados sens\u00edveis.<\/li>\n\n\n\n<li><strong>Feedback em Tempo Real<\/strong>: Em um ambiente de desenvolvimento, ver os logs em tempo real enquanto o aplicativo est\u00e1 em execu\u00e7\u00e3o pode fornecer feedback imediato sobre o impacto de recentes mudan\u00e7as no c\u00f3digo.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Como Enviar Logs do Delphi para o Logcat<\/h4>\n\n\n\n<p>Para enviar logs do seu aplicativo Delphi para o Logcat, voc\u00ea pode usar a unit <code>Androidapi.Log<\/code>. Esta unit oferece uma interface direta para o sistema de log do Android, permitindo que voc\u00ea envie mensagens de log diretamente do seu c\u00f3digo Delphi.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">Passos para Implementar Logs:<\/h5>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Incluir a Unidade Necess\u00e1ria<\/strong>: No seu projeto Delphi, inclua a unidade <code>Androidapi.Log<\/code>. Isso proporciona acesso \u00e0s fun\u00e7\u00f5es de log do Android.<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">uses Androidapi.Log;\n<\/pre><\/div>\n\n\n\n<p><strong>Enviar Mensagens de Log<\/strong>: Voc\u00ea pode enviar logs usando diferentes n\u00edveis de prioridade, dependendo da import\u00e2ncia da mensagem. Por exemplo, para enviar uma mensagem de erro, voc\u00ea utilizaria:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">Log.d('MyApp', 'Esta \u00e9 uma mensagem de debug');\nLog.e('MyApp', 'Erro encontrado: ' + MensagemDeErro);\n<\/pre><\/div>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Aqui, <code>Log.d<\/code> \u00e9 usado para mensagens de debug e <code>Log.e<\/code> para mensagens de erro. As fun\u00e7\u00f5es dispon\u00edveis incluem <code>Log.v<\/code> (Verbose), <code>Log.d<\/code> (Debug), <code>Log.i<\/code> (Info), <code>Log.w<\/code> (Warning), e <code>Log.e<\/code> (Error).<\/li>\n\n\n\n<li><strong>Visualizar os Logs<\/strong>: Depois de enviar logs do seu aplicativo, voc\u00ea pode visualiz\u00e1-los utilizando o comando <code>adb logcat<\/code> no terminal ou em uma interface gr\u00e1fica que suporte visualiza\u00e7\u00e3o de logs do Android.<\/li>\n<\/ol>\n\n\n\n<p>Esse processo \u00e9 f\u00e1cil, basta abrir o terminal do Windows, qualquer um, digitar:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:sh decode:true \">adb devices<\/pre><\/div>\n\n\n\n<p>Isso vai trazer na tela o UUID do dispositivo conectado na porta USB. Em seguida digite:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:sh decode:true \">adb -s &lt;UUID&gt; &lt;TAG&gt;:D *:S<\/pre><\/div>\n\n\n\n<p>Substitua o <strong>&lt;UUID&gt;<\/strong> pelo <strong>UUID <\/strong>do seu dispositivo pego no comando anterior. Substitua <strong>&lt;TAG&gt;<\/strong> pela tag do seu aplicativo que voc\u00ea indicou na chamada para o log. No exemplo acima usamos <strong>&#8216;MyAPP&#8217;<\/strong>, no print de tela abaixo usei a tag <strong>&#8216;MeuAplicativo&#8217;<\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" width=\"1024\" height=\"531\" src=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/04\/image-18-1024x531.png\" alt=\"\" class=\"wp-image-552\" srcset=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/04\/image-18-1024x531.png 1024w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/04\/image-18-300x155.png 300w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/04\/image-18-768x398.png 768w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/04\/image-18-1536x796.png 1536w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/04\/image-18.png 1928w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Perceba que em cada bot\u00e3o do meu aplicativo exemplo, coloquei um tipo de log, <strong>Information, Warning, Error<\/strong> e<strong> Fatal Error. <\/strong>Os logs s\u00e3o printados na tela do terminal ao clicar no bot\u00e3o.<\/p>\n\n\n\n<p>Ent\u00e3o agora imagine uma janela de login por exemplo: Poder\u00edamos fazer a chamada ao log antes e depois de clicar no bot\u00e3o Entrar, ou durante o processo de autentica\u00e7\u00e3o do servidor, sincronismo com o banco de dados, enfim, as possibilidades s\u00e3o infinitas.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Conhe\u00e7a a Biblioteca MultiLog4D: Simplificando Logs em Aplicativos Delphi<\/h4>\n\n\n\n<p>Se voc\u00ea leu este artigo at\u00e9 aqui e gostou do que viu, certamente ir\u00e1 apreciar ainda mais a solu\u00e7\u00e3o que estou desenvolvendo para facilitar o dia a dia dos desenvolvedores de aplicativos Delphi. Apresento a voc\u00ea a biblioteca <strong>MultiLog4D<\/strong>.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">O que \u00e9 MultiLog4D?<\/h4>\n\n\n\n<p><strong>MultiLog4D<\/strong> \u00e9 uma biblioteca em desenvolvimento que tem como objetivo simplificar o processo de logging em diversas plataformas usando Delphi. Com apenas uma linha de c\u00f3digo, voc\u00ea pode enviar logs para o Android, e isso \u00e9 apenas o come\u00e7o. A primeira vers\u00e3o suporta Android, e planejamos expandir rapidamente para outras plataformas, incluindo <strong>Windows Desktop (Log em arquivo), Windows Service (Event Viewer), Linux (syslog), macOS (NSLog)<\/strong> e <strong>iOS<strong> (NSLog)<\/strong><\/strong>. O nome &#8220;<strong>MultiLog4D<\/strong>&#8221; reflete essa capacidade multiplataforma.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Por que usar MultiLog4D?<\/h4>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Simplicidade<\/strong>: Elimina a complexidade do manejo de diferentes sistemas de logs em v\u00e1rias plataformas.<\/li>\n\n\n\n<li><strong>Efici\u00eancia<\/strong>: Acelera o desenvolvimento e a depura\u00e7\u00e3o ao permitir que voc\u00ea se concentre no c\u00f3digo, n\u00e3o na configura\u00e7\u00e3o de logs.<\/li>\n\n\n\n<li><strong>Unifica\u00e7\u00e3o<\/strong>: Mantenha uma consist\u00eancia de logs atrav\u00e9s de todas as plataformas suportadas.<\/li>\n\n\n\n<li><strong>Open Source<\/strong>: Totalmente aberto para contribui\u00e7\u00f5es da comunidade, garantindo que evolui para atender \u00e0s necessidades reais dos desenvolvedores.<\/li>\n<\/ol>\n\n\n\n<h4 class=\"wp-block-heading\">Instala\u00e7\u00e3o e Uso<\/h4>\n\n\n\n<p><strong>MultiLog4D<\/strong> est\u00e1 dispon\u00edvel para download e instala\u00e7\u00e3o via GitHub ou atrav\u00e9s do gerenciador de pacotes <strong>Boss<\/strong>.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Instala\u00e7\u00e3o via GitHub<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Visite nosso <a href=\"https:\/\/github.com\/adrianosantostreina\/MultiLog4D\" target=\"_blank\" rel=\"noreferrer noopener\">reposit\u00f3rio no GitHub<\/a> para clonar ou baixar diretamente.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Instala\u00e7\u00e3o via Boss<\/strong>:\n<ul class=\"wp-block-list\">\n<li>Se voc\u00ea usa o <em>Boss (Delphi Package Manager),<\/em> pode instalar o <strong>MultiLog4D <\/strong>facilmente com o seguinte comando:<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:sh decode:true \">boss install github.com\/adrianosantostreina\/MultiLog4D<\/pre><\/div>\n\n\n\n<p>Aproveite que entrou no GitHub e marque estrelinha pra n\u00f3s, ajuda demais o projeto.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"674\" height=\"121\" src=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/04\/image-19.png\" alt=\"\" class=\"wp-image-564\" srcset=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/04\/image-19.png 674w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/04\/image-19-300x54.png 300w\" sizes=\"(max-width: 674px) 100vw, 674px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/github.com\/adrianosantostreina\/MultiLog4D\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"150\" src=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/04\/MultiLog4D-Artigo.png\" alt=\"\" class=\"wp-image-559\" srcset=\"https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/04\/MultiLog4D-Artigo.png 800w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/04\/MultiLog4D-Artigo-300x56.png 300w, https:\/\/adrianosantostreina.com.br\/blog\/wp-content\/uploads\/2024\/04\/MultiLog4D-Artigo-768x144.png 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/a><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Exemplos de Uso<\/h4>\n\n\n\n<p>Uma vez instalado, usar o <strong>MultiLog4D <\/strong>\u00e9 extremamente simples. Veja como voc\u00ea pode enviar logs de sua aplica\u00e7\u00e3o Delphi para o Android:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">program DefaultSample;\n\nuses\n  System.StartUpCopy,\n  MultiLog4D.Util,\n  FMX.Forms,\n  Unit1 in 'Unit1.pas' {Form1};\n\n{$R *.res}\n\nbegin\n  TMultiLog4DUtil\n   .Logger\n     .Tag('MultiLog4D')\n     .LogWriteInformation('Inicializando o sistema...');\n\n  Application.Initialize;\n  Application.CreateForm(TForm1, Form1);\n  Application.Run;\nend.<\/pre><\/div>\n\n\n\n<p>Esse exemplo demonstra como enviar um log simples. Nesse exemplo abri o <em>Source <\/em>do projeto e antes da inicializa\u00e7\u00e3o do aplicativo chamei o log pra informar que vamos passar pela inicializa\u00e7\u00e3o do sistema. Pra facilitar a vida de todos n\u00f3s, criei uma <strong>unit MultiLog4D.Util <\/strong>que possui uma classe <strong>Singleton TMultiLog4DUtil <\/strong>e nela a propriedade Logger que possui os m\u00e9todos de log.<\/p>\n\n\n\n<p>Note que chamo primeiro o <strong>TAG <\/strong>e depois o <strong>LogWriteInformation<\/strong>, a ordem \u00e9 o de menos, o que quero que observe aqui \u00e9 o <strong>TAG<\/strong>. A <strong>TAG <\/strong>\u00e9 <strong>obrigat\u00f3ria <\/strong>apesar da biblioteca n\u00e3o for\u00e7ar o uso. Ela \u00e9 importante para que possamos filtrar as mensangens no terminal, como vimos anteriormente. Portanto um log gerado pela nossa aplica\u00e7\u00e3o com a <strong>TAG MultiLog4D,<\/strong> filtrar\u00edamos os logs no terminal da seguinte forma:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:sh decode:true \">adb -s &lt;UUID&gt; MultiLog4D:D *:S<\/pre><\/div>\n\n\n\n<p>Lembrando que o <strong>UUID <\/strong>\u00e9 voc\u00ea consegue depois de rodar o comando <code>adb devices<\/code>. Conforme novas plataformas forem adicionadas, o mesmo c\u00f3digo poder\u00e1 enviar logs para diferentes destinos sem nenhuma altera\u00e7\u00e3o adicional por parte do desenvolvedor.<\/p>\n\n\n\n<p>Um outro exemplo de uso seria dentro de blocos<strong> try..except<\/strong>, por exemplo:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">procedure TForm1.Button6Click(Sender: TObject);\nbegin\n  try\n    TMultiLog4DUtil\n      .Logger\n        .LogWriteWarning('Converte um n\u00famero');\n\n    StrToInt('MultiLog4D');\n  except on E:Exception do\n    begin\n      TMultiLog4DUtil\n        .Logger\n          .LogWriteError('Ocorreram erros:')\n          .LogWriteFatalError(E.ClassName + ' | ' + E.Message);\n    end;\n  end;\nend;<\/pre><\/div>\n\n\n\n<p>Perceba que a cada chamada para o log, uma mensagem \u00e9 publicada no terminal, isso ajuda demais na depura\u00e7\u00e3o e descoberta de problemas. Aqui simulamos um erro fatal, convers\u00e3o de texto em inteiro. Colocamos o log no <strong>Except <\/strong>do c\u00f3digo e ele mostrar\u00e1 no terminal a mensagem <strong>&#8220;Ocorreram erros:&#8221;<\/strong> acrescidos dos erros original do Delphi em ingl\u00eas retornados pelo <strong>Except<\/strong>. Legal n\u00e9?<\/p>\n\n\n\n<p class=\"has-large-font-size\"><strong>Outras formas de uso<\/strong><\/p>\n\n\n\n<p>Escrevemos uma classe <strong>Factory <\/strong>e voc\u00ea pode utilizar ela para fazer uso do Log do jeito como desejar. Aqui abaixo declaramos <strong>MultiLog4D.Factory<\/strong> no uses da <strong>Unit1 (Form1)<\/strong>, declaramos uma vari\u00e1vel global para o <strong>Form (FLogger) <\/strong>e ent\u00e3o chamamos os m\u00e9todos.<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">uses\n  MultiLog4D.Types,\n  MultiLog4D.Factory;\n\n...\n\ntype\n  TForm1 = class\n  private\n    FLogger: IMultiLog4D;\n  public\n  end;\n...\n\nprocedure TForm1.Button1Click(Sender: TObject);\nbegin\n  FLogger := TLogFactory.GetLogger; \/\/ Correto, obt\u00e9m a inst\u00e2ncia adequada\n  FLogger.Tag('MultiLog4D');\n  FLogger.LogWrite('Teste de Log', ltInformation); \/\/ Chama m\u00e9todo que deve estar implementado\nend;\n<\/pre><\/div>\n\n\n\n<p>Claro que para um aplicativo com m\u00faltiplo forms ter\u00edamos que ter o <strong>FLogger <\/strong>como uma <strong>var\u00e1vel global <\/strong>para a aplica\u00e7\u00e3o inteira, talvez em uma <strong>Unit <\/strong>ou <strong>DataModule <\/strong>comum a toda a aplica\u00e7\u00e3o, dessa forma em qualquer lugar poderia informar o m\u00e9todo <strong>LogWrite<\/strong>.<\/p>\n\n\n\n<p>Um exemplo de <strong>Unit <\/strong>poderia ser assim:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">unit LoggingUtils;\n\ninterface\n\nuses\n  MultiLog4D.Interfaces, MultiLog4D.Factory;\n\nvar\n  GlobalLogger: IMultiLog4D;\n\nimplementation\n\ninitialization\n  GlobalLogger := TLogFactory.GetLogger;\n\nfinalization\n  GlobalLogger := nil;\n\nend.\n<\/pre><\/div>\n\n\n\n<p>E as chamadas nos forms ficariam:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">uses\n  LoggingUtils;\n\nprocedure TForm1.Button1Click(Sender: TObject);\nbegin\n  GlobalLogger.Tag('MultiLog4D');\n  GlobalLogger.LogWrite('Log message here', ltInformation);\nend;\n<\/pre><\/div>\n\n\n\n<p>Dessa forma, <strong>LoggingUitls <\/strong>seria adicionada ao uses de cada form que precisa utilizar o <strong>Log<\/strong>. Eu particularmente gosto dessa abordagem, mas n\u00e3o \u00e9 a que mais uso em meus sistemas, varia bastante a forma de utiliza\u00e7\u00e3o.<\/p>\n\n\n\n<p>Por fim, mais uma forma legal de usar \u00e9 criando sua pr\u00f3pria classe <strong>Singleton <\/strong>em seu projeto, assim voc\u00ea n\u00e3o precisa instanciar, veja:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">unit LoggingService;\n\ninterface\n\nuses\n  MultiLog4D.Interfaces, MultiLog4D.Factory;\n\ntype\n  TLoggingService = class\n  private\n    class var FLogger: IMultiLog4D;\n    class function GetLogger: IMultiLog4D; static;\n  public\n    class property Logger: IMultiLog4D read GetLogger;\n  end;\n\nimplementation\n\nclass function TLoggingService.GetLogger: IMultiLog4D;\nbegin\n  if FLogger = nil then\n    FLogger := TLogFactory.GetLogger;\n  Result := FLogger;\nend;\n\nend.\n<\/pre><\/div>\n\n\n\n<p>Em outra palavras, criamos uma classe <strong>Singleton <\/strong>chamada <strong>TLoggingService <\/strong>e a partir dela podemos apenas incluir a unit no uses de cada form e fachar a chamada direto:<\/p>\n\n\n\n<div class=\"wp-block-urvanov-syntax-highlighter-code-block\"><pre class=\"lang:delphi decode:true \">uses\n  LoggingService;\n\nprocedure TForm1.Button1Click(Sender: TObject);\nbegin\n  TLoggingService.Logger.Tag('MultiLog4D');\n  TLoggingService.Logger.LogWrite('Log message here', ltInformation);\nend;\n<\/pre><\/div>\n\n\n\n<p>Como pudemos ver, h\u00e1 v\u00e1rias formas de utiliza\u00e7\u00e3o. A que mais gosto \u00e9 a primeira delas, onde usamos a classe singleton que desenvolvemos, <strong>MultiLog4D.Util.<\/strong> Entretanto quis demonstrar que voc\u00ea pode usar de v\u00e1rias formas diferentes a biblioteca que desenvolvi. Muito legal n\u00e9?<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">O Futuro do MultiLog4D<\/h4>\n\n\n\n<p>Estamos trabalhando ativamente para expandir a funcionalidade do <strong>MultiLog4D<\/strong>. Em breve, voc\u00ea poder\u00e1 logar informa\u00e7\u00f5es n\u00e3o apenas no Android, mas tamb\u00e9m em:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Windows (Desktop e Service)<\/strong>: Integrando com o Event Viewer.<\/li>\n\n\n\n<li><strong>Linux<\/strong>: Enviando logs para o syslog.<\/li>\n\n\n\n<li><strong>macOS e iOS<\/strong>: Utilizando as ferramentas nativas de log desses sistemas.<\/li>\n<\/ul>\n\n\n\n<p>No Windows por exemplo vamos gravar os logs em arquivo que poder\u00e3o ser consultados mais tarde tanto em aplica\u00e7\u00f5es VCL quanto FMX.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Conclus\u00e3o<\/h4>\n\n\n\n<p><strong>MultiLog4D <\/strong>visa ser a solu\u00e7\u00e3o definitiva para logging em aplica\u00e7\u00f5es Delphi multiplataforma. Ao abstrair as complexidades de cada plataforma, permite que desenvolvedores se concentrem no que realmente importa: criar aplicativos incr\u00edveis. Convido todos a experimentar a biblioteca, contribuir e fazer parte desta excitante jornada de desenvolvimento.<\/p>\n\n\n\n<p>Esperamos que a <strong>MultiLog4D <\/strong>torne seu desenvolvimento mais f\u00e1cil e seus aplicativos mais robustos e f\u00e1ceis de manter.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Comunidade no <a href=\"https:\/\/t.me\/AdrianoSantosCommunity\">Telegram<\/a><\/p>\n\n\n\n<p>\ud83d\ude80Comente no campo abaixo \ud83d\udc47\ud83d\udc47\ud83d\udc47 o que achou e qual sua d\u00favida.<\/p>\n\n\n\n<p>Te vejo na pr\u00f3xima<\/p>\n\n\n\n<p>Adriano Santos<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Desenvolver aplicativos robustos e eficientes envolve mais do que apenas escrever c\u00f3digo; \u00e9 essencial monitorar como um aplicativo se comporta em tempo real. A capacidade de criar e ler logs \u00e9 crucial para entender e melhorar o desempenho e a estabilidade de um aplicativo, al\u00e9m \u00e9 claro de facilitar a captura e corre\u00e7\u00e3o de bugs [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":558,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[56,1],"tags":[15,14],"class_list":["post-539","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-android","category-blog","tag-android","tag-delphi"],"_links":{"self":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/539","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/comments?post=539"}],"version-history":[{"count":21,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/539\/revisions"}],"predecessor-version":[{"id":566,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/posts\/539\/revisions\/566"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media\/558"}],"wp:attachment":[{"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/media?parent=539"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/categories?post=539"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianosantostreina.com.br\/blog\/wp-json\/wp\/v2\/tags?post=539"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}