<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: DrxwHe4rt</title>
    <description>The latest articles on DEV Community by DrxwHe4rt (@wendrewdevelop).</description>
    <link>https://dev.to/wendrewdevelop</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F502420%2Fabb8c149-6b88-4e0b-87ec-856ae056660c.jpeg</url>
      <title>DEV Community: DrxwHe4rt</title>
      <link>https://dev.to/wendrewdevelop</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/wendrewdevelop"/>
    <language>en</language>
    <item>
      <title>Python Logging Config</title>
      <dc:creator>DrxwHe4rt</dc:creator>
      <pubDate>Sat, 16 Jan 2021 02:17:36 +0000</pubDate>
      <link>https://dev.to/wendrewdevelop/python-logging-config-oi9</link>
      <guid>https://dev.to/wendrewdevelop/python-logging-config-oi9</guid>
      <description>&lt;p&gt;Caso tenha você tenha começado a ler esse artigo e esta se perguntado "que diabos é logging?", deixo aqui os artigos anteriores para que fique por dentro (é de extrema importancia que leia os artigos anteriores a esse, para que tenha maior compreensão do que iremos fazer aqui).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/wendrewdevelop/gerando-logs-com-python-25k4"&gt;Amostragem generalizada sobre logging, em python&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/wendrewdevelop/logging-handlers-55j8"&gt;Handlers&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://dev.to/wendrewdevelop/python-logging-formatters-fld"&gt;Formatters&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;E a parte 4 dessa serie de artigos sobre logging será esse que você esta lendo, onde iremos parametrizar todas as configurações de nosso logging em um arquivo especifico, para que fique tudo organizado.&lt;/p&gt;

&lt;p&gt;Para começar, crie uma pasta na qual ira comportar os itens desse artigo, dê o nome que preferir a ela e após isso crie um arquivo &lt;em&gt;app.py&lt;/em&gt; (dê o nome que preferir também).&lt;/p&gt;

&lt;p&gt;Comece importando nosso modo de logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;logging&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por enquanto vamos deixar o arquivo &lt;em&gt;app.py&lt;/em&gt; dessa forma e vamos criar outro arquivo chamado &lt;em&gt;config.ini&lt;/em&gt; (também sinta-se a vontade para escolher o nome que desejar). É nesse arquivo que iremos adicionar nossas configurações.&lt;/p&gt;

&lt;p&gt;Para que você entenda brevemente do que se trata, o arquivo com extensão &lt;em&gt;.ini&lt;/em&gt; é divido em sessões que possuem propriedades, é muito útil para arquivos de configuração que não necessitam de muita complexidade. Segue a formatação de um arquivo de configuração desse tipo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="c"&gt;; Isso é um comentario
&lt;/span&gt;
&lt;span class="c"&gt;; As propriedades basicas de um arquivo desse tipo são as propriedades e essas contém um nome e um valor
&lt;/span&gt;&lt;span class="py"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;valor&lt;/span&gt;

&lt;span class="c"&gt;; O arquivo, também pode ser divido por sessões, para que fique melhor organizado
&lt;/span&gt;&lt;span class="nn"&gt;[sessão]&lt;/span&gt;
&lt;span class="py"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;valor&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dito tudo isso, podemos começar a configurar o arquivo do nosso sistema de logs. Dentro do arquivo que criamos, vamos adicionar as seguintes sessões e propriedade:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[loggers]&lt;/span&gt;
&lt;span class="c"&gt;; Por padrão o logger root ja é chamado pelo módulo logging, mas iremos deixar isso explicito
&lt;/span&gt;&lt;span class="py"&gt;keys&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;

&lt;span class="nn"&gt;[handlers]&lt;/span&gt;
&lt;span class="c"&gt;; Aqui definimos o modo como nosso log irá operar
&lt;/span&gt;&lt;span class="py"&gt;keys&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;FileHandler&lt;/span&gt;

&lt;span class="nn"&gt;[formatters]&lt;/span&gt;
&lt;span class="c"&gt;; E aqui será o nosso formatador
; O formatador também ficara dentro desse arquivo
&lt;/span&gt;&lt;span class="py"&gt;keys&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;simpleFormatter&lt;/span&gt;

&lt;span class="c"&gt;; Aqui definiremos as configurações do nosso logger root
&lt;/span&gt;&lt;span class="nn"&gt;[logger_root]&lt;/span&gt;
&lt;span class="c"&gt;; Indicamos o level de DEBUG apenas
&lt;/span&gt;&lt;span class="py"&gt;level&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;DEBUG&lt;/span&gt;
&lt;span class="c"&gt;; Especificamos o nome do logger que iremos atuar
&lt;/span&gt;&lt;span class="py"&gt;qualname&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
&lt;span class="c"&gt;; E dizemos que será um logger de arquivo
&lt;/span&gt;&lt;span class="py"&gt;handlers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;FileHandler&lt;/span&gt;

&lt;span class="c"&gt;; propriedades do nosso arquivo de log
&lt;/span&gt;&lt;span class="nn"&gt;[handler_FileHandler]&lt;/span&gt;
&lt;span class="c"&gt;; Especificamos a nossa classe
&lt;/span&gt;&lt;span class="py"&gt;class&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;FileHandler&lt;/span&gt;
&lt;span class="c"&gt;; O formatador
&lt;/span&gt;&lt;span class="py"&gt;formatter&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;simpleFormatter&lt;/span&gt;
&lt;span class="c"&gt;; Aqui definimos o nome e o modo de escrita 
&lt;/span&gt;&lt;span class="py"&gt;args&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;('LOG.log', 'w')&lt;/span&gt;
&lt;span class="c"&gt;; write / w = sobrescreve o arquivo sempre que gera um log novo
; append / a (padrão) = agrupa todos os logs sem apagar o anterior
&lt;/span&gt;
&lt;span class="c"&gt;; Por ultimo, mas não menos importante
; Definiremos como irá atuar nossa string de formatação
&lt;/span&gt;&lt;span class="nn"&gt;[formatter_simpleFormatter]&lt;/span&gt;
&lt;span class="py"&gt;format&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;Data/Hora: %(asctime)s | level: %(levelname)s | file: %(filename)s | mensagem: %(message)s&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como pode ver, deixei tudo comentado conforme fui decorrendo o arquivo, acredito que ficará mais facil de compreender, ao inves de dividir a explicação por partes.&lt;/p&gt;

