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.
- {lbxtoolkit-2.0.4 → lbxtoolkit-2.0.5}/PKG-INFO +47 -7
- {lbxtoolkit-2.0.4 → lbxtoolkit-2.0.5}/README.md +46 -6
- {lbxtoolkit-2.0.4 → lbxtoolkit-2.0.5}/lbxtoolkit/__init__.py +82 -1
- {lbxtoolkit-2.0.4 → lbxtoolkit-2.0.5}/lbxtoolkit.egg-info/PKG-INFO +47 -7
- {lbxtoolkit-2.0.4 → lbxtoolkit-2.0.5}/setup.py +1 -1
- {lbxtoolkit-2.0.4 → lbxtoolkit-2.0.5}/LICENSE +0 -0
- {lbxtoolkit-2.0.4 → lbxtoolkit-2.0.5}/lbxtoolkit.egg-info/SOURCES.txt +0 -0
- {lbxtoolkit-2.0.4 → lbxtoolkit-2.0.5}/lbxtoolkit.egg-info/dependency_links.txt +0 -0
- {lbxtoolkit-2.0.4 → lbxtoolkit-2.0.5}/lbxtoolkit.egg-info/requires.txt +0 -0
- {lbxtoolkit-2.0.4 → lbxtoolkit-2.0.5}/lbxtoolkit.egg-info/top_level.txt +0 -0
- {lbxtoolkit-2.0.4 → lbxtoolkit-2.0.5}/setup.cfg +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: lbxtoolkit
|
|
3
|
-
Version: 2.0.
|
|
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
|
|
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:
|
|
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
|
-
|
|
377
|
+
4) O método `.filtra()` possui 3 parametros posicionais, todos opcionais: `log_file`, `dh_ini`, `dh_fim`.
|
|
377
378
|
|
|
378
|
-
|
|
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
|
|
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:
|
|
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
|
-
|
|
354
|
+
4) O método `.filtra()` possui 3 parametros posicionais, todos opcionais: `log_file`, `dh_ini`, `dh_fim`.
|
|
354
355
|
|
|
355
|
-
|
|
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.
|
|
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
|
|
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:
|
|
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
|
-
|
|
377
|
+
4) O método `.filtra()` possui 3 parametros posicionais, todos opcionais: `log_file`, `dh_ini`, `dh_fim`.
|
|
377
378
|
|
|
378
|
-
|
|
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**
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|