{"id":938,"date":"2014-07-11T13:25:42","date_gmt":"2014-07-11T16:25:42","guid":{"rendered":"http:\/\/www.viazap.com.br\/?p=938"},"modified":"2014-07-11T13:25:42","modified_gmt":"2014-07-11T16:25:42","slug":"gerando-logs-em-java","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=938","title":{"rendered":"Gerando logs em Java"},"content":{"rendered":"<table border=\"0\" width=\"100%\" cellspacing=\"3\" cellpadding=\"3\">\n<tbody>\n<tr>\n<td colspan=\"2\"><b>Introdu\u00e7\u00e3o<\/b><\/p>\n<div>Bom, vou mostrar a import\u00e2ncia do logs para um sistema.<\/p>\n<p><em>Logs<\/em>, nada mais s\u00e3o do que arquivos gerados pelo programa para que haja uma comunica\u00e7\u00e3o entre o sistema para o usu\u00e1rio. Logs s\u00e3o relat\u00f3rios de diversos tipos, informando o que est\u00e1 acontecendo no sistema.<\/p>\n<p>Mas, o que irei abordar aqui, s\u00e3o logs de erros. Os logs gerados pelo sistema s\u00e3o de estrema import\u00e2ncia, pois s\u00e3o eles que nos ajudam a fazer a manuten\u00e7\u00e3o de sistema, o que ajuda a vida de um programador.<\/p>\n<p>Afinal, qual conte\u00fado deve-se ter um log de erro?<\/p>\n<p>Dentro do log de erro, deve ter tr\u00eas coisas fundamentais, em minha opini\u00e3o, mas \u00f3bvio que dentro do log, voc\u00ea pode colocar as informa\u00e7\u00f5es que voc\u00ea quiser, quanto mais voc\u00ea detalhar o log com informa\u00e7\u00f5es do erro que ocorreu melhor fica para sua manuten\u00e7\u00e3o.<!--more--><\/p>\n<ol>\n<li>O primeiro item, que \u00e9 meio \u00f3bvio, \u00e9 informar onde que ocorreu o erro, em que parte do c\u00f3digo que houve uma ocorr\u00eancia, geralmente os logs s\u00e3o chamados no try\/catch, nos if e por a\u00ed vai.<\/li>\n<li>Informar a classe onde est\u00e1 acontecendo o erro. \u00c9 fundamental informar a classe onde est\u00e1 o erro, pois imagine na seguinte situa\u00e7\u00e3o: Voc\u00ea abre v\u00e1rios arquivos e chama esse m\u00e9todo em diferentes classes. Imagine se eu s\u00f3 informar o erro, terei que procurar em todas as classes que tenha esse m\u00e9todo.<\/li>\n<li>Informar a data. Acho que desse item n\u00e3o precisar fala muito. \u00c9 fundamental saber quando ocorreu e a hora e dia.<\/li>\n<\/ol>\n<p>L\u00f3gico que isso s\u00f3 \u00e9 o b\u00e1sico, poderia informar tamb\u00e9m a linha do c\u00f3digo que est\u00e1 dando o erro, o que \u00e9 comum programadores colocarem na hora de gerar o log.<\/p>\n<p>Como havia dito, quanto mais informa\u00e7\u00f5es do erro melhor.<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Classe main \/ Classe conex\u00e3o com MySQL<\/b><\/p>\n<div>\n<h1>Classe main<\/h1>\n<p>Vou mostrar um exemplo de como usar log, fazendo uma conex\u00e3o com banco de dados MySQL.<\/p>\n<p>Para come\u00e7ar, vou criar tr\u00eas classes:<\/p>\n<ul>\n<li>Conexao.class\u00a0Respons\u00e1vel por fazer a conex\u00e3o com o banco de dados;<\/li>\n<li>geraLogs.class\u00a0Classe gen\u00e9rica que ficar\u00e1 respons\u00e1vel por gerar nossos logs;<\/li>\n<li>main\u00a0Classe principal que ficar\u00e1 respons\u00e1vel por executar nosso exemplo.<\/li>\n<\/ul>\n<p>Na\u00a0classe main, ficar\u00e1 assim:<\/p>\n<div class=\"codigo\">public class main<br \/>\n{<br \/>\npublic static void main(String[] args)<br \/>\n{<br \/>\nConexao conexao = new Conexao();<\/p>\n<p>}<br \/>\n}<\/p><\/div>\n<p>Simplesmente, ficar\u00e1 respons\u00e1vel por inst\u00e2ncia nossa classe\u00a0Conexao, para iniciar a conex\u00e3o com o banco de dados.<\/p>\n<p>Vamos para a pr\u00f3xima classe,\u00a0Conex\u00e3o.<\/p>\n<h1>Classe conex\u00e3o com MySQL<\/h1>\n<p>Como havia dito na p\u00e1gina anterior, eu irei realizar um exemplo de uma conex\u00e3o com banco de dados e farei com que d\u00ea errado propositadamente a conex\u00e3o, para poder gerar os logs com a outra classe.<\/p>\n<div class=\"codigo\">import java.sql.Connection;<br \/>\nimport java.sql.DriverManager;<br \/>\nimport java.sql.SQLException;<\/p>\n<p>public class Conexao<br \/>\n{<br \/>\nString conexao;<br \/>\nboolean conectado;<br \/>\ngeraLog log;<\/p>\n<p>public Conexao()<br \/>\n{<br \/>\ncriaConexao();<br \/>\n}<\/p>\n<p><span class=\"comentario\">\/**<br \/>\n*Metodo responsavel por cria\u00e7\u00e3o da conexao com banco de dados<br \/>\n* @return retorna um boolean se for conectado<br \/>\n*<\/span>\/<br \/>\nprivate boolean criaConexao()<br \/>\n{<br \/>\nlog = new geraLog();<br \/>\nString usuario = &#8220;klone&#8221;;<br \/>\nString senha = &#8220;senha&#8221;;<br \/>\nString local = &#8220;localhost&#8221;;<br \/>\nString database = &#8220;Agenda&#8221;;<br \/>\nString url = &#8220;jdbc:mysql:\/\/&#8221;+local+ &#8220;\/&#8221; + database;<\/p>\n<p>Connection conexao;<\/p>\n<p><span class=\"comentario\">\/\/For\u00e7a o uso do try \/ catch<\/span><br \/>\ntry<br \/>\n{<br \/>\nString driver = &#8220;com.mysql.jdbc.Drivers&#8221;;<br \/>\nClass.forName(driver).newInstance();<br \/>\nconexao = DriverManager.getConnection(url,usuario,senha);<br \/>\nconectado = true;<br \/>\nSystem.out.println(&#8220;Conectado&#8221;);<br \/>\n}<br \/>\ncatch (SQLException erro)<br \/>\n{<br \/>\nlog.LogTxt(erro.toString(), &#8220;Conexao&#8221;);<br \/>\nerro.printStackTrace();<br \/>\nconectado = false;<br \/>\n}<br \/>\ncatch (ClassNotFoundException e)<br \/>\n{<br \/>\nlog.LogTxt(e.toString(), &#8220;Conexao&#8221;);<br \/>\ne.printStackTrace();<br \/>\nconectado = false;<br \/>\n}<br \/>\ncatch (InstantiationException e)<br \/>\n{<br \/>\nlog.LogTxt(e.toString(), &#8220;Conexao&#8221;);<br \/>\ne.printStackTrace();<br \/>\nconectado = false;<br \/>\n}<br \/>\ncatch (IllegalAccessException e)<br \/>\n{<br \/>\nlog.LogTxt(e.toString(), &#8220;Conexao&#8221;);<br \/>\n<span class=\"comentario\">\/\/ TODO Auto-generated catch block<\/span><br \/>\ne.printStackTrace();<br \/>\n}<\/p>\n<p>return conectado;<br \/>\n}<br \/>\n}<\/p><\/div>\n<p>Bom, ficou assim a minha classe. Logo no come\u00e7o, existe um construtor que ir\u00e1 chamar um m\u00e9todo\u00a0criaConexao();\u00a0para dar in\u00edcio \u00e0 conex\u00e3o.<\/p>\n<p>Esse m\u00e9todo\u00a0criaConexao();\u00a0\u00e9 um m\u00e9todo booleano, pois tenho como objetivo no final desse m\u00e9todo, retornar\u00a0true\u00a0ou\u00a0false\u00a0para verificar se est\u00e1 conectado.<\/p>\n<p>Ainda nesse m\u00e9todo, logo de cara, existem as vari\u00e1veis com as configura\u00e7\u00f5es para poder fazer a conex\u00e3o com banco de dados. Eu estou utilizando o driver JDBC MySQL para poder fazer a conex\u00e3o e gerar a string do driver.<\/p>\n<p>* Detalhe muito importante: quando voc\u00ea est\u00e1 criando a conex\u00e3o com banco de dados, o Java for\u00e7a voc\u00ea a usar o\u00a0try\/catch\u00a0como seguran\u00e7a. \u00c9 a\u00ed que fica o segredo para poder gerar os logs. Pois o catch captura umaException\u00a0e, a partir da\u00ed, podemos chamar um m\u00e9todo para gerar o nosso log.<\/p>\n<p>Ainda no m\u00e9todo\u00a0criaConexao(), coloquei diferentes tipos de Exception, para que fique melhor saber qual erro que estou tratando.<\/p>\n<p>Vamos para a pr\u00f3xima etapa, que \u00e9 nossa classe que gera os logs.<\/p>\n<\/div>\n<\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\"><b>Classe que gera log<\/b><\/p>\n<div>Bom, como disse, tem uma classe gen\u00e9rica que poder\u00e1 gerar nosso log. Essa classe \u00e9 gen\u00e9rica, porque n\u00e3o depende apenas de uma classe. Essa classe serve para qualquer classe para que eu possa gerar o log.<\/p>\n<p>Obs.: os arquivos gerados de log, geralmente s\u00e3o com a extens\u00e3o\u00a0txt,\u00a0log\u00a0ou\u00a0xml. Existe a op\u00e7\u00e3o de voc\u00ea gerar o seu log em XML e a partir da\u00ed, voc\u00ea pode criar um programinha para ler esse XML mostrando mais detalhes, mas a\u00ed vai da sua criatividade.<\/p>\n<p>Minha classe que gera logs ficou assim:<\/p>\n<div class=\"codigo\">import java.io.BufferedReader;<br \/>\nimport java.io.File;<br \/>\nimport java.io.FileReader;<br \/>\nimport java.io.FileWriter;<br \/>\nimport java.io.IOException;<br \/>\nimport java.util.Date;<\/p>\n<p>public class geraLog<br \/>\n{<br \/>\npublic void LogTxt(String nome,String classe)<br \/>\n{<br \/>\nFile arquivoTxt = new File(&#8220;\/home\/klone\/log_programa.txt&#8221;);<\/p>\n<p>if(!arquivoTxt.exists())<br \/>\n{<br \/>\ntry<br \/>\n{\u00a0\u00a0\u00a0<span class=\"comentario\">\/\/Cria o arquivo<\/span><br \/>\narquivoTxt.createNewFile();<br \/>\nSystem.out.println(&#8220;Arquivo criado&#8221;);<\/p>\n<p><span class=\"comentario\">\/\/salva o arquivo<\/span><br \/>\nFileWriter\u00a0\u00a0writer = new FileWriter(arquivoTxt);<br \/>\nwriter.write(&#8220;Problema:&#8221; + nome+&#8221;\\n&#8221;);<br \/>\nwriter.write(&#8220;Classe:&#8221;+classe+&#8221;\\n&#8221;);<br \/>\nwriter.write(&#8220;Data:&#8221;+ new Date()+&#8221;\\n&#8221;);<\/p>\n<p>writer.close();<br \/>\nSystem.out.println(&#8220;Arquivo salvado&#8221;);<br \/>\n}<br \/>\ncatch (IOException e)<br \/>\n{<br \/>\ne.printStackTrace();<br \/>\n}<br \/>\n}<br \/>\nelse<br \/>\n{<br \/>\ntry<br \/>\n{<br \/>\nFileReader reader = new FileReader(arquivoTxt);<br \/>\nBufferedReader br = new BufferedReader(reader);<br \/>\nString linha = br.readLine();<br \/>\nFileWriter\u00a0\u00a0writer = new FileWriter(arquivoTxt);<\/p>\n<p>while(linha != null)<br \/>\n{<br \/>\nwriter.write(linha+&#8221;\\n&#8221;);<br \/>\nbr.readLine();<br \/>\nlinha = br.readLine();<br \/>\n}<\/p>\n<p>br.close();<br \/>\nreader.close();<\/p>\n<p>writer.write(&#8220;Problema:&#8221; + nome+&#8221;\\n&#8221;);<br \/>\nwriter.write(&#8220;Classe:&#8221;+classe+&#8221;\\n&#8221;);<br \/>\nwriter.write(&#8220;Data:&#8221;+ new Date());<br \/>\nwriter.close();<br \/>\nSystem.out.println(&#8220;Arquivo salvado&#8221;);<br \/>\n}<br \/>\ncatch(IOException err)<br \/>\n{<br \/>\nerr.printStackTrace();<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n}<\/p><\/div>\n<p>Logo no come\u00e7o, eu crio o arquivo respons\u00e1vel por gravar os erro. Pode-se tamb\u00e9m fazer com que gere v\u00e1rios arquivos de log, mas nesse exemplo, estarei mostrando como salvar todo os erros num arquivo s\u00f3.<\/p>\n<p>Como podemos ver, \u00e9 um m\u00e9todo que recebe a mensagem de erro e a classe onde ocorreu o erro.<\/p>\n<p>Essa classe, nada mais \u00e9 que manipula\u00e7\u00e3o de arquivos, onde verifico se o arquivo existe. Se n\u00e3o existir, crio o arquivo e salvo as informa\u00e7\u00f5es. Se o arquivo existir, abro ele e adiciono mais informa\u00e7\u00f5es ao final.<\/p>\n<p>Outro dado importante, \u00e9 que coloco a data e a hora da ocorr\u00eancia do erro, um dado fundamental.<\/p>\n<p>Assim gera-se nosso log de erro simples.<\/p>\n<h1>Conclus\u00e3o<\/h1>\n<p>Logs de erros s\u00e3o fundamentais para um bom sistema estruturado.<\/p>\n<p>Sem eles, fica dif\u00edcil realizar manuten\u00e7\u00e3o no c\u00f3digo. Al\u00e9m disso, deixa o usu\u00e1rio mais confi\u00e1vel, pois sabendo-se onde ocorreu o erro, pode-se concert\u00e1-lo mais rapidamente.<\/p>\n<p>Logs s\u00e3o mais do que um arquivo falando onde que ocorreu um erro, s\u00e3o um meio de comunica\u00e7\u00e3o entre o software e o usu\u00e1rio final.<\/p><\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n","protected":false},"excerpt":{"rendered":"<p>Introdu\u00e7\u00e3o Bom, vou mostrar a import\u00e2ncia do logs para um sistema. Logs, nada mais s\u00e3o do que arquivos gerados pelo programa para que haja uma comunica\u00e7\u00e3o entre o sistema para o usu\u00e1rio. Logs s\u00e3o relat\u00f3rios de diversos tipos, informando o que est\u00e1 acontecendo no sistema. Mas, o que irei abordar aqui, s\u00e3o logs de erros. [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[1,42,51,127,548],"tags":[662,661,253],"class_list":["post-938","post","type-post","status-publish","format-standard","hentry","category-viazap","category-leitura-recomendada","category-linux-linuxrs","category-sistemas-de-armazenamento","category-ubuntu-2","tag-em-java","tag-gerando","tag-logs"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/938","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=938"}],"version-history":[{"count":1,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/938\/revisions"}],"predecessor-version":[{"id":939,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/938\/revisions\/939"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=938"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=938"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=938"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}