jaylog
Biblioteca de logging para Python com rotação de arquivos e envio HTTP para um endpoint remoto.
Instalação
pip install -U --no-cache-dir jaylog
Variáveis de ambiente
As variáveis usam o prefixo JAYLOG_. Podem ser definidas no ambiente do sistema ou em um arquivo .env / .env.logging na raiz do projeto.
| Variável | obrigatório? | Padrão | Descrição |
|---|---|---|---|
JAYLOG_APP_NAME |
SIM | null |
Nome do serviço/bot (usado no nome do arquivo de log) |
JAYLOG_LOG_DIR |
NÃO | null |
Caminho do diretório onde os arquivos de log serão salvos. Se omitido, o handler de arquivo é desativado |
JAYLOG_LOG_LEVEL |
NÃO | INFO |
Nível mínimo de log (DEBUG, INFO, WARNING, ERROR, CRITICAL) |
JAYLOG_LOG_MAX_BYTES |
NÃO | 5242880 |
Tamanho máximo do arquivo de log antes de rotacionar (bytes) |
JAYLOG_LOG_BACKUP_COUNT |
NÃO | 5 |
Quantidade de arquivos de backup mantidos após rotação |
JAYLOG_LOG_RETENTION_DAYS |
NÃO | 7 |
Dias para manter arquivos de log antigos |
JAYLOG_LOG_CONSOLE_ENABLED |
NÃO | true |
Habilita a saída de log no console (true/false) |
JAYLOG_LOG_CONSOLE_COLOR |
NÃO | null |
Força (true) ou desliga (false) as cores no console. Se omitido, detecta automaticamente o suporte do terminal |
JAYLOG_LOG_HTTP_TIMEOUT |
NÃO | 5.0 |
Timeout em segundos para o envio HTTP |
JAYLOG_LOG_HTTP_ENDPOINT |
NÃO | null |
URL do endpoint que receberá os logs |
JAYLOG_LOG_HTTP_API_KEY |
NÃO | null |
Chave de autenticação enviada no header x-api-key |
JAYLOG_LOG_HTTP_PROXY |
NÃO | null |
URL do proxy para o envio HTTP (ex: http:\\user:password@server:port) |
JAYLOG_LOG_SCREENSHOT_ENABLED |
NÃO | false |
Captura screenshot no momento do log (true/false, apenas Windows) |
Como usar?
[!IMPORTANT] A partir da versão 0.2.2,
configure()deve ser chamado antes deget_logger(). Chamarget_logger()sem configuração prévia lança uma exceção.
Existem alguns cenários diferentes onde a utilização desse lib pode mudar, abaixo estão os cenários mapeados e como realizar configuração para cada um.
Arquivo único
.env.logging
JAYLOG_APP_NAME=meu-bot
JAYLOG_LOG_DIR=C:\logs
main.py
from jaylog import JaylogSettings, configure, get_logger
configure(JaylogSettings())
logger = get_logger()
logger.info("Arquivo Único")
Apenas console (sem arquivo de log)
Basta omitir JAYLOG_LOG_DIR. O handler de console fica ativo por padrão.
.env.logging
JAYLOG_APP_NAME=meu-bot
main.py
from jaylog import JaylogSettings, configure, get_logger
configure(JaylogSettings())
logger = get_logger()
logger.info("Saída apenas no console")
Múltiplos Arquivos
.env.logging
JAYLOG_APP_NAME=meu-bot
JAYLOG_LOG_DIR=C:\logs
main.py
from jaylog import JaylogSettings, get_logger, configure
from parse import parse_csv
configure(JaylogSettings())
logger = get_logger()
logger.info("Múltiplos Arquivos - main.py")
parse_csv()
parse.py
from jaylog import get_logger
logger = get_logger()
def parse_csv():
logger.info("Múltiplos Arquivos - parse.py")
Múltiplos loggers nomeados
Quando o projeto possui serviços distintos, passe uma lista para configure(). Cada entrada usa seu próprio app_name e grava em arquivos separados. O campo [service] é exibido automaticamente no formato do log quando há mais de um logger registrado.
.env.logging
JAYLOG_LOG_DIR=C:\logs
main.py
from jaylog import JaylogSettings, configure, get_logger
settings_order = JaylogSettings(app_name="ORDER-PROCESSOR")
settings_billing = JaylogSettings(app_name="BILLING")
configure([settings_order, settings_billing])
logger = get_logger("ORDER-PROCESSOR") # ou get_logger() — retorna o primeiro registrado
billing_logger = get_logger("BILLING")
logger.info("Pedido recebido")
billing_logger.info("Fatura emitida")
Cores no console
As cores são ligadas automaticamente quando o terminal suporta ANSI. A detecção cobre:
- Windows: o modo virtual terminal do console é habilitado em tempo de execução, o que faz as cores funcionarem também no
cmd.exe/PowerShell rodando no console legado (conhost) do Windows 10 — antes só saía colorido no Windows Terminal. - Saída redirecionada (
python main.py > saida.txt, pipes, serviços sem console): as cores são desligadas, para o arquivo não ficar com lixo do tipo←[32m. - Consoles antigos que não suportam ANSI de jeito nenhum: o log sai em texto limpo, com o mesmo alinhamento.
- As convenções
NO_COLOReFORCE_COLORsão respeitadas.
Para forçar um comportamento, use JAYLOG_LOG_CONSOLE_COLOR:
.env.logging
JAYLOG_APP_NAME=meu-bot
JAYLOG_LOG_CONSOLE_COLOR=false
Ou direto no código:
configure(JaylogSettings(app_name="meu-bot", log_console_color=False))
[!TIP]
JAYLOG_LOG_CONSOLE_COLOR=trueforça as cores mesmo com a saída redirecionada — útil quando o log é consumido por uma ferramenta que entende ANSI (ex:... | less -R).
Alterando Caminho padrão do .env
development.env
JAYLOG_APP_NAME=meu-bot
JAYLOG_LOG_DIR=C:\logs
main.py
from jaylog import JaylogSettings, configure, get_logger
configure(JaylogSettings(_env_file='development.env'))
logger = get_logger()
logger.info("Alterando Caminho padrão do .env")
Preparando para produção
[!IMPORTANT] HTTP_ENDPOINT e HTTP_API_KEY (opcionais) 📢
- A configuração HTTP_ENDPOINT e HTTP_API_KEY não precisa ser feita em ambiente local ou de desenvolvimento
- Se apenas uma das duas variáveis HTTP_ENDPOINT ou HTTP_API_KEYS for definida, o envio HTTP é ignorado.
- Caso a aplicação execute em um ambiente que usa um proxy ntlm, defina
JAYLOG_LOG_HTTP_PROXY
[!TIP] Em produção é recomendado usar um diretório específico para suas secrets, para que você possa reutilizar entre diferentes aplicações.
Cenário 1 (secrets definido hardcode no código):
prodution.env
JAYLOG_APP_NAME=meu-bot
JAYLOG_LOG_DIR=C:\logs
$ pwd
/foo/bar/secrets
$ ls -la
JAYLOG_LOG_HTTP_ENDPOIN
JAYLOG_LOG_HTTP_API_KEY
JAYLOG_LOG_HTTP_PROXY
main.py
from jaylog import JaylogSettings, configure, get_logger
configure(JaylogSettings(
_env_file='prodution.env',
_secrets_dir='/foo/bar/secrets/'
))
logger = get_logger()
logger.info("Mensagem de log")
Cenário 2 (secrets definido no .env):
prodution.env
JAYLOG_APP_NAME=meu-bot
JAYLOG_LOG_DIR=C:\logs
JAYLOG_SECRETS_DIR=/foo/bar/secrets
main.py
from jaylog import JaylogSettings, configure, get_logger
# nesse caso é necessário usar a função de classe `reload_secrets`
# pois o diretorio dos secrets foi passado via variável de ambiente
configure(JaylogSettings(_env_file='prodution.env').reload_secrets())
logger = get_logger()
logger.info("Mensagem de log")
reload_secrets() devolve uma nova instância preservando tudo que foi passado explicitamente no construtor, então dá para combinar configuração em código com secrets em disco:
settings = JaylogSettings(app_name='meu-bot', log_level='DEBUG').reload_secrets()
configure(settings) # app_name e log_level mantidos; endpoint/api_key vêm dos secrets
[!NOTE] Valores passados no construtor têm prioridade sobre os secrets: um
log_http_api_key='...'definido em código não é sobrescrito pelo arquivo emsecrets/.
Reconfigurando sem repetir argumentos
reconfigure() recria a configuração com os mesmos argumentos do construtor, aplicando apenas os overrides informados. Vale tanto para campos quanto para os argumentos de configuração do pydantic-settings (_env_file, _secrets_dir, _case_sensitive, _env_prefix, ...):
base = JaylogSettings(app_name='meu-bot', log_level='DEBUG')
homolog = base.reconfigure(_env_file='homolog.env')
prod = base.reconfigure(_env_file='producao.env', log_level='WARNING')
# app_name preservado nos dois; só o que foi informado muda
É sobre esse mecanismo que o reload_secrets() é construído — ele é só um reconfigure(_secrets_dir=...) com validação.
Release files for jaylog 0.2.8
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| jaylog-0.2.8.tar.gz | 13.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| jaylog-0.2.8-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.9 kB
Release files / jaylog-0.2.8.tar.gz
| Download URL | jaylog-0.2.8.tar.gz |
|---|---|
| Size | 13.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d41b15b337dc6e624bb9a1ad691abf5f9688dead04c0e71f9bc00b06b9a539c1
|
|
BLAKE2b-256 checksum How to use checksums |
bc2a0012feaca534738689e20da27fb7f0d39911e3d5276dd26936e96f02488d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|
Release files / jaylog-0.2.8-py3-none-any.whl
| Download URL | jaylog-0.2.8-py3-none-any.whl |
|---|---|
| Size | 17.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
6b6b8789143c520950eed1e63e0c19c0ba20be613d1a71a902a326f4f3469de4
|
|
BLAKE2b-256 checksum How to use checksums |
cea3c758f4880779cb055b7bc2fd31ac77beb2513b2e41d51f280666eac79b3b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.9.18 {"installer":{"name":"uv","version":"0.9.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
|