proxy-log-request-client
Este projeto tem o objetivo de disponibilizar um plugin que irá fazer um log das requisições em nossa biblioteca request-client.
Instalando
Instalando o projeto:
npm i --save @crawly/proxy-log-request-client
Sobre o projeto
A biblioteca divide as funcionalidades em 2 grupos: Loggers e Transports. Os transports são as classses responsáveis por enviar a informação para algum lugar, cada transport envia a informação apenas para um lugar, essa informação é recebida de um logger. Os logger são as classes responsáveis por obter as informações e enviá-las, quando necessário, para os transports. Exemplificando, a comunicação poderia ser algo como: Temos um logger que obtem as informações apenas quando as requisições derem erro e um transport que envia para o redis, então quando a requisição resultar em erro, o logger obtém as informações do proxy e envia para o transport, que por sua vez irá armazenar a informação no redis. Obviamente, os transports e os loggers praticamente não são correlacionados, então você pode usar qualquer transport para qualquer logger.
Atualmente temos 5 informações que são armazenadas, sendo:
- A mensagem informada ao instanciar o logger;
- O nível da informação que é definida pelo objetivo do logger, sendo:
error
ouinfo
; - O IP que o Proxy disponibilizou (que o alvo recebe);
- O Proxy definido na função
.proxy()
na lib de request; - O IP externo da maquina que o serviço está rodando, obtido na URL http://ipv4bot.whatismyipaddress.com/.
Todas essas 5 informações são armazenadas em JSON com a seguinte estrutura:
{
"message": "",
"level": "info",
"proxyIp": "",
"proxy": "",
"externalIp": ""
}
É importante saber também que o Proxy definido na lib de request, caso tenha alguma senha, ela será mascarada por asteriscos, por exemplo:
Se temos http://username:password@zproxy.lum-superproxy.io:22225
, o resultado será: http://username:********@zproxy.lum-superproxy.io:22225
.
Basicamente você irá utilizar um logger baseado na situação que você quer que seja logado (sucesso ou erro) com os transports que representam onde a informação será disponibilizada (redis, console, etc.).
Como utilizar
Loggers disponíveis:
- SuccessLogger
- ErrorLogger
Transports disponíveis:
- RedisTransport
- ConsoleTransport
Para se utilizar, basta instanciar um Logger, informando a mensagem que será logada e os transports que serão utilizados:
import { Request } from '@crawly/request-client';
import { SuccessLogger, RedisTransport, ConsoleTransport } from '@crawly/proxy-log-request-client';
new Request()
.queryString({
format: 'json'
})
.proxy('10.10.10.10')
.use((new SuccessLogger('Ipify Success', [ new RedisTransport(), new ConsoleTransport() ])).install())
.get('https://api.ipify.org/')
Atenção: O log só irá funcionar se a requisição onde a biblioteca for instalada estiver utilizando
um proxy e se o ambiente estiver com a váriavel de ambiente PROXY_LOG_IS_ENABLED
com o valor true
.
Para desabilitar os logs por váriavel de ambiente, basta definir PROXY_LOG_IS_ENABLED
com o valor false
.
Mensagem do Logger
A mensagem que será informada no logger pode conter algumas expressões que podem ser sobreescrevidas para detalhar melhor o log. As expressões disponíveis:
-
{proxyIp}
será substituído pelo IP que o Proxy disponibilizou (que o alvo recebe); -
{externalIp}
será substituído pelo IP externo da maquina que o serviço está rodando, obtido na URL http://ipv4bot.whatismyipaddress.com/; -
{proxy}
será substituído pelo proxy definido ao se utilizar a biblioteca de rquests.
Então se tivermos uma mensagem como:
Requisição feita com o {proxy} que disponibilizou o IP {proxyIp} na maquina com o IP externo {externalIp}
O resultado seria algo assim (exemplo):
Requisição feita com o 10.10.10.10 que disponibilizou o IP 186.20.37.40 na maquina com o IP externo 200.30.63.102
SuccessLogger
Esse logger é responsável por armazenar toda vez que uma requisição for concluída com sucesso, inclusive em retentativas (.retry()
). Caso
o site que foi requisitado responda com algo que a lib de request entenda que é um erro, a informação não será armazenada.
O logger está disponível com a classe SuccessLogger
:
import { SuccessLogger } from '@crawly/proxy-log-request-client'
ErrorLogger
Esse logger é responsável por armazenar toda vez que uma requisição falhar, inclusive em retentativas (.retry()
). Caso
o site que foi requisitado responda com algo que a lib de request entenda que é um erro, a informação será armazenada.
O logger está disponível com a classe ErrorLogger
:
import { ErrorLogger } from '@crawly/proxy-log-request-client'
RedisTransport
Esse transport é responsável por armazenar a informação no redis.
É possível informar algumas opções ao instanciar a classe, mas esses valores não são obrigatórios pois caso não informados, eles tem valores padrões. Além disso, caso você não forneça os valores ao instanciar a classe, pode ser possível definir esses valores globalmente pelas váriaveis de ambiente. Os valores são:
-
host
é o IP onde o servidor do redis está, por padrão o valor élocalhost
e pode ser informado também pela váriavel de ambienteLOG_REDIS_HOST
; -
port
é a porta usada para se conectar ao redis, por padrão o valor é6379
e pode ser informado também pela váriavel de ambienteLOG_REDIS_PORT
; -
container
é a chave da lista onde será armazenado os logs, por padrão o valor éproxy
e pode ser informado também pela váriavel de ambienteLOG_REDIS_CONTAINER
.
O transport está disponível com a classe RedisTransport
:
import { RedisTransport } from '@crawly/proxy-log-request-client'
ConsoleTransport
Esse transport é responsável por disponibilizar a informação no console.
O transport está disponível com a classe ConsoleTransport
:
import { ConsoleTransport } from '@crawly/proxy-log-request-client'