lbxtoolkit 2.0.4__tar.gz → 2.0.5__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lbxtoolkit
3
- Version: 2.0.4
3
+ Version: 2.0.5
4
4
  Summary: Biblioteca de ferramentas LBX S/A
5
5
  Author: Cristiano P. Ferrari
6
6
  Author-email: boxferrari@gmail.com
@@ -52,6 +52,7 @@ Esta biblioteca possui ferramentas de uso recorrente para interação com banco
52
52
  - _.print_: Contorna o manipulador de log e imprime diretamente na tela (stdout), sem formatar a mensagem nem registrar no arquivo
53
53
  - _.debug, .info, .aviso, .erro, .critico_: Classifica as mensagens por nível de severidade/relevância e rediciona a saída (arquivo, tela, tela+arquivo) conforme a configuração do nível
54
54
  - _.stop_logging_: Interrompe a manipulação das saídas pelo logger e restaura as saídas padrão (stdout/stderr) para a tela
55
+ - _.filtra_: Filtra os eventos do arquivo de log registrados em um intervalo de tempo específico
55
56
 
56
57
  **misc**: Classe de miscelâneas/diversos
57
58
  - _.seleciona_arquivo_: Abre um picker do sistema operacionar para selecionar um *arquivo* e retorna seu path
@@ -321,7 +322,7 @@ Para uso em APIs com autenticação JWT (JSON Web Token), OAuth, Bearer Token Au
321
322
 
322
323
  #### Classe **lbx_logger**
323
324
 
324
- Essa classe tem o propósito de manipular e formatar as mensagens de saída do script, alterando o formato e redirecionando destino padrão (stdout e stderr) para uma combinação de tela e/ou arquivo.
325
+ Essa classe requer a importação do módulo `logging` no script em que for instanciada e tem o propósito de manipular/formatar as mensagens de saída do script, alterando o formato e redirecionando destino padrão (stdout e stderr) para uma combinação de tela e/ou arquivo.
325
326
 
326
327
  O comportamento padrão é registrar todas as saídas *simultaneamente* em tela e no arquivo com endereço informado no parâmetro `log_file_path`. Se este parametro for omisso no instanciamento da classe, as mensagens serão exibidas apenas na tela.
327
328
 
@@ -349,7 +350,7 @@ Os parametros para o instanciamento da classe são:
349
350
  - `ignore_console` Lista com os níveis de severidade a serem ignorados para *apresentação na tela*, registrando *apenas no arquivo* (quando informado no parametro `log_file_path`) e obedecendo ao nível mínimo estabelecido no parametro `log_level`. Note que omitir o parametro `log_file_path` e incluir um nível na lsita `ignore_console` implica em ignorar/suprimir esse nível de mensagem de qualquer apresentação.
350
351
  - `ignore_file` Mesma lógica do parametro `ignore_console`, mas com lógica invertida: suprime o registro do nível do arquivo e demonstra *apenas na tela*.
351
352
 
352
- As mensagem são manipuladas substituindo-se o comando `print()` pela chamada a um dos 5 métodos acima (_.add(), .debug(), .info(), .aviso(), .erro(), .critico()_). Exceto o método `.add()`, qualquer um dos demais métodos pode interromper a execução do script, através da passagem do parâmetro `exit`. Ao informar esse parametro na chamadada do método, atribua a ele o código de saída desejado (0 para normal, qualquer outro número para saída com erro). Exemplo:
353
+ 1) As mensagem são manipuladas substituindo-se o comando `print()` pela chamada a um dos 5 métodos acima (_.add(), .debug(), .info(), .aviso(), .erro(), .critico()_). Exceto o método `.add()`, qualquer um dos demais métodos pode interromper a execução do script, através da passagem do parâmetro `exit`. Ao informar esse parametro na chamadada do método, atribua a ele o código de saída desejado (0 para normal, qualquer outro número para saída com erro). Exemplo:
353
354
 
