|
1 | 1 | # frozen_string_literal: true |
2 | 2 |
|
3 | 3 | require 'forwardable' |
| 4 | +require 'faraday/logging/formatter' |
4 | 5 |
|
5 | 6 | module Faraday |
6 | 7 | class Response |
7 | 8 | class Logger < Middleware |
8 | | - extend Forwardable |
9 | | - |
10 | | - DEFAULT_OPTIONS = { headers: true, bodies: false }.freeze |
11 | | - |
12 | 9 | def initialize(app, logger = nil, options = {}) |
13 | 10 | super(app) |
14 | | - @logger = logger || begin |
| 11 | + logger ||= begin |
15 | 12 | require 'logger' |
16 | 13 | ::Logger.new($stdout) |
17 | 14 | end |
18 | | - @filter = [] |
19 | | - @options = DEFAULT_OPTIONS.merge(options) |
20 | | - yield self if block_given? |
| 15 | + formatter_class = options.delete(:formatter) || Logging::Formatter |
| 16 | + @formatter = formatter_class.new(logger: logger, options: options) |
| 17 | + yield @formatter if block_given? |
21 | 18 | end |
22 | 19 |
|
23 | | - def_delegators :@logger, :debug, :info, :warn, :error, :fatal |
24 | | - |
25 | 20 | def call(env) |
26 | | - info('request') { "#{env.method.upcase} #{apply_filters(env.url.to_s)}" } |
27 | | - debug('request') { apply_filters(dump_headers(env.request_headers)) } if log_headers?(:request) |
28 | | - debug('request') { apply_filters(dump_body(env[:body])) } if env[:body] && log_body?(:request) |
| 21 | + @formatter.request(env) |
29 | 22 | super |
30 | 23 | end |
31 | 24 |
|
32 | 25 | def on_complete(env) |
33 | | - info('response') { "Status #{env.status}" } |
34 | | - debug('response') { apply_filters(dump_headers(env.response_headers)) } if log_headers?(:response) |
35 | | - debug('response') { apply_filters(dump_body(env[:body])) } if env[:body] && log_body?(:response) |
36 | | - end |
37 | | - |
38 | | - def filter(filter_word, filter_replacement) |
39 | | - @filter.push([filter_word, filter_replacement]) |
40 | | - end |
41 | | - |
42 | | - private |
43 | | - |
44 | | - def dump_headers(headers) |
45 | | - headers.map { |k, v| "#{k}: #{v.inspect}" }.join("\n") |
46 | | - end |
47 | | - |
48 | | - def dump_body(body) |
49 | | - if body.respond_to?(:to_str) |
50 | | - body.to_str |
51 | | - else |
52 | | - pretty_inspect(body) |
53 | | - end |
54 | | - end |
55 | | - |
56 | | - def pretty_inspect(body) |
57 | | - require 'pp' unless body.respond_to?(:pretty_inspect) |
58 | | - body.pretty_inspect |
59 | | - end |
60 | | - |
61 | | - def log_headers?(type) |
62 | | - case @options[:headers] |
63 | | - when Hash then @options[:headers][type] |
64 | | - else @options[:headers] |
65 | | - end |
66 | | - end |
67 | | - |
68 | | - def log_body?(type) |
69 | | - case @options[:bodies] |
70 | | - when Hash then @options[:bodies][type] |
71 | | - else @options[:bodies] |
72 | | - end |
73 | | - end |
74 | | - |
75 | | - def apply_filters(output) |
76 | | - @filter.each do |pattern, replacement| |
77 | | - output = output.to_s.gsub(pattern, replacement) |
78 | | - end |
79 | | - output |
| 26 | + @formatter.response(env) |
80 | 27 | end |
81 | 28 | end |
82 | 29 | end |
|
0 commit comments