Class: FocusNfe::HTTP::Logging

Inherits:
Object
  • Object
show all
Defined in:
lib/focus_nfe/http/logging.rb

Overview

Registra cada requisição/resposta no logger configurado, redigindo dados sensíveis. Concentra o nil-guard, a redação de cabeçalhos e a formatação, mantendo a Connection enxuta.

Contrato do logger plugável

O logger pode ser qualquer objeto compatível com o Logger da biblioteca padrão: responde a debug, info, warn e error, cada um aceitando uma mensagem ou um bloco. A gem sempre usa a forma com bloco (+logger.info { ... }+), de modo que a mensagem só é construída quando o nível está habilitado. Logger.new($stdout), Rails.logger e ActiveSupport::Logger conformam. Quando o logger é nil (padrão da Configuration), o logging fica inteiramente desligado, sem custo.

Dados sensíveis

Cabeçalhos em SENSITIVE_HEADERS (notadamente Authorization) nunca são registrados — seus valores viram REDACTED. O corpo da requisição (que carrega o payload fiscal com CPF/CNPJ e valores) nunca é logado; o corpo da resposta só aparece em erros (status >= 400), truncado a BODY_MAX.

Constant Summary collapse

REDACTED =

Returns substituto registrado no lugar de valores sensíveis.

Returns:

  • (String)

    substituto registrado no lugar de valores sensíveis

"[FILTERED]"
SENSITIVE_HEADERS =

Returns nomes de cabeçalho redigidos (comparados em minúsculas).

Returns:

  • (Array<String>)

    nomes de cabeçalho redigidos (comparados em minúsculas)

%w[authorization].freeze
BODY_MAX =

Returns tamanho máximo do corpo de erro registrado.

Returns:

  • (Integer)

    tamanho máximo do corpo de erro registrado

2_000

Instance Method Summary collapse

Constructor Details

#initialize(logger) ⇒ Logging

Returns a new instance of Logging.

Parameters:

  • logger (_Logger, nil)

    logger plugável ou nil para desligar



36
37
38
# File 'lib/focus_nfe/http/logging.rb', line 36

def initialize(logger)
  @logger = logger
end

Instance Method Details

#failure(verb, url, error, elapsed) ⇒ void

This method returns an undefined value.

Parameters:

  • verb (Symbol)

    verbo HTTP da requisição

  • url (String)

    URL absoluta da requisição

  • error (Exception)

    falha de transporte ocorrida

  • elapsed (Float)

    tempo decorrido até a falha, em segundos



75
76
77
78
79
80
# File 'lib/focus_nfe/http/logging.rb', line 75

def failure(verb, url, error, elapsed)
  logger = @logger
  return unless logger

  logger.error { "[focus_nfe] ✕ #{verb.to_s.upcase} #{url} #{error.message} (#{ms(elapsed)}ms)" }
end

#request(verb, url, headers) ⇒ void

This method returns an undefined value.

Parameters:

  • verb (Symbol)

    verbo HTTP da requisição

  • url (String)

    URL absoluta da requisição

  • headers (Hash{String=>String})

    cabeçalhos enviados (redigidos antes de logar)



44
45
46
47
48
49
# File 'lib/focus_nfe/http/logging.rb', line 44

def request(verb, url, headers)
  logger = @logger
  return unless logger

  logger.debug { "[focus_nfe] → #{verb.to_s.upcase} #{url} headers=#{redact(headers)}" }
end

#response(verb, url, status, elapsed, body) ⇒ void

This method returns an undefined value.

Parameters:

  • verb (Symbol)

    verbo HTTP da requisição

  • url (String)

    URL absoluta da requisição

  • status (Integer)

    código de status HTTP recebido

  • elapsed (Float)

    tempo decorrido, em segundos

  • body (String, nil)

    corpo cru da resposta, logado apenas em erros (status >= 400)



57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/focus_nfe/http/logging.rb', line 57

def response(verb, url, status, elapsed, body)
  logger = @logger
  return unless logger

  linha = "[focus_nfe] ← #{status} #{verb.to_s.upcase} #{url} (#{ms(elapsed)}ms)"

  if status >= 400
    logger.warn { "#{linha} body=#{truncate(body)}" }
  else
    logger.info { linha }
  end
end