354
355
  ```
355
356
  log.erro('Essa mensagem apenas resulta em uma mensagem de nível ERROR')
@@ -359,7 +360,7 @@ log.erro('Essa mensagem resulta em uma mensagem de nível ERRO e encerra o scrip
359
360
  Qualquer chamada ao comando `print()`, uma vez instanciado manipulador de log, será registada como uma chamada ao método _.info()_ e registrada com este nível de severidade.
360
361
  Para retornar ao comportamente padrão do comando print, ou interromper o manipulador, faça chamada ao método `.stop_logging()`
361
362
 
362
- O método _.add()_ não exibe/grava imediatamente a mensagem, mas apenas a diciona a _buffer_. Todas as chamas a _.add()_ irão concatenar a mensagem recebida até a próxima chamada em algum dos níveis _.debug(), .info(), .aviso(), .erro(), .critico()_. Na primeira chama de um destes níveis após uma (ou mais) chamada(s) ao método _.add()_ o *buffer* será concatenado à mensagem recebida por um destes métodos e o resultado será manipulado pelo log conforme os parametros definidos no intanciamento da classe e o método chamado. Essa função é útil para tratar mensagens com retorno condicional. Exemplo:
363
+ 2) O método _.add()_ não exibe/grava imediatamente a mensagem, mas apenas a diciona a _buffer_. Todas as chamas a _.add()_ irão concatenar a mensagem recebida até a próxima chamada em algum dos níveis _.debug(), .info(), .aviso(), .erro(), .critico()_. Na primeira chama de um destes níveis após uma (ou mais) chamada(s) ao método _.add()_ o *buffer* será concatenado à mensagem recebida por um destes métodos e o resultado será manipulado pelo log conforme os parametros definidos no intanciamento da classe e o método chamado. Essa função é útil para tratar mensagens com retorno condicional. Exemplo:
363
364
 
364
365
  ```
365
366
  log.add('Mensagem 1# ') ## não será exibida/registrada