&lt;p&gt;Com o arquivo de configuração pronto, vamos voltar a &lt;em&gt;app.py&lt;/em&gt; e terminar de escrever nosso codigo. Nós tinhamos acabado de importar nosso módulo, então vamos dar continuidade implementando as seguintes linhas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Além de importar o módulo logging
# Iremos importar outro modulo, chamado config
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;logging.config&lt;/span&gt;

&lt;span class="c1"&gt;# Logo abaixo definiremos o arquivo de configuração
&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fileConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'config.ini'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Para um breve entendimento...&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ao importarmos &lt;em&gt;logging.config&lt;/em&gt; abrimos um leque de possibilidades, quando se trata de configurações de log. Dentre o métodos de configuração, escolhemos o  &lt;em&gt;fileConfig&lt;/em&gt; ja que estamos trabalhando com um arquivo de configuração, mas o módulo carrega com si outras opções, como &lt;em&gt;dictConfig&lt;/em&gt; que obtém a configuração de log atravéz de um dicionário, contamos também com a opção &lt;em&gt;listen&lt;/em&gt; que inicia um servidor de soquete na porta especificada e escuta as novas configurações.&lt;/p&gt;

&lt;p&gt;Dito isso, vamos finalizar nosso script adicionando as seguintes linhas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# definido a instancia do objeto getLogger()
&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# Gerando log
&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'teste'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nosso arquivo &lt;em&gt;app.py&lt;/em&gt; completo ficará assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;logging&lt;/span&gt;
&lt;span class="c1"&gt;# Além de importar o módulo logging
# Iremos importar outro módulo, chamado config
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;logging.config&lt;/span&gt;

&lt;span class="c1"&gt;# Logo abaixo definiremos o arquivo de configuração
&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fileConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'config.ini'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# definido a instancia do objeto getLogger()
&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# Gerando log
&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'teste'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, podemos executar nosso codigo. Digite no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após rodar o script, veremos que foi gerado o arquivo &lt;em&gt;LOG.log&lt;/em&gt; com a seguinte mensagem dentro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Data/Hora: 2021-01-14 12:39:34,687 | level: INFO | file: app.py | mensagem: teste
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Talvez, esse artigo tenha ficado maior do que os anteriores e um pouco mais maçante, mas isso foi necessário para que obtivéssemos um melhor entendimento do que fizemos. Agora você ja conseguirá criar um gerador de logs mais "encorpado" e mais facil de ser mantido futuramente, pois segue a ideia da documentação oficial. &lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>linux</category>
      <category>logging</category>
    </item>
    <item>
      <title>Python Logging Formatters</title>
      <dc:creator>DrxwHe4rt</dc:creator>
      <pubDate>Thu, 14 Jan 2021 15:50:01 +0000</pubDate>
      <link>https://dev.to/wendrewdevelop/python-logging-formatters-fld</link>
      <guid>https://dev.to/wendrewdevelop/python-logging-formatters-fld</guid>
      <description>&lt;p&gt;Esse artigo iremos aprender a formatar nossa mensagem de log e entregar uma experiencia melhor nesse quesito. Mas, primeiro vamos entender o que é um &lt;em&gt;formatter&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Basicamente, eles configuram a ordem, a estrutura e o conteúdo finais da mensagem de log;&lt;/li&gt;
&lt;li&gt;Se não houver formatação na mensagem, o padrão é usar a mensagem bruta; &lt;/li&gt;
&lt;li&gt;Se não houver formatação na data, o formato de data padrão é: &lt;em&gt;%Y-%m-%d %H:%M:%S&lt;/em&gt;;&lt;/li&gt;
&lt;li&gt;A string de mensagem padrão é:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="s"&gt;'%(asctime)s - %(levelname)s - %(message)s'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos ver isso em pratica...&lt;/p&gt;

&lt;p&gt;Comece criando o arquivo &lt;em&gt;.py&lt;/em&gt;, no meu caso, irá se chamar &lt;strong&gt;app.py&lt;/strong&gt;, sinta-se a vontade para colocar o nome que desejar. Após criar o arquivo, iremos importar o módulo &lt;em&gt;logging&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;logging&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, vamos definir a nstancia do objeto &lt;em&gt;getLogger()&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E o nivel de criticidade do objeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, chegamos no ponto em que gostariamos. É o momento de definir o nosso formatador:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;formatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;'%(asctime)s:%(levelname)s:%(message)s'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos utilizar a formatação padrão e ao decorrer do artigo vamos implementando essa colocação.&lt;/p&gt;

