首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在faraday中设置日志级别

如何在faraday中设置日志级别
EN

Stack Overflow用户
提问于 2014-09-17 02:08:32
回答 3查看 10.9K关注 0票数 5

我最近将我的http客户端切换到了faraday,一切都如我所愿。我有下面这段代码来创建连接:

代码语言:javascript
复制
@connection = Faraday.new(:url => base_url) do |faraday|
              faraday.use Custim::Middleware
              faraday.request :url_encoded             # form-encode POST params
              faraday.request :json
              faraday.response :json, :content_type => /\bjson$/
              faraday.response :logger
              faraday.adapter Faraday.default_adapter  # make requests with Net::HTTP

faraday记录器帮助打印控制台输出上的所有日志。但是,我不想在控制台输出中打印所有日志级别。如何将日志级别设置为仅打印错误日志?

我使用的是法拉第0.8.9版

EN

回答 3

Stack Overflow用户

发布于 2015-05-20 00:29:51

有一种方法,但似乎根本没有文档记录。我在0.9.1上试过了,但在0.8.9上也应该可以。

代码语言:javascript
复制
# provide your own logger
logger = Logger.new $stderr
logger.level = Logger::ERROR
Faraday.new(:url => base_url) do |faraday|
  # ...
  faraday.response :logger, logger
  # ...
end

这之所以可行,是因为faraday.response :logger可能使用Faraday::Response::Logger创建了一个中间件,该中间件具有以下构造函数:

代码语言:javascript
复制
def initialize(app, logger = nil)

Bonus

在0.9.1中,构造函数签名为

代码语言:javascript
复制
def initialize(app, logger = nil, options = {})

这个类还包含这个:DEFAULT_OPTIONS = { :bodies => false },这可能意味着您可以在记录器之后传递一个:bodies选项来控制主体的日志记录。显然,您甚至可以使用{bodies: {response: true}}记录响应正文,但不能记录请求正文。

票数 12
EN

Stack Overflow用户

发布于 2014-09-17 21:08:01

我不认为在Faraday中有一种本机方法可以做到这一点,但在中间件中实现它会很容易:

代码语言:javascript
复制
require 'faraday'

class LogOnError < Faraday::Response::Middleware
  extend Forwardable
  def_delegators :@logger, :debug, :info, :warn, :error, :fatal

  ClientErrorStatuses = 400...600

  def initialize(app, options = {})
    @app = app
    @logger = options.fetch(:logger) {
      require 'logger'
      ::Logger.new($stdout)
    }
  end

  def call(env)
    @app.call(env).on_complete do
      case env[:status]
      when ClientErrorStatuses
        info "#{env.method} #{env.url.to_s} #{response_values(env)}"
      end
    end
  end


  def response_values(env)
    {:status => env.status, :headers => env.response_headers, :body => env.body}
  end
end

conn = Faraday.new('https://github.com/') do |c|
  c.use LogOnError
  c.use Faraday::Adapter::NetHttp
end

puts "No text to stdout"
response = conn.get '/' #=> No text to stdout]
puts "No text above..."
puts "Text to stdout:"
response = conn.get '/cant-find-me' #=> Text to standoupt

这会产生:

代码语言:javascript
复制
No text to stdout
No text above...
Text to stdout:
I, [2014-09-17T14:03:36.383722 #18881]  INFO -- : get https://github.com/cant-find-me {:status=>404, :headers=>{"server"=>"GitHub.com", "date"=>"Wed, 17 Sep 2014 13:03:36 GMT", "content-type"=>"application/json; charset=utf-8", "transfer-encoding"=>"chunked", "connection"=>"close", "status"=>"404 Not Found", "x-xss-protection"=>"1; mode=block", "x-frame-options"=>"deny", "content-security-policy"=>"default-src *; script-src assets-cdn.github.com www.google-analytics.com collector-cdn.github.com; object-src assets-cdn.github.com; style-src 'self' 'unsafe-inline' 'unsafe-eval' assets-cdn.github.com; img-src 'self' data: assets-cdn.github.com identicons.github.com www.google-analytics.com collector.githubapp.com *.githubusercontent.com *.gravatar.com *.wp.com; media-src 'none'; frame-src 'self' render.githubusercontent.com gist.github.com www.youtube.com player.vimeo.com checkout.paypal.com; font-src assets-cdn.github.com; connect-src 'self' ghconduit.com:25035 live.github.com uploads.github.com s3.amazonaws.com", "vary"=>"X-PJAX", "cache-control"=>"no-cache", "x-ua-compatible"=>"IE=Edge,chrome=1", "set-cookie"=>"logged_in=no; domain=.github.com; path=/; expires=Sun, 17-Sep-2034 13:03:36 GMT; secure; HttpOnly", "x-runtime"=>"0.004330", "x-github-request-id"=>"2EED8226:76F6:1951EDA:541986A8", "strict-transport-security"=>"max-age=31536000; includeSubdomains; preload", "x-content-type-options"=>"nosniff"}, :body=>"{\"error\":\"Not Found\"}"}

您可以将它拆分到它自己的类中,您可以使用include来清理它。

票数 2
EN

Stack Overflow用户

发布于 2017-06-27 11:12:43

重写logger.debug方法为我解决了这个问题。现在我只收到INFO及以上版本的消息。我使用的是faraday 0.12.1。

代码语言:javascript
复制
faraday = Faraday.new(:url => "http://example.org") do |faraday|
  faraday.response :logger do | logger |
    def logger.debug *args; end
  end
end

它有点脏,但代码要少得多;)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25875681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档