@@ -367,15 +368,26 @@ log.add('Mensagem 2# ') ## não será exibida/registrada
367
368
  log.info('Mensagem 3) ## será exibida/registrada como nível "info" e com texto: "Mensagem 1# Mensagem 2# Mensagem 3"
368
369
  ```
369
370
 
370
- Os métodos que exibem as mensagens (`.debug()`,`.info()`,`.aviso()`, `.erro()`, `.critico()`) possuem 3 parametros: ``message``, `corte=None`, `exit=None`.
371
+ 3) Os métodos que exibem as mensagens (`.debug()`,`.info()`,`.aviso()`, `.erro()`, `.critico()`) possuem 3 parametros: `message`, `corte=None`, `exit=None`.
371
372
 
372
373
  - `message`: posicional e obrigatório. corresponde à mensagem a ser exibida
373
374
  - `corte`: o tamanho máximo da mensagem a ser exibida. opcional e se omitido, exibe a mensagem inteira. se fornecido, corta a mensagem no comprimento informado
374
375
  - `exit`: opcional. se informado (requer um código de retorno), aborta o script com o código informado. se omisso (padrão) a mensagem apenas é minutada pelo log, sem interferir no funcionamento do script
375
376
 
376
- Essa classe requer a importação do módulo `logging` no script em que for instanciada.
377
+ 4) O método `.filtra()` possui 3 parametros posicionais, todos opcionais: `log_file`, `dh_ini`, `dh_fim`.
377
378
 
378
- Exemplos de uso:
379
+ Se os 3 forem omitidos, serão exibidas as entradas de log do arquivo corrente, definido no instanciamento da classe `lbx_logger`, registradas na última hora. Deste modo, o valor padrão para `dh_fim` é `now()` e para `dh_ini` é `now()` menos 1 hora.
380
+
381
+ Caso queira filtrar os registro de outro arquivo de log, que não seja o do script corrente, informe o endereço do arquivo no primeiro parametro.
382
+
383
+ E caso queira alterar alterar o período de filtragem, informe nos parametros 2 e 3 a data/hora de início e fim do período. Estes dois parametros aceitam tanto um objeto do tipo `datetime` como uma string (que será convertida para datetime), desde que ela esteja no formato `dd/mm/aaaa hh:mm:[ss]` (segundos são opcionais).
384
+
385
+ Considerando que os parametros são posicionais, caso queira omitir apenas um dos parametros, preencha a posição do parametro a ser omitido com `None`.
386
+
387
+ A saída dessa função retorna um objeto, que pode ser salvo em disco ou impresso na tela.
388
+
389
+
390
+ 5) Exemplos de uso:
379
391
 
380
392
  ```
381
393
  from lbx_toolkit import lbx_logger
@@ -417,6 +429,34 @@ except Exception as e:
417
429
  log.erro('Essa é uma mensagem de erro e abortará a execução do script', exit=1)
418
430
 
419
431
  log.info('Essa mensagem não será exibida pois o script foi abortado na mensagem anterior')
432
+
433
+ # obtem os registros de log da última hora (comportamento padrão)
434
+ filtra_log = log.search()
435
+
436
+ # obtem os registros das últimas 6 horas
437
+ ultimas_6h = datetime.datetime.now() - datetime.timedelta(hours=6) ## carimbo de tempo de 6 horas atrás !!! requer>> import datetime
438
+ filtra_log = log.search(None, ultimas_6h) # None no 1º parametro impõe o log do arquivo corrente como padrão (definido em 'LogFile' e apontado no instanciamento da classe)
439
+
440
+ # obtem os registros do dia 14/01/2020 até 3h atrás
441
+ ultimas_3h = datetime.datetime.now() - datetime.timedelta(hours=3) ## carimbo de tempo de 6 horas atrás !!! requer>> import datetime
442
+ filtra_log = log.search(None, '14/01/2020 00:00', ultimas_3h) #
443
+
444
+ # obtem os registros do horário comercial do dia 23/12/2023 do arquivo salvo em C:\temp\outro_arquivo.log
445
+ Outro_Log = Path(r'c:\temp\outro_arquivo.log')
446
+ filtra_log = log.search(Outro_Log, '23/12/2023 08:00', '23/12/2023 18:00') #
447
+
448
+ # salva conteúdo filtrado em um arquivo:
449
+ filtrado = 'filtered_log.txt'
450
+ with open(filtado, 'w', encoding='ISO-8859-1') as output_file: # indique o enconding conforme salvo (UTF-8 ou ISO-8859-1)
451
+ output_file.writelines(filta_log)
452
+
453
+ # mostra o conteúdo filtrado na tela
454
+ print(''.join(filtra_log))
455
+
456
+ # mostra o conteúdo filtrado na tela, listando apenas as os registros do nível "DEBUG"
457
+ for line in filtered_lines:
458
+ if "DEBUG" in line:
459
+ print(line, end='')
420
460
  ```
421
461
 
422
462
  #### Classe **misc**
@@ -29,6 +29,7 @@ Esta biblioteca possui ferramentas de uso recorrente para interação com banco
29
29
  - _.print_: Contorna o manipulador de log e imprime diretamente na tela (stdout), sem formatar a mensagem nem registrar no arquivo
30
30
  - _.debug, .info, .aviso, .erro, .critico_: Classifica as mensagens por nível de severidade/relevância e rediciona a saída (arquivo, tela, tela+arquivo) conforme a configuração do nível
31
31
  - _.stop_logging_: Interrompe a manipulação das saídas pelo logger e restaura as saídas padrão (stdout/stderr) para a tela
32
+ - _.filtra_: Filtra os eventos do arquivo de log registrados em um intervalo de tempo específico
32
33
 
33
34
  **misc**: Classe de miscelâneas/diversos
34
35
  - _.seleciona_arquivo_: Abre um picker do sistema operacionar para selecionar um *arquivo* e retorna seu path
@@ -298,7 +299,7 @@ Para uso em APIs com autenticação JWT (JSON Web Token), OAuth, Bearer Token Au
298
299
 
299
300
  #### Classe **lbx_logger**
300
301
 
301
- Essa classe tem o propósito de manipular e formatar as mensagens de saída do script, alterando o formato e redirecionando destino padrão (stdout e stderr) para uma combinação de tela e/ou arquivo.
302
+ Essa classe requer a importação do módulo `logging` no script em que for instanciada e tem o propósito de manipular/formatar as mensagens de saída do script, alterando o formato e redirecionando destino padrão (stdout e stderr) para uma combinação de tela e/ou arquivo.
302
303
 
303
304
  O comportamento padrão é registrar todas as saídas *simultaneamente* em tela e no arquivo com endereço informado no parâmetro `log_file_path`. Se este parametro for omisso no instanciamento da classe, as mensagens serão exibidas apenas na tela.
304
305
 
@@ -326,7 +327,7 @@ Os parametros para o instanciamento da classe são:
326
327
  - `ignore_console` Lista com os níveis de severidade a serem ignorados para *apresentação na tela*, registrando *apenas no arquivo* (quando informado no parametro `log_file_path`) e obedecendo ao nível mínimo estabelecido no parametro `log_level`. Note que omitir o parametro `log_file_path` e incluir um nível na lsita `ignore_console` implica em ignorar/suprimir esse nível de mensagem de qualquer apresentação.
327
328
  - `ignore_file` Mesma lógica do parametro `ignore_console`, mas com lógica invertida: suprime o registro do nível do arquivo e demonstra *apenas na tela*.
328
329
 
329
- As mensagem são manipuladas substituindo-se o comando `print()` pela chamada a um dos 5 métodos acima (_.add(), .debug(), .info(), .aviso(), .erro(), .critico()_). Exceto o método `.add()`, qualquer um dos demais métodos pode interromper a execução do script, através da passagem do parâmetro `exit`. Ao informar esse parametro na chamadada do método, atribua a ele o código de saída desejado (0 para normal, qualquer outro número para saída com erro). Exemplo:
330
+ 1) As mensagem são manipuladas substituindo-se o comando `print()` pela chamada a um dos 5 métodos acima (_.add(), .debug(), .info(), .aviso(), .erro(), .critico()_). Exceto o método `.add()`, qualquer um dos demais métodos pode interromper a execução do script, através da passagem do parâmetro `exit`. Ao informar esse parametro na chamadada do método, atribua a ele o código de saída desejado (0 para normal, qualquer outro número para saída com erro). Exemplo:
330
331
 
331
332
  ```
332
333
  log.erro('Essa mensagem apenas resulta em uma mensagem de nível ERROR')
@@ -336,7 +337,7 @@ log.erro('Essa mensagem resulta em uma mensagem de nível ERRO e encerra o scrip
336
337
  Qualquer chamada ao comando `print()`, uma vez instanciado manipulador de log, será registada como uma chamada ao método _.info()_ e registrada com este nível de severidade.
337
338
  Para retornar ao comportamente padrão do comando print, ou interromper o manipulador, faça chamada ao método `.stop_logging()`
338
339
 
339
- O método _.add()_ não exibe/grava imediatamente a mensagem, mas apenas a diciona a _buffer_. Todas as chamas a _.add()_ irão concatenar a mensagem recebida até a próxima chamada em algum dos níveis _.debug(), .info(), .aviso(), .erro(), .critico()_. Na primeira chama de um destes níveis após uma (ou mais) chamada(s) ao método _.add()_ o *buffer* será concatenado à mensagem recebida por um destes métodos e o resultado será manipulado pelo log conforme os parametros definidos no intanciamento da classe e o método chamado. Essa função é útil para tratar mensagens com retorno condicional. Exemplo:
340
+ 2) O método _.add()_ não exibe/grava imediatamente a mensagem, mas apenas a diciona a _buffer_. Todas as chamas a _.add()_ irão concatenar a mensagem recebida até a próxima chamada em algum dos níveis _.debug(), .info(), .aviso(), .erro(), .critico()_. Na primeira chama de um destes níveis após uma (ou mais) chamada(s) ao método _.add()_ o *buffer* será concatenado à mensagem recebida por um destes métodos e o resultado será manipulado pelo log conforme os parametros definidos no intanciamento da classe e o método chamado. Essa função é útil para tratar mensagens com retorno condicional. Exemplo:
340
341
 
341
342
  ```
342
343
  log.add('Mensagem 1# ') ## não será exibida/registrada
@@ -344,15 +345,26 @@ log.add('Mensagem 2# ') ## não será exibida/registrada
344
345
  log.info('Mensagem 3) ## será exibida/registrada como nível "info" e com texto: "Mensagem 1# Mensagem 2# Mensagem 3"
345
346
  ```
346
347
 
347
- Os métodos que exibem as mensagens (`.debug()`,`.info()`,`.aviso()`, `.erro()`, `.critico()`) possuem 3 parametros: ``message``, `corte=None`, `exit=None`.
348
+ 3) Os métodos que exibem as mensagens (`.debug()`,`.info()`,`.aviso()`, `.erro()`, `.critico()`) possuem 3 parametros: `message`, `corte=None`, `exit=None`.
348
349
 