&lt;p&gt;Apenas para método de praticidade, iremos utilizar o modo &lt;em&gt;StreamHandler&lt;/em&gt; (visto no &lt;a href=""&gt;artigo anterior&lt;/a&gt;), dessa forma o log ficará somente no terminal e não salvará em nenhum arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StreamHandler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos finalizar nosso código dizendo ao módulo logging qual o nosso formatador, utilizando a função &lt;em&gt;setFormatter&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;sh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setFormatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;formatter&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicione uma simples mensagem para que nosso script gere um log a partir dela:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Olá.'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;execute o nosso script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A saida deverá ser algo parecido com isso:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--j9wGJ45E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d5sckp63sdec41orbyqh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--j9wGJ45E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d5sckp63sdec41orbyqh.png" alt="2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos agora, dizer ao nosso formatador que queremos que ele mostre qual arquivo gerou o log. Para isso, implementaremos o seguinte parametro a nossa string: &lt;em&gt;%(filename)s&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# sua variavel formatter deverá ficar dessa forma:
&lt;/span&gt;&lt;span class="n"&gt;formatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;'%(asctime)s:%(levelname)s:%(filename)s:%(message)s'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute outra vez o script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O retorno será esse:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2plFKNNY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mjncse7gjq5ofbffvwt7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2plFKNNY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/mjncse7gjq5ofbffvwt7.png" alt="Captura de tela_2021-01-13_19-06-24"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pensando bem, essa data esta meio confusa, não esta?&lt;br&gt;
Que tal se formatássemos a data então?&lt;br&gt;
Veja:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a função &lt;em&gt;Formatter&lt;/em&gt; contém uma variavel chamada &lt;em&gt;datefmt&lt;/em&gt;, podemos usar ela para formatar a nossa data/hora e retornar algo mais &lt;em&gt;user friendly&lt;/em&gt;. Dito isso, mudaremos o conteúdo da nossa variavel &lt;em&gt;formatter&lt;/em&gt; adicionando o parametro &lt;em&gt;datefmt&lt;/em&gt; da seguinte forma:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;formatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;'%(asctime)s:%(levelname)s:%(filename)s:%(message)s'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;# Padrão de data: dia/mes/ano 
&lt;/span&gt;    &lt;span class="c1"&gt;# Padrão de hora: hora/minuto/segundos 
&lt;/span&gt;    &lt;span class="c1"&gt;# Sistema (am/pm)
&lt;/span&gt;    &lt;span class="n"&gt;datefmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'%d/%m/%Y %I:%M:%S %p'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Execute o script e o seu resultado será esse:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l2si5JGF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/67yhpbra3woeykwllcjo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l2si5JGF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/67yhpbra3woeykwllcjo.png" alt="3"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você pode embelezar um pouco mais sua string formatadora e deixa-la da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;formatter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Formatter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;'Data/Hora: %(asctime)s | level: %(levelname)s | file: %(filename)s | mensagem: %(message)s'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="c1"&gt;# Padrão de data: dia/mes/ano 
&lt;/span&gt;    &lt;span class="c1"&gt;# Padrão de hora: hora/minuto/segundos 
&lt;/span&gt;    &lt;span class="c1"&gt;# Sistema (am/pm)
&lt;/span&gt;    &lt;span class="n"&gt;datefmt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;'%d/%m/%Y %H:%M:%S %p'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tendo como resultado:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4GrGanRC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d8x88chmqgfqtry69tc5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4GrGanRC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/d8x88chmqgfqtry69tc5.png" alt="4"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Vimos nesse artigo que podemos formatar nossa log e deixa-lo mais amigável para quem for lê-lo (normalmente, será um desenvolvedor). Lendo a documentação você irá perceber que existem outras formas de realizar essa formatação, mas procurei um jeito mais didático de mostrar como se faz.&lt;/p&gt;

</description>
      <category>python</category>
      <category>logging</category>
      <category>programming</category>
      <category>linux</category>
    </item>
    <item>
      <title>Python Logging Handlers</title>
      <dc:creator>DrxwHe4rt</dc:creator>
      <pubDate>Wed, 13 Jan 2021 20:55:15 +0000</pubDate>
      <link>https://dev.to/wendrewdevelop/logging-handlers-55j8</link>
      <guid>https://dev.to/wendrewdevelop/logging-handlers-55j8</guid>
      <description>&lt;p&gt;No &lt;a href="https://dev.to/wendrewdevelop/gerando-logs-com-python-25k4"&gt;artigo anterior&lt;/a&gt;&lt;a&gt;&lt;/a&gt; vimos como podemos gerar mensagens de erro, aviso e informativas do sistema. Agora, iremos aprofundar um pouco mais nesse assunto e iremos entender o que são os &lt;em&gt;Handlers&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Os principais &lt;em&gt;Handlers&lt;/em&gt; são:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;StreamHandler:&lt;/strong&gt; Retorna a mensagem/log no terminal;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FileHandler:&lt;/strong&gt; Envia o log para um arquivo definido pelo desenvolvedor;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NullHandler:&lt;/strong&gt; não faz nenhuma formatação ou saída. É essencialmente um manipulador &lt;em&gt;no-op&lt;/em&gt; (sem operação).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Na &lt;a href="https://docs.python.org/3/library/logging.handlers.html" rel="noopener noreferrer"&gt;documentação oficial&lt;/a&gt;&lt;a&gt;&lt;/a&gt; podemos contar um numero maior de &lt;em&gt;Handlers&lt;/em&gt;, mas nesse artigo iremos usar apenas o &lt;strong&gt;StreamHandler&lt;/strong&gt; e o &lt;strong&gt;FileHandler&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Vamos começar criando nosso arquivo &lt;em&gt;.py&lt;/em&gt;, no meu caso irá se chamar &lt;strong&gt;app.py&lt;/strong&gt;, mas pode atribuir o nome que desejar. Após isso, iremos começar a escrever o nosso codigo...&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Comece importando o módulo logging
&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, vamos definir nossa instancia do objeto getLogger() e o nivel de nosso log (nesse caso iremos definir o nivel de DEBUG).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos então definir as propriedades do nosso handler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Vamos começar testando o FileHandler
# O nome do nosso arquivo de log será LOG.log
&lt;/span&gt;&lt;span class="n"&gt;fh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FileHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;LOG.log&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Definindo o level do nosso handler
# Nesse caso, também será DEBUG
&lt;/span&gt;&lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setLevel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após definirmos as propriedades, de fato iremos criar o nosso handler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fh&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por fim, vamos criar uma simples saida de texto para o nosso logger:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;debug&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Olá, sou a mensagem de log dentro do seu arquivo.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute usando o script:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sh python app.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;Depois de executar o codigo, olhe na raiz da pasta que agora terá um arquivo com o nome &lt;em&gt;LOG.lg&lt;/em&gt; contendo o seguinte conteúdo:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4w761gs07h95w0vapbh9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4w761gs07h95w0vapbh9.png" alt="log"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora, iremos testar o modo &lt;strong&gt;StreamHandler&lt;/strong&gt;. Para isso iremos mudar apenas uma linha do codigo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# de
&lt;/span&gt;&lt;span class="n"&gt;fh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;FileHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;LOG.log&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# para
&lt;/span&gt;&lt;span class="n"&gt;fh&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;StreamHandler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O restante do código pode manter da forma como estava. Se preferir, pode apagar o arquivo &lt;em&gt;LOG.log&lt;/em&gt; para perceber que utilizando o &lt;em&gt;StreamHandler&lt;/em&gt; o arquivo não será criado.&lt;/p&gt;