349
350
  - `message`: posicional e obrigatório. corresponde à mensagem a ser exibida
350
351
  - `corte`: o tamanho máximo da mensagem a ser exibida. opcional e se omitido, exibe a mensagem inteira. se fornecido, corta a mensagem no comprimento informado
351
352
  - `exit`: opcional. se informado (requer um código de retorno), aborta o script com o código informado. se omisso (padrão) a mensagem apenas é minutada pelo log, sem interferir no funcionamento do script
352
353
 
353
- Essa classe requer a importação do módulo `logging` no script em que for instanciada.
354
+ 4) O método `.filtra()` possui 3 parametros posicionais, todos opcionais: `log_file`, `dh_ini`, `dh_fim`.
354
355
 
355
- Exemplos de uso:
356
+ Se os 3 forem omitidos, serão exibidas as entradas de log do arquivo corrente, definido no instanciamento da classe `lbx_logger`, registradas na última hora. Deste modo, o valor padrão para `dh_fim` é `now()` e para `dh_ini` é `now()` menos 1 hora.
357
+
358
+ Caso queira filtrar os registro de outro arquivo de log, que não seja o do script corrente, informe o endereço do arquivo no primeiro parametro.
359
+
360
+ E caso queira alterar alterar o período de filtragem, informe nos parametros 2 e 3 a data/hora de início e fim do período. Estes dois parametros aceitam tanto um objeto do tipo `datetime` como uma string (que será convertida para datetime), desde que ela esteja no formato `dd/mm/aaaa hh:mm:[ss]` (segundos são opcionais).
361
+
362
+ Considerando que os parametros são posicionais, caso queira omitir apenas um dos parametros, preencha a posição do parametro a ser omitido com `None`.
363
+
364
+ A saída dessa função retorna um objeto, que pode ser salvo em disco ou impresso na tela.
365
+
366
+
367
+ 5) Exemplos de uso:
356
368
 
357
369
  ```
358
370
  from lbx_toolkit import lbx_logger
@@ -394,6 +406,34 @@ except Exception as e:
394
406
  log.erro('Essa é uma mensagem de erro e abortará a execução do script', exit=1)
395
407
 
396
408
  log.info('Essa mensagem não será exibida pois o script foi abortado na mensagem anterior')
409
+
410
+ # obtem os registros de log da última hora (comportamento padrão)
411
+ filtra_log = log.search()
412
+
413
+ # obtem os registros das últimas 6 horas
414
+ ultimas_6h = datetime.datetime.now() - datetime.timedelta(hours=6) ## carimbo de tempo de 6 horas atrás !!! requer>> import datetime
415
+ filtra_log = log.search(None, ultimas_6h) # None no 1º parametro impõe o log do arquivo corrente como padrão (definido em 'LogFile' e apontado no instanciamento da classe)
416
+
417
+ # obtem os registros do dia 14/01/2020 até 3h atrás
418
+ ultimas_3h = datetime.datetime.now() - datetime.timedelta(hours=3) ## carimbo de tempo de 6 horas atrás !!! requer>> import datetime
419
+ filtra_log = log.search(None, '14/01/2020 00:00', ultimas_3h) #
420
+
421
+ # obtem os registros do horário comercial do dia 23/12/2023 do arquivo salvo em C:\temp\outro_arquivo.log
422
+ Outro_Log = Path(r'c:\temp\outro_arquivo.log')
423
+ filtra_log = log.search(Outro_Log, '23/12/2023 08:00', '23/12/2023 18:00') #
424
+
425
+ # salva conteúdo filtrado em um arquivo:
426
+ filtrado = 'filtered_log.txt'
427
+ with open(filtado, 'w', encoding='ISO-8859-1') as output_file: # indique o enconding conforme salvo (UTF-8 ou ISO-8859-1)
428
+ output_file.writelines(filta_log)
429
+
430
+ # mostra o conteúdo filtrado na tela
431
+ print(''.join(filtra_log))
432
+
433
+ # mostra o conteúdo filtrado na tela, listando apenas as os registros do nível "DEBUG"
434
+ for line in filtered_lines:
435
+ if "DEBUG" in line:
436
+ print(line, end='')
397
437
  ```
398
438
 
399
439
  #### Classe **misc**
@@ -25,6 +25,7 @@ import re
25
25
  from unicodedata import normalize
26
26
  import pygetwindow as gw
27
27
  import ctypes
28
+ import datetime
28
29
 
29
30
  locale.setlocale(locale.LC_ALL, 'pt_BR.UTF-8')
30
31
 
@@ -579,10 +580,11 @@ class lbx_logger: # Classe para gerenciar a saída para log
579
580
  self.logger = logging.getLogger(self.modulo)
580
581
  self.logger.setLevel(log_level)
581
582
  self.msg = ''
583
+ self.log_file_path = log_file_path
582
584
 
583
585
  if log_file_path:
584
586
  # Criando um handler para escrever em um arquivo de log
585
- file_handler = logging.FileHandler(log_file_path)
587
+ file_handler = logging.FileHandler(self.log_file_path)
586
588
  file_handler.setLevel(log_level) # Sempre registrar tudo no arquivo
587
589
 
588
590
  # Criando um handler para exibir no console
@@ -693,6 +695,85 @@ class lbx_logger: # Classe para gerenciar a saída para log
693
695
  handler.close()
694
696
  self.logger.removeHandler(handler)
695
697
 