&lt;p&gt;Rode no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sh python app.py&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;O seu retorno será no próprio terminal:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6gl3it6817m0yop59fe2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F6gl3it6817m0yop59fe2.png" alt="log2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O modo &lt;strong&gt;StreamHandler&lt;/strong&gt; é usado, especialmente, para que os desenvolvedores tenham um retorno visual mais rapido, é comum o &lt;strong&gt;StreamHandler&lt;/strong&gt; ser usado juntamente ao &lt;strong&gt;FileHandler&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Concluindo
&lt;/h2&gt;

&lt;p&gt;Você tem varios manipuladores de logs disponives, hoje utilizamos os mais comuns, pois a usabilidade é, basicamente, a mesma, só muda a forma como você irá aplicar em seu ambiente.&lt;/p&gt;

</description>
      <category>python</category>
      <category>logging</category>
      <category>linux</category>
      <category>programming</category>
    </item>
    <item>
      <title>Gerando Logs com python</title>
      <dc:creator>DrxwHe4rt</dc:creator>
      <pubDate>Mon, 11 Jan 2021 21:53:33 +0000</pubDate>
      <link>https://dev.to/wendrewdevelop/gerando-logs-com-python-25k4</link>
      <guid>https://dev.to/wendrewdevelop/gerando-logs-com-python-25k4</guid>
      <description>&lt;p&gt;Nesse artigo, iremos trabalhar com a geração de logs em python, utilizando o módulo &lt;em&gt;logging&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Retirado da documentação oficial do python&lt;/strong&gt;: "&lt;em&gt;Este módulo define funções e classes que implementam um sistema de registro de eventos flexível para aplicativos e bibliotecas.&lt;/em&gt;"&lt;/p&gt;

&lt;p&gt;O que a descrição acima quer dizer?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bem, imagine o seguinte cenário: Temos uma função que realiza retorna o nome completo de uma pessoa, os parâmetros dessa função são &lt;em&gt;primeiro_nome&lt;/em&gt; e &lt;em&gt;ultimo_nome&lt;/em&gt;, ambos aceitam strings como entrada, mas imagine que, por um motivo de força maior (pense nessa situação como algo para mérito de compreensão) a entrada seja do tipo booleano (True/False), nesse caso teríamos um erro e gostaríamos que o sistema reportasse essa mensagem de erro para nós. E é para isso, que temos esse módulo no python.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vamos abordar o exemplo acima de forma pratica&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crie uma pasta para armazenar nosso codigo;&lt;/li&gt;
&lt;li&gt;Crie um arquivo chamado &lt;em&gt;app.py&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dentro do nosso arquivo &lt;em&gt;app.py&lt;/em&gt; iremos importar o módulo &lt;em&gt;logging&lt;/em&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Feito isso, iremos definir a formatação do nosso log:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="sh"&gt;'''&lt;/span&gt;&lt;span class="s"&gt;
   A formatação abaixo permite personalizarmos
   a forma como o log será mostrado para nós.
&lt;/span&gt;&lt;span class="sh"&gt;'''&lt;/span&gt;
&lt;span class="c1"&gt;# DateTime:Level:Arquivo:Mensagem
&lt;/span&gt;&lt;span class="n"&gt;log_format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%(asctime)s:%(levelname)s:%(filename)s:%(message)s&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Em seguida, definiremos as configurações do log e sua instancia:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="sh"&gt;'''&lt;/span&gt;&lt;span class="s"&gt;
   Aqui definimos as configurações do modulo.

   filename = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;nome do arquivo em que vamos salvar a mensagem do log.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;
   filemode = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;É a forma em que o arquivo será gravado.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;
   level = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Level em que o log atuará&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;
   format = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Formatação da mensagem do log&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;span class="sh"&gt;'''&lt;/span&gt;
&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;exemplo.log&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="c1"&gt;# w -&amp;gt; sobrescreve o arquivo a cada log
&lt;/span&gt;                    &lt;span class="c1"&gt;# a -&amp;gt; não sobrescreve o arquivo
&lt;/span&gt;                    &lt;span class="n"&gt;filemode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;log_format&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="sh"&gt;'''&lt;/span&gt;&lt;span class="s"&gt;
   O objeto getLogger() permite que retornemos
   varias instancias de logs.
&lt;/span&gt;&lt;span class="sh"&gt;'''&lt;/span&gt;
&lt;span class="c1"&gt;# Instancia do objeto getLogger()
&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;root&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;O módulo contém varios tipos de niveis de mensagens:&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;colgroup&gt;
&lt;col&gt;
&lt;col&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;p&gt;Level&lt;/p&gt;&lt;/th&gt;
&lt;th&gt;&lt;p&gt;Numeric value&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;p&gt;&lt;code&gt;&lt;span class="pre"&gt;CRITICAL&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;50&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;p&gt;&lt;code&gt;&lt;span class="pre"&gt;ERROR&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;40&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;p&gt;&lt;code&gt;&lt;span class="pre"&gt;WARNING&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;30&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;p&gt;&lt;code&gt;&lt;span class="pre"&gt;INFO&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;20&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;p&gt;&lt;code&gt;&lt;span class="pre"&gt;DEBUG&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;10&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;p&gt;&lt;code&gt;&lt;span class="pre"&gt;NOTSET&lt;/span&gt;&lt;/code&gt;&lt;/p&gt;&lt;/td&gt;
&lt;td&gt;&lt;p&gt;0&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Até aqui definimos as configurações do nosso log, agora vamos colocar isso tudo em pratica, de fato.&lt;/p&gt;