698
+ def filtra(self, log_file, dh_ini, dh_fim):
699
+ # Validar parametros de entrada
700
+ if dh_ini:
701
+ if not isinstance(dh_ini, datetime.datetime):
702
+ if not re.fullmatch(r'([0-3][0-9]/[0-1][0-2]/[1-2][0-9]{3} [0-2][0-9]\:[0-6][0-9])(\:[0-6][0-9]){0,1}', dh_ini):
703
+ self.logger.error(f'Data/Hora início {dh_ini} em formato inválido. Informe um objeto do tipo "datetime" ou uma string no formato "dd/mm/aaaa hh:mm:[ss]"')
704
+ return None
705
+ elif len(dh_ini) == 16: # Formato 'dd/mm/yyyy hh:mm'
706
+ dh_ini += ":00"
707
+ try:
708
+ self.inicio = datetime.datetime.strptime(dh_ini, '%d/%m/%Y %H:%M:%S')
709
+ except:
710
+ self.logger.error(f'Data/Hora início {dh_ini} em formato inválido. Informe um objeto do tipo "datetime" ou uma string no formato "dd/mm/aaaa hh:mm:[ss]"')
711
+ return None
712
+ else:
713
+ self.inicio = dh_ini
714
+ else:
715
+ self.inicio = datetime.datetime.now() - datetime.timedelta(hours=1) ## assume a última hora como intervalo, se omisso
716
+
717
+ if dh_fim:
718
+ if not isinstance(dh_fim, datetime.datetime):
719
+ if not re.fullmatch(r'([0-3][0-9]/[0-1][0-2]/[1-2][0-9]{3} [0-2][0-9]\:[0-6][0-9])(\:[0-6][0-9]){0,1}', dh_ini):
720
+ self.logger.error(f'Data/Hora fim {dh_fim} em formato inválido. Informe um objeto do tipo "datetime" ou uma string no formato "dd/mm/aaaa hh:mm:[ss]"')
721
+ return None
722
+ elif len(dh_fim) == 16: # Formato 'dd/mm/yyyy hh:mm'
723
+ dh_fim += ":00"
724
+ try:
725
+ self.fim = datetime.datetime.strptime(dh_fim, '%d/%m/%Y %H:%M:%S')
726
+ except:
727
+ self.logger.error(f'Data/Hora fim {dh_fim} em formato inválido. Informe um objeto do tipo "datetime" ou uma string no formato "dd/mm/aaaa hh:mm:[ss]"')
728
+ return None
729
+ else:
730
+ self.fim = dh_fim
731
+ else:
732
+ self.fim = datetime.datetime.now() ## assume a última hora como intervalo, se omisso
733
+
734
+ if not log_file and not self.log_file_path:
735
+ self.logger.critical('Nenhum arquivo de log disponível. Log desta instância configurado apenas para exibição em tela, sem registro em arquivo')
736
+ return None
737
+ elif not log_file and self.log_file_path:
738
+ log_file_path = self.log_file_path
739
+ elif log_file:
740
+ if Path(log_file).is_file():
741
+ log_file_path = log_file
742
+ else:
743
+ self.logger.critical(f'Arquivo de log {log_file} não existe!')
744
+ return None
745
+ else:
746
+ self.logger.critical('Erro validação arquivo de entrada. Abortando!')
747
+ return None
748
+
749
+ # Função para verificar se a linha está dentro do intervalo de tempo
750
+ def is_within_time_range(timestamp, dh_inicio, dh_fim):
751
+ return dh_inicio <= timestamp <= dh_fim
752
+
753
+ # Ler e filtrar o arquivo de log com a codificação ISO-8859-1
754
+ with open(log_file_path, 'r', encoding='ISO-8859-1') as log_file:
755
+ log_lines = log_file.readlines()
756
+
757
+ # Variável para armazenar o último timestamp válido
758
+ last_valid_timestamp = None
759
+ filtered_lines = []
760
+
761
+ for line in log_lines:
762
+ try:
763
+ # Extraia a data e a hora da linha
764
+ timestamp_str = line.split()[0] + " " + line.split()[1]
765
+ timestamp = datetime.datetime.strptime(timestamp_str, '%Y-%m-%d %H:%M:%S,%f')
766
+ last_valid_timestamp = timestamp
767
+ if is_within_time_range(timestamp, self.inicio, self.fim):
768
+ filtered_lines.append(line)
769
+ except Exception as e:
770
+ # Caso a linha não tenha um carimbo de tempo, use o último timestamp válido
771
+ if last_valid_timestamp and is_within_time_range(last_valid_timestamp, self.inicio, self.fim):
772
+ filtered_lines.append(line)
773
+
774
+ # Retornar o objeto contendo as linhas filtradas
775
+ return filtered_lines
776
+
696
777
  class misc: # Classe de miscelâneas
697
778
  def __init__(self):
698
779
  return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lbxtoolkit
3
- Version: 2.0.4
3
+ Version: 2.0.5
4
4
  Summary: Biblioteca de ferramentas LBX S/A
5
5
  Author: Cristiano P. Ferrari
6
6
  Author-email: boxferrari@gmail.com
@@ -52,6 +52,7 @@ Esta biblioteca possui ferramentas de uso recorrente para interação com banco
52
52
  - _.print_: Contorna o manipulador de log e imprime diretamente na tela (stdout), sem formatar a mensagem nem registrar no arquivo
53
53
  - _.debug, .info, .aviso, .erro, .critico_: Classifica as mensagens por nível de severidade/relevância e rediciona a saída (arquivo, tela, tela+arquivo) conforme a configuração do nível
54
54
  - _.stop_logging_: Interrompe a manipulação das saídas pelo logger e restaura as saídas padrão (stdout/stderr) para a tela
55
+ - _.filtra_: Filtra os eventos do arquivo de log registrados em um intervalo de tempo específico
55
56
 
56
57
  **misc**: Classe de miscelâneas/diversos
57
58
  - _.seleciona_arquivo_: Abre um picker do sistema operacionar para selecionar um *arquivo* e retorna seu path
@@ -321,7 +322,7 @@ Para uso em APIs com autenticação JWT (JSON Web Token), OAuth, Bearer Token Au
321
322
 
322
323
  #### Classe **lbx_logger**
323
324
 