&lt;p&gt;Vamos fazer uma função que receba o &lt;em&gt;primeiro_nome&lt;/em&gt; e o &lt;em&gt;segundo_nome&lt;/em&gt; de uma pessoa e retorne o log dessa função no nosso arquivo &lt;em&gt;exemplo.log&lt;/em&gt; (definido logo acima):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;primeiro_nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;segundo_nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
        Essa função recebe o primeiro nome e o segundo nome de uma pessoa e retorna o nome completo dela.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="c1"&gt;# Aqui, verificamos se os parametros passados são do tipo string (str)
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;primeiro_nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;segundo_nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;primeiro_nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;segundo_nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;primeiro_nome&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;segundo_nome&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;primeiro_nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; type: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;primeiro_nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;segundo_nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; type: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;segundo_nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Segue nosso codigo completo:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;


&lt;span class="sh"&gt;'''&lt;/span&gt;&lt;span class="s"&gt;
   A formatação abaixo permite personalizarmos
   a forma como o log será mostrado para nós.
&lt;/span&gt;&lt;span class="sh"&gt;'''&lt;/span&gt;
&lt;span class="c1"&gt;# DateTime:Level:Arquivo:Mensagem
&lt;/span&gt;&lt;span class="n"&gt;log_format&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%(asctime)s:%(levelname)s:%(filename)s:%(message)s&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="sh"&gt;'''&lt;/span&gt;&lt;span class="s"&gt;
   Aqui definimos as configurações do modulo.

   filename = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;nome do arquivo em que vamos salvar a mensagem do log.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;
   filemode = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;É a forma em que o arquivo será gravado.&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;
   level = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Level em que o log atuará&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;
   format = &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Formatação da mensagem do log&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;
&lt;/span&gt;&lt;span class="sh"&gt;'''&lt;/span&gt;
&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filename&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;exemplo.log&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="c1"&gt;# w -&amp;gt; sobrescreve o arquivo a cada log
&lt;/span&gt;                    &lt;span class="c1"&gt;# a -&amp;gt; não sobrescreve o arquivo
&lt;/span&gt;                    &lt;span class="n"&gt;filemode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;log_format&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="sh"&gt;'''&lt;/span&gt;&lt;span class="s"&gt;
   O objeto getLogger() permite que retornemos
   varias instancias de logs.
&lt;/span&gt;&lt;span class="sh"&gt;'''&lt;/span&gt;
&lt;span class="c1"&gt;# Instancia do objeto getLogger()
&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;root&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fullname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;primeiro_nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;segundo_nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
        Essa função recebe o primeiro nome e o segundo nome de uma pessoa e retorna o nome completo dela.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;

    &lt;span class="c1"&gt;# Aqui, verificamos se os parametros passados são do tipo string (str)
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;primeiro_nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;segundo_nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;primeiro_nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;segundo_nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;primeiro_nome&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;segundo_nome&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;primeiro_nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; type: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;primeiro_nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; - &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;segundo_nome&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; type: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;type&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;segundo_nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nf"&gt;fullname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Wendrew&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Oliveira&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;fullname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Wendrew&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;O retorno desse codigo ficará dentro do arquivo &lt;em&gt;exemplo.log&lt;/em&gt; no mesmo caminho do arquivo &lt;em&gt;app.py&lt;/em&gt; e terá a seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs6jnwumln9pjoq2yupoy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fs6jnwumln9pjoq2yupoy.png" alt="log"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse é o modo mais convencional de retorno de mensagens aos desenvolvedores, quando o sistema ja esta em produção&lt;/p&gt;

</description>
      <category>python</category>
      <category>logging</category>
      <category>linux</category>
      <category>programming</category>
    </item>
    <item>
      <title>Flask Command Line Interface</title>
      <dc:creator>DrxwHe4rt</dc:creator>
      <pubDate>Thu, 31 Dec 2020 14:55:48 +0000</pubDate>
      <link>https://dev.to/wendrewdevelop/flask-command-line-interface-18e4</link>
      <guid>https://dev.to/wendrewdevelop/flask-command-line-interface-18e4</guid>
      <description>&lt;p&gt;Nesse artigo, iremos explorar o CLI do micro-framework flask. Para quem não conhece, o flask é um framework web, está para o python assim como o express está para o node.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Entendendo o CLI...&lt;/b&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ao instalar do Flask, automaticamente, será instalado uma interface de linha de comando &lt;i&gt;Click&lt;/i&gt;, em seu virtualenv (ambiente virtual);&lt;/li&gt;
&lt;li&gt;Click é um pacote feito para criar comandos personalizados para sua aplicação Flask escrevendo o minimo possivel.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Semelhante aos comandos que o framework django possui para criar super-usuarios, criar apps, etc. o Click possibilita fazermos isso e o melhor é que podemos ir além e criar nossos proprios comandos, agilizando o desenvolvimento de nossos projetos.&lt;/p&gt;

&lt;h1&gt;
  
  
  Dependencias
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Virtualenv&lt;/li&gt;
&lt;li&gt;Flask&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;b&gt;OBS:&lt;/b&gt; &lt;i&gt;Irei partir da premissa de que você ja esta familiarizado com a configuração do ambiente e instalação das dependencias.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Sua estrutura de pastas deve ficar parecida com a minha:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7TxC1SOW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8ef9y9n0jlywzpqpng5t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7TxC1SOW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/8ef9y9n0jlywzpqpng5t.png" alt="pastas"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Dentro do arquivo &lt;i&gt;__ init __.py&lt;/i&gt; escreva o codigo da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="c1"&gt;# flask imports
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_app&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="s"&gt;'''
        Função para criar um aplicativo Flask
    '''&lt;/span&gt;

    &lt;span class="c1"&gt;# Instanciando a o objeto Flask()
&lt;/span&gt;    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# retornando o objeto app
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, dentro do arquivo &lt;i&gt;settings.py&lt;/i&gt; iremos criar o nosso comando. O mesmo será responsável por criar apps em nossa aplicação, sem precisarmos criar arquivo por arquivo.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Contextualizando...&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Como flask é um micro-framework, o mesmo vem apenas com o basico para criarmos uma aplicação web, dessa forma, não temos tantas ferramentas prontas, como o django, por exemplo. No django, ao executarmos o comando &lt;i&gt;django-admin startapp &lt;/i&gt; criamos uma app dentro do diretorio em que você esta, contendo dentro dessa app os arquivos necessários para que possamos trabalhar, agilizando o processo de criação de nossa aplicação.&lt;/p&gt;

&lt;p&gt;Dito isso, iremos fazer algo parecido para nossa aplicação flask, sem muita complexidade e de forma intuitiva, para que vocês possam ver como funciona o CLI do Flask.&lt;/p&gt;

&lt;p&gt;Dessa forma, dentro do arquivo &lt;i&gt;settings.py&lt;/i&gt;, iremos inserir o seguinte codigo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# python imports
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;

&lt;span class="c1"&gt;# flask imports
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;click&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Blueprint&lt;/span&gt;


&lt;span class="c1"&gt;# Registrando blueprint
&lt;/span&gt;&lt;span class="n"&gt;bp_settings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Blueprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'settings'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;bp_settings&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"startapp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;@&lt;/span&gt;&lt;span class="n"&gt;click&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_folder_app&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="s"&gt;'''
        Essa função cria uma app dentro
        do projeto, ja com os arquivos
        necessarios para trabalhar.

        Exemplo: flask startapp &amp;lt;nome_da_app&amp;gt;

        Dentro da pasta contém os arquivos: 
            - '__init__.py' -&amp;gt; arquivo __init__.py 
            dentro de um subdiretório será sempre o 
            primeiro a ser executado quando um módulo 
            dentro deste subdiretório for chamado;

            - 'views.py' -&amp;gt; arquivo responsavel por
            conter a logica de cada app;

            - 'models.py' -&amp;gt; arquivo que contém uma classe
            que abstrai em modelo uma tabela do banco de dados;

            - 'forms.py' -&amp;gt; arquivo que pode ser usado
            para abstrair os forms HTML, utilizando a 
            lib Flask-WTForms.

        Foi utilizado a função click do 
        flask, responsável por criar
        comandos e argumentos para a 
        aplicação.
    '''&lt;/span&gt;

    &lt;span class="c1"&gt;# Atribuindo o argumento recebido
&lt;/span&gt;    &lt;span class="c1"&gt;# na variavel "name"
&lt;/span&gt;    &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Acessando a pasta 'app'
&lt;/span&gt;        &lt;span class="n"&gt;here&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__file__&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

        &lt;span class="c1"&gt;# Setando o caminho e o nome
&lt;/span&gt;        &lt;span class="c1"&gt;# dos arquivos que serão criados
&lt;/span&gt;        &lt;span class="n"&gt;filepath_init&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;here&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'__init__.py'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;filepath_views&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;here&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'views.py'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;filepath_models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;here&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'models.py'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;filepath_forms&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;here&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'forms.py'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Criando pasta
&lt;/span&gt;        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;here&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Criando os arquivos
&lt;/span&gt;            &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath_init&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath_views&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath_models&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filepath_forms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;'w'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'App criada com sucesso'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;IOError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;IsADirectoryError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resumidamente, o codigo acima cria uma app dentro da pasta app do projeto, contendo os arquivos comumente usados, sendo eles, &lt;i&gt;__ init __.py&lt;/i&gt;, &lt;i&gt;views.py&lt;/i&gt;, &lt;i&gt;models.py&lt;/i&gt;, &lt;i&gt;forms.py&lt;/i&gt;.&lt;/p&gt;

&lt;p&gt;Agora, vamos voltar para nosso arquivo &lt;i&gt;__ init __.py&lt;/i&gt; e adicionar o seguinte trecho de código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
 &lt;span class="c1"&gt;# flask custom commands
&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app_context&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
     &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;.settings&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_folder_app&lt;/span&gt;
     &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_folder_app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O arquivo &lt;i&gt;__ init __.py&lt;/i&gt; completo ficará assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;
&lt;span class="c1"&gt;# flask imports
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;flask&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;create_app&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="s"&gt;'''
        Função para criar um aplicativo Flask
    '''&lt;/span&gt;

    &lt;span class="c1"&gt;# Instanciando a o objeto Flask()
&lt;/span&gt;    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Flask&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# flask custom commands
&lt;/span&gt;    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;app_context&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;.settings&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;create_folder_app&lt;/span&gt;
        &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cli&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;create_folder_app&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# retornando o objeto app
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, vamos exportar nossas variaveis de ambiente, para que a aplicação flask funcione corretamente. Siga os passos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em seu terminal, dentro da pasta &lt;b&gt;projeto&lt;/b&gt;, digite consecutivamente:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FLASK_APP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;project
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FLASK_ENV&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Development
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;FLASK_DEBUG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;True
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isso, ja podemos executar o seguinte comando no terminal, para, de fato, utilizarmos nosso comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flask startapp projeto/usuarios 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando acima irá criar nossa app dentro da pasta projeto.&lt;/p&gt;

&lt;p&gt;Após executar o mesmo, a seguinte ordenação de pasta será criada:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9NJUQe_6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/663q21c8liahgcrpcplo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9NJUQe_6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/663q21c8liahgcrpcplo.png" alt="pastas2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto, agora ja conseguimos agilizar um de nossos procedimentos diarios no desenvolvimento de uma aplicação flask.&lt;/p&gt;

&lt;h1&gt;
  
  
  Considerações finais
&lt;/h1&gt;

&lt;p&gt;O intuito desse artigo foi mostrar a liberdade que temos com o flask e o quanto o mesmo é expansível a modo de facilitar a nossa vida no dia a dia.&lt;/p&gt;

</description>
      <category>python</category>
      <category>flask</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>100 days of code — Dia 13</title>
      <dc:creator>DrxwHe4rt</dc:creator>
      <pubDate>Mon, 30 Nov 2020 21:38:07 +0000</pubDate>
      <link>https://dev.to/wendrewdevelop/100-days-of-code-dia-13-3ihn</link>
      <guid>https://dev.to/wendrewdevelop/100-days-of-code-dia-13-3ihn</guid>
      <description>&lt;h2&gt;(30/11/2020)&lt;/h2&gt;

&lt;p&gt;[Nos finalmente...]&lt;/p&gt;

&lt;p&gt;Esse semana, provavelmente, estaremos finalizando o projeto e hospedando o mesmo. Foi um mês de desenvolvimento e o conteudo pedido esta sendo entregue na data regulamentar, agora só temos que alinhar alguns detalhes e decidir a melhor hospedagem para o sistema.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terminei de ler o livro do Machado de Assis (O alienista) e o livro "o que é o racismo". Deixarei para ler o livro "Uma carta de amor" futuramente, então irei retira-lo da lista de livros que estou lendo e começarei a ler o livro "histórias sobre ética".&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;O que é racismo: 82/82 páginas;&lt;br&gt;
Histórias sobre ética: 0/12 capitulos;&lt;br&gt;
O Alienista: 13/13 capitulos;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Se hidratem, comam frutas, leiam bastante, a terra não é plana, vacinas salvam vidas e bolsonaro vai tomar no cu.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>productivity</category>
      <category>programming</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>100 days of code — Dia 12</title>
      <dc:creator>DrxwHe4rt</dc:creator>
      <pubDate>Wed, 25 Nov 2020 14:25:59 +0000</pubDate>
      <link>https://dev.to/wendrewdevelop/100-days-of-code-dia-12-4pij</link>
      <guid>https://dev.to/wendrewdevelop/100-days-of-code-dia-12-4pij</guid>
      <description>&lt;h2&gt;(24/11/2020)&lt;/h2&gt;

&lt;p&gt;[ideia bem pensada, ideia bem executado...]&lt;/p&gt;

&lt;p&gt;Em contra-partida, ao dia anterior, hoje, tivemos a ideia de fazer tudo em apenas um lugar e fazer tudo dinamico, de uma forma que, se o usuário for funcionario, terá acesso basico ao ponto eletronico, ou seja, irá apenas registrar o ponto. Porém se for supervisor/diretor, também terá a funcionalidade de aprovar/reprovar os pontos de cada funcionario e organizar todo o setor.&lt;/p&gt;

&lt;p&gt;Podemos dizer que, 90% da tela esta finalizada!&lt;/p&gt;

&lt;p&gt;Hoje , também não li nada :(&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O que é racismo: 40/82 páginas;&lt;br&gt;
Uma carta de amor: 0/9 capitulos;&lt;br&gt;
O Alienista: 5/13 capitulos;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Se hidratem, comam frutas, leiam bastante, a terra não é plana, vacinas salvam vidas e bolsonaro vai tomar no cu.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>productivity</category>
      <category>programming</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>100 days of code — Dia 11</title>
      <dc:creator>DrxwHe4rt</dc:creator>
      <pubDate>Wed, 25 Nov 2020 14:16:10 +0000</pubDate>
      <link>https://dev.to/wendrewdevelop/100-days-of-code-dia-11-11b</link>
      <guid>https://dev.to/wendrewdevelop/100-days-of-code-dia-11-11b</guid>
      <description>&lt;p&gt;(23/11/2020)&lt;br&gt;
[ideia mal pensada, ideia mal executada...]&lt;/p&gt;

&lt;p&gt;Juntamente ao cliente, tivemos a ideia de criar duas telas, uma para o funcionario bater o ponto e outra de uso restrito aos supervisores do setor/diretores, na qual os mesmos poderiam validar os horarios de ponto de cada funcionario e validar/invalidar cada ponto, adicionar comentario, etc. O que não havíamos pensado é que tudo isso poderia ser feito em apenas um lugar, além de economizar processamento, gastaríamos muito menos tempo, porém, todavia, entretanto, só fui perceber isso dps de finalizar quase tudo, mas nesse ponto, ja havia perdido um dia de trabalho. Na realidade, eu prefiro dizer que foi conhecimento adquirido...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aBoOTErz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/h94cgbwj61wv4dldnw93.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aBoOTErz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/h94cgbwj61wv4dldnw93.jpeg" alt="brainstorm"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Esse foi o resumo do que eu tenho planejado até quarta-feira para fazer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sobre minha leitura, li 5 capítulos do livro do Machado de Assis (O Alienista).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O que é racismo: 40/82 páginas;&lt;br&gt;
Uma carta de amor: 0/9 capitulos;&lt;br&gt;
O Alienista: 5/13 capitulos;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Se hidratem, comam frutas, leiam bastante, a terra não é plana, vacinas salvam vidas e bolsonaro vai tomar no cu.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>productivity</category>
      <category>programming</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>100 days of code — Dia 10</title>
      <dc:creator>DrxwHe4rt</dc:creator>
      <pubDate>Wed, 25 Nov 2020 13:57:34 +0000</pubDate>
      <link>https://dev.to/wendrewdevelop/100-days-of-code-dia-10-545b</link>
      <guid>https://dev.to/wendrewdevelop/100-days-of-code-dia-10-545b</guid>
      <description>&lt;h2&gt;(20/11/2020)&lt;/h2&gt;

&lt;p&gt;[Batendo ponto!]&lt;/p&gt;

&lt;p&gt;Na sexta-feira, comecei a desenvolver a App que será responsável por gerenciar os horarios de entrada/almoço/saida dos funcionarios. Com certeza será a parte mais importante do sistema.&lt;/p&gt;

&lt;p&gt;Apenas estruturei a ideia e conversei com o cliente sobre como tudo irá funcionar, abordamos alguns exemplos, passei algumas idéias e chegamos a um ponto final, sobre esse módulo do sistema.&lt;/p&gt;

&lt;p&gt;Hoje, infelizmente, não li nada :(&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O que é racismo: 40/82 páginas;&lt;br&gt;
Uma carta de amor: 0/9 capitulos;&lt;br&gt;
O Alienista: 0/13 capitulos;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Se hidratem, comam frutas, leiam bastante, a terra não é plana, vacinas salvam vidas e bolsonaro vai tomar no cu.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>productivity</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>100 days of code — Dia 9</title>
      <dc:creator>DrxwHe4rt</dc:creator>
      <pubDate>Fri, 20 Nov 2020 19:01:15 +0000</pubDate>
      <link>https://dev.to/wendrewdevelop/100-days-of-code-dia-9-7pe</link>
      <guid>https://dev.to/wendrewdevelop/100-days-of-code-dia-9-7pe</guid>
      <description>&lt;h2&gt;(19/11/2020)&lt;/h2&gt;

&lt;p&gt;[Terminei o calendario]&lt;/p&gt;

&lt;p&gt;Finalmente terminei o calendario, cara que trabalho sensacional, dediquei cada segundo dessa semana de trabalho para desenvolver algo do zero (quem sabe eu não disponibilizo um modulo disse só no github). Porém, como dito, foi preciso dedicar cada segundo de trabalho, ontem, por exemplo, fiquei das 9hrs da manhã até as 21hrs da noite trabalhando (não se preocupe, eu sei que não é ideal).&lt;/p&gt;

&lt;p&gt;Em segundo plano, estou estudando Emacs, pois que fazer uma integração com Emacs + python, mas esse assunto fica para um proximo artigo.&lt;/p&gt;

&lt;p&gt;A novidade é que terminei de ler o livro sapiens que, por sinal, foi um dos melhores livros que ja li em toda a minha vida. Acrescentei mais dois livros para a lista de livros que estou lendo no momento, segue atualização abaixo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sapiens: 428/428 páginas;&lt;br&gt;
O que é racismo: 40/82 páginas;&lt;br&gt;
Uma carta de amor: 0/9 capitulos;&lt;br&gt;
O Alienista: 0/13 capitulos;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;O livro "Uma carta de amor" é um romance do escritor Nicholas Sparks, é a primeira vez que leio romance;&lt;/li&gt;
&lt;li&gt;"O Alienista" é um classico do Machado de assis, que eu queria ler a muuuuuuuuito tempo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pi8jk0dm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/olxn95prpsiyc8sn7l8g.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pi8jk0dm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/olxn95prpsiyc8sn7l8g.jpeg" alt="02a755fa-6075-4b2e-973a-c5aeb35bc466"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Se hidratem, comam frutas, leiam bastante, a terra não é plana, vacinas salvam vidas e bolsonaro vai tomar no cu.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>productivity</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>100 days of code — Dia 8</title>
      <dc:creator>DrxwHe4rt</dc:creator>
      <pubDate>Thu, 19 Nov 2020 01:45:42 +0000</pubDate>
      <link>https://dev.to/wendrewdevelop/100-days-of-code-dia-8-fp9</link>
      <guid>https://dev.to/wendrewdevelop/100-days-of-code-dia-8-fp9</guid>
      <description>&lt;h2&gt;(18/11/2020)&lt;/h2&gt;

&lt;p&gt;[fullcalendar + django]&lt;/p&gt;

&lt;p&gt;Hoje, trabalhei com algo que não havia usado antes, utilizei o FullCalendar, que é um conjunto de ferramentas em javascript para trabalhar com calendários. Fiz uma integração com o framework Django, onde o django ficou responsavel por gerenciar as views e com js fiz as funções para consumir o retorno das views. Como eu não havia feito esse tipo de integração antes, acabou tomando meu dia todo, mas ainda consegui ler um pouco, assim que acordei de manhã. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sapiens: 386/428 páginas;&lt;br&gt;
O que é racismo: 40/82 páginas;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Se hidratem, comam frutas, leiam bastante, a terra não é plana, vacinas salvam vidas e bolsonaro vai tomar no cu.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>productivity</category>
      <category>100daysofcode</category>
    </item>
    <item>
      <title>100 days of code — Dia 7</title>
      <dc:creator>DrxwHe4rt</dc:creator>
      <pubDate>Tue, 17 Nov 2020 21:01:15 +0000</pubDate>
      <link>https://dev.to/wendrewdevelop/100-days-of-code-dia-7-30fh</link>
      <guid>https://dev.to/wendrewdevelop/100-days-of-code-dia-7-30fh</guid>
      <description>&lt;h2&gt;(17/11/2020)&lt;/h2&gt;

&lt;p&gt;[Hoje foi super produtivo]&lt;/p&gt;

&lt;p&gt;Hoje tive um daqueles dias em que acordamos inspirados. Consegui aplicar todas as regras de negocio do sistema e agora os usuários estão 100% separados por tipos (explicados em um dos artigos anteriores) e, agora também estão, separados por grupos (os grupos são, nesse caso, as empresas. Cada usuário terá um grupo, ou seja, cada usuário fara parte de um grupo. É uma relação de varios usuários para um grupo).&lt;/p&gt;

&lt;p&gt;Ainda não li os livros hoje, mas segue abaixo como esta a leitura:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sapiens: 361/428 páginas;&lt;br&gt;
O que é racismo: 40/82 páginas;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A partir de amanhã, começarei a desenvolver a agenda da aplicação e será uma parte muito desafiadora pra mim, pois nunca desenvolvi uma agenda. Então, é isso!&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Se hidratem, comam frutas, leiam bastante, a terra não é plana, vacinas salvam vidas e bolsonaro vai tomar no cu.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>programming</category>
      <category>productivity</category>
      <category>100daysofcode</category>
    </item>
  </channel>
</rss>