324
- Essa classe tem o propósito de manipular e formatar as mensagens de saída do script, alterando o formato e redirecionando destino padrão (stdout e stderr) para uma combinação de tela e/ou arquivo.
325
+ Essa classe requer a importação do módulo `logging` no script em que for instanciada e tem o propósito de manipular/formatar as mensagens de saída do script, alterando o formato e redirecionando destino padrão (stdout e stderr) para uma combinação de tela e/ou arquivo.
325
326
 
326
327
  O comportamento padrão é registrar todas as saídas *simultaneamente* em tela e no arquivo com endereço informado no parâmetro `log_file_path`. Se este parametro for omisso no instanciamento da classe, as mensagens serão exibidas apenas na tela.
327
328
 
@@ -349,7 +350,7 @@ Os parametros para o instanciamento da classe são:
349
350
  - `ignore_console` Lista com os níveis de severidade a serem ignorados para *apresentação na tela*, registrando *apenas no arquivo* (quando informado no parametro `log_file_path`) e obedecendo ao nível mínimo estabelecido no parametro `log_level`. Note que omitir o parametro `log_file_path` e incluir um nível na lsita `ignore_console` implica em ignorar/suprimir esse nível de mensagem de qualquer apresentação.
350
351
  - `ignore_file` Mesma lógica do parametro `ignore_console`, mas com lógica invertida: suprime o registro do nível do arquivo e demonstra *apenas na tela*.
351
352
 
352
- As mensagem são manipuladas substituindo-se o comando `print()` pela chamada a um dos 5 métodos acima (_.add(), .debug(), .info(), .aviso(), .erro(), .critico()_). Exceto o método `.add()`, qualquer um dos demais métodos pode interromper a execução do script, através da passagem do parâmetro `exit`. Ao informar esse parametro na chamadada do método, atribua a ele o código de saída desejado (0 para normal, qualquer outro número para saída com erro). Exemplo:
353
+ 1) As mensagem são manipuladas substituindo-se o comando `print()` pela chamada a um dos 5 métodos acima (_.add(), .debug(), .info(), .aviso(), .erro(), .critico()_). Exceto o método `.add()`, qualquer um dos demais métodos pode interromper a execução do script, através da passagem do parâmetro `exit`. Ao informar esse parametro na chamadada do método, atribua a ele o código de saída desejado (0 para normal, qualquer outro número para saída com erro). Exemplo:
353
354
 
354
355
  ```
355
356
  log.erro('Essa mensagem apenas resulta em uma mensagem de nível ERROR')
@@ -359,7 +360,7 @@ log.erro('Essa mensagem resulta em uma mensagem de nível ERRO e encerra o scrip
359
360
  Qualquer chamada ao comando `print()`, uma vez instanciado manipulador de log, será registada como uma chamada ao método _.info()_ e registrada com este nível de severidade.
360
361
  Para retornar ao comportamente padrão do comando print, ou interromper o manipulador, faça chamada ao método `.stop_logging()`
361
362
 
362
- O método _.add()_ não exibe/grava imediatamente a mensagem, mas apenas a diciona a _buffer_. Todas as chamas a _.add()_ irão concatenar a mensagem recebida até a próxima chamada em algum dos níveis _.debug(), .info(), .aviso(), .erro(), .critico()_. Na primeira chama de um destes níveis após uma (ou mais) chamada(s) ao método _.add()_ o *buffer* será concatenado à mensagem recebida por um destes métodos e o resultado será manipulado pelo log conforme os parametros definidos no intanciamento da classe e o método chamado. Essa função é útil para tratar mensagens com retorno condicional. Exemplo:
363
+ 2) O método _.add()_ não exibe/grava imediatamente a mensagem, mas apenas a diciona a _buffer_. Todas as chamas a _.add()_ irão concatenar a mensagem recebida até a próxima chamada em algum dos níveis _.debug(), .info(), .aviso(), .erro(), .critico()_. Na primeira chama de um destes níveis após uma (ou mais) chamada(s) ao método _.add()_ o *buffer* será concatenado à mensagem recebida por um destes métodos e o resultado será manipulado pelo log conforme os parametros definidos no intanciamento da classe e o método chamado. Essa função é útil para tratar mensagens com retorno condicional. Exemplo:
363
364
 
364
365
  ```
365
366
  log.add('Mensagem 1# ') ## não será exibida/registrada
@@ -367,15 +368,26 @@ log.add('Mensagem 2# ') ## não será exibida/registrada
367
368
  log.info('Mensagem 3) ## será exibida/registrada como nível "info" e com texto: "Mensagem 1# Mensagem 2# Mensagem 3"
368
369
  ```
369
370
 
370
- Os métodos que exibem as mensagens (`.debug()`,`.info()`,`.aviso()`, `.erro()`, `.critico()`) possuem 3 parametros: ``message``, `corte=None`, `exit=None`.
371
+ 3) Os métodos que exibem as mensagens (`.debug()`,`.info()`,`.aviso()`, `.erro()`, `.critico()`) possuem 3 parametros: `message`, `corte=None`, `exit=None`.
371
372
 
372
373
  - `message`: posicional e obrigatório. corresponde à mensagem a ser exibida
373
374
  - `corte`: o tamanho máximo da mensagem a ser exibida. opcional e se omitido, exibe a mensagem inteira. se fornecido, corta a mensagem no comprimento informado
374
375
  - `exit`: opcional. se informado (requer um código de retorno), aborta o script com o código informado. se omisso (padrão) a mensagem apenas é minutada pelo log, sem interferir no funcionamento do script
375
376
 
376
- Essa classe requer a importação do módulo `logging` no script em que for instanciada.
377
+ 4) O método `.filtra()` possui 3 parametros posicionais, todos opcionais: `log_file`, `dh_ini`, `dh_fim`.
377
378
 
378
- Exemplos de uso:
379
+ Se os 3 forem omitidos, serão exibidas as entradas de log do arquivo corrente, definido no instanciamento da classe `lbx_logger`, registradas na última hora. Deste modo, o valor padrão para `dh_fim` é `now()` e para `dh_ini` é `now()` menos 1 hora.
380
+
381
+ Caso queira filtrar os registro de outro arquivo de log, que não seja o do script corrente, informe o endereço do arquivo no primeiro parametro.
382
+
383
+ E caso queira alterar alterar o período de filtragem, informe nos parametros 2 e 3 a data/hora de início e fim do período. Estes dois parametros aceitam tanto um objeto do tipo `datetime` como uma string (que será convertida para datetime), desde que ela esteja no formato `dd/mm/aaaa hh:mm:[ss]` (segundos são opcionais).
384
+
385
+ Considerando que os parametros são posicionais, caso queira omitir apenas um dos parametros, preencha a posição do parametro a ser omitido com `None`.
386
+
387
+ A saída dessa função retorna um objeto, que pode ser salvo em disco ou impresso na tela.
388
+
389
+
390
+ 5) Exemplos de uso:
379
391
 
380
392
  ```
381
393
  from lbx_toolkit import lbx_logger
@@ -417,6 +429,34 @@ except Exception as e:
417
429
  log.erro('Essa é uma mensagem de erro e abortará a execução do script', exit=1)
418
430
 
419
431
  log.info('Essa mensagem não será exibida pois o script foi abortado na mensagem anterior')
432
+
433
+ # obtem os registros de log da última hora (comportamento padrão)
434
+ filtra_log = log.search()
435
+
436
+ # obtem os registros das últimas 6 horas
437
+ ultimas_6h = datetime.datetime.now() - datetime.timedelta(hours=6) ## carimbo de tempo de 6 horas atrás !!! requer>> import datetime
438
+ filtra_log = log.search(None, ultimas_6h) # None no 1º parametro impõe o log do arquivo corrente como padrão (definido em 'LogFile' e apontado no instanciamento da classe)
439
+
440
+ # obtem os registros do dia 14/01/2020 até 3h atrás
441
+ ultimas_3h = datetime.datetime.now() - datetime.timedelta(hours=3) ## carimbo de tempo de 6 horas atrás !!! requer>> import datetime
442
+ filtra_log = log.search(None, '14/01/2020 00:00', ultimas_3h) #
443
+
444
+ # obtem os registros do horário comercial do dia 23/12/2023 do arquivo salvo em C:\temp\outro_arquivo.log
445
+ Outro_Log = Path(r'c:\temp\outro_arquivo.log')
446
+ filtra_log = log.search(Outro_Log, '23/12/2023 08:00', '23/12/2023 18:00') #
447
+
448
+ # salva conteúdo filtrado em um arquivo:
449
+ filtrado = 'filtered_log.txt'
450
+ with open(filtado, 'w', encoding='ISO-8859-1') as output_file: # indique o enconding conforme salvo (UTF-8 ou ISO-8859-1)
451
+ output_file.writelines(filta_log)
452
+
453
+ # mostra o conteúdo filtrado na tela
454
+ print(''.join(filtra_log))
455
+
456
+ # mostra o conteúdo filtrado na tela, listando apenas as os registros do nível "DEBUG"
457
+ for line in filtered_lines:
458
+ if "DEBUG" in line:
459
+ print(line, end='')
420
460
  ```
421
461
 
422
462
  #### Classe **misc**
@@ -8,7 +8,7 @@ with open("README.md", "r", encoding='utf-8') as fh:
8
8
 
9
9
  setup(
10
10
  name='lbxtoolkit',
11
- version='2.0.4',
11
+ version='2.0.5',
12
12
  packages=find_packages(),
13
13
  install_requires=[
14
14
  'psycopg2',
File without changes
File without changes