`

rails错误日志记录

    博客分类:
  • RUBY
阅读更多
Rails中对日志的处理采用的是“消息-订阅”机制,各部分组件和功能如下:

消息发送:ActiveSupport::Notifications
instrument: 通知subscribers
消息订阅:ActiveSupport::LogSubscriber


require 'active_support/configurable'

module RailsLog
  include ActiveSupport::Configurable

  configure do |config|
    config.ignore_exception = [
      'ActionController::UnknownFormat'
    ]
    config.constraint = -> (req){ User.find_by(id: req.env['rack.session']['user_id'])&.admin? }
  end

end


module RailsLog
  class ControllerSubscriber < ActiveSupport::LogSubscriber

    def header_processing(event)
      return unless logger.debug?

      payload = event.payload
      headers  = request_headers(payload[:env])

      debug "  Headers: #{headers.inspect}"
    end

    def process_action(event)
      payload = event.payload
      if payload[:exception].present?
        unless RailsLog.config.ignore_exception.include? payload[:exception_object].class.to_s
          lc = LogRecord.new
          lc.path = payload[:path]
          lc.controller = payload[:controller]
          lc.action = payload[:action]
          lc.params = payload[:params].except('controller', 'action')
          lc.headers = request_headers payload[:headers]
          lc.cookie = payload[:headers]['rack.request.cookie_hash']
          lc.session = payload[:headers]['rack.session'].to_hash
          lc.exception = payload[:exception].join("\r\n")
          lc.exception_object = payload[:exception_object].class.to_s
          lc.exception_backtrace = payload[:exception_object].backtrace.join("\r\n")
          lc.save
          info 'exception log saved!'
        end
      end
    end

    def logger
      ActionController::Base.logger
    end

    def request_headers(env)
      result = env.select { |k, _| k.start_with?('HTTP_') && k != 'HTTP_COOKIE' }
      result = result.collect { |pair| [pair[0].sub(/^HTTP_/, ''), pair[1]] }
      result.sort.to_h
    end

  end
end

RailsLog::ControllerSubscriber.attach_to :action_controller



发送邮件的时候记录日志
class ApplicationMailer < ActionMailer::Base

  def process(method_name, *args)
    payload = {
      mailer: self.class.name,
      action: method_name,
      message_object_id: self.message.object_id,
      params: args
    }

    ActiveSupport::Notifications.instrument('record.action_mailer', payload)

    super
  end

  def self.deliver_mail(mail)
    ActiveSupport::Notifications.instrument('deliver.action_mailer') do |payload|
      set_payload_for_mail(payload, mail)
      payload[:message_object_id] = mail.object_id

      result = yield

      if result.is_a? Net::SMTP::Response
        payload[:sent_status] = result.status
        payload[:sent_string] = result.string
      end
    end
  end

end


-------

module RailsLog
  class MailerSubscriber < ActiveSupport::LogSubscriber

    def record(event)
      payload = event.payload

      log_mailer = LogMailer.new(message_object_id: payload[:message_object_id], mailer: payload[:mailer])
      log_mailer.action = payload[:action]
      log_mailer.params = payload[:params]
      log_mailer.save

      info 'mailer log saved!'
    end

    def deliver(event)
      payload = event.payload

      log_mailer = LogMailer.find_or_initialize_by(message_object_id: payload[:message_object_id], mailer: payload[:mailer])
      log_mailer.sent_status = payload[:sent_status]
      log_mailer.sent_string = payload[:sent_string]
      log_mailer.save

      info 'mailer log updated!'
    end

  end
end

RailsLog::MailerSubscriber.attach_to :action_mailer

0
0
分享到:
评论

相关推荐

    The Rails 4 Way

    - **日志记录**:Rails提供了丰富的日志记录机制,帮助开发者监控应用程序的运行状态。 **2. 路由** - **路由的目的**:路由定义了URL与应用程序内部逻辑之间的映射关系,它是控制请求处理流程的关键部分。 - **...

    Rails3 使用rake启动后台任务

    8. **错误处理与日志记录**: 在后台任务中,确保捕获并记录异常,以便于调试。同时,使用日志记录工具(如 Logger 或 Rails 的 logging 功能)记录任务的执行过程。 9. **测试后台任务**: 应该为后台任务编写单元...

    weixin_rails_middleware, 微信集成 ruby weixin_rails_middleware for integration weixin..zip

    8. **错误处理与日志记录**: 中间件通常会包含错误处理机制,捕获可能出现的问题,并记录日志,方便开发者调试和优化应用。 9. **版本更新与社区支持**: 作为开源项目,`weixin_rails_middleware` 不断地接受...

    The rails4 way

    - **日志记录**: 解释了Rails的日志记录机制,包括如何配置日志级别、日志格式化等内容。 ##### 2. 路由 - **路由的目的**: 解释了路由在Rails中的重要性,即映射URL到控制器动作。 - **`routes.rb`文件**: 讲解...

    Ruby-karafka基于ApacheKafka的Ruby和Rails应用程序开发框架

    5. **插件系统**:Ruby-Karafka拥有一个可扩展的插件系统,可以自定义和增强框架的功能,如监控、日志记录和错误处理。 6. **异步处理**:支持异步消息处理,提高了吞吐量和系统的响应速度,同时降低了对CPU和内存...

    Ruby on Rails 指南 v5.0.1 中文版

    - **在更新时锁定记录**:说明如何在更新记录时加锁以避免并发问题。 - **联结表**:讲解如何处理多对多关联关系。 - **及早加载关联**:介绍如何预先加载关联对象以避免N+1查询问题。 - **作用域**:解释如何定义...

    flex on rails文档

    - 错误处理和日志记录:确保应用程序能够优雅地处理错误,并通过日志记录进行调试和监控。 通过以上几个方面,我们可以看到 **Flex on Rails** 的强大之处在于它能够充分利用前后端技术的优势,构建出既美观又高效...

    无线点餐系统的服务端,使用ruby on rails框架

    7. 错误处理和日志记录:通过使用如Rails的Action Controller的异常处理机制,确保系统在遇到问题时能够优雅地失败,并记录详细的错误日志供排查问题。 在"WirelessOrder-Server-master"这个压缩包中,可能包含了...

    Rails相关电子书汇总二

    4. **企业级特性**:可能涉及安全(如认证和授权)、性能优化、错误处理、日志记录、部署策略等在大型项目中至关重要的主题。 综上所述,这个压缩包中的电子书对想要深入学习Ruby on Rails,特别是从事企业级应用...

    使用Rails 数据库DSL与PHP协作开发 - 色色

    8. **错误处理和日志记录**:在两个不同语言的环境中,如何有效地进行错误处理和日志记录,确保问题定位的便捷性。 9. **安全性**:探讨如何保护数据的安全,防止SQL注入等攻击,以及在API通信中的身份验证和授权...

    ruby on rails学生选课系统

    同时,通过New Relic或Logentries等监控工具,可以实时监控系统的性能和日志,及时发现并解决问题。 综上所述,利用Ruby on Rails开发学生选课系统,不仅可以充分利用其高效的开发模式和丰富的社区资源,还能为教育...

    koa-logs-full:仿照rails风格的轻量log库,可以按rails的log风格记录请求日志。可以很好的解决nodejs由于单进程导致的日志串起来的问题

    koa-logs-full 为什么要再造个轮子?...默认监听错误,在出错时,自动打出错误日志。 在日志目录下会按照环境名+日期+.log的格式维护对应的日志文件。 支持个性化的日志内容样式定制,使用实现 支持c风

    基于Java的Rails3消息队列系统 Sidekiq.zip

    6. **监控与日志**:集成后,确保能够监控Sidekiq在Java环境下的性能,包括任务处理速度、错误率等,并且要有合适的日志记录,以便于问题排查。 7. **性能优化**:根据Java和Rails的特性,调整并发度、内存使用等...

    Rails3消息队列系统 Sidekiq

    Sidekiq提供了Web界面,用于监控队列状态、查看工作进程和错误日志。只需在Rails应用中添加路由和控制器,就可以访问这个界面。此外,Sidekiq还支持与其他监控工具如New Relic、Sentry等集成。 五、优化与扩展 1. ...

    Ruby-MongoDBLoggerRails的MongoDB记录器

    MongoDB Logger是专门为Ruby on Rails应用设计的一个日志记录器,它将日志信息存储在MongoDB数据库中,而非传统的文本文件。这个替代方案对于那些使用MongoDB作为主要数据存储的Rails应用尤其有用,因为它提供了集成...

    ruby on rails 2.1新特性介绍

    - **脏数据追踪**:新增的脏数据追踪功能允许开发者轻松检测模型对象哪些属性发生了变化,这对于实现高效的审计日志和变更历史记录功能极为关键。 - **命名范围(Named Scope)**:通过命名范围,开发者可以定义重用的...

    ruby on rails 2.1 what is new (CN)

    - **时间戳自动转换**:当用户提交表单时,Rails会自动将用户输入的时间戳转换为其所在时区的时间,从而避免了时区转换错误。 ##### 修改追踪(Dirty Tracking) 在Rails 2.1中,模型类现在内置了修改追踪功能。这...

    升级版本后Rails的文件上传

    10. **日志记录**:在`log`目录下的日志文件可以提供关于文件上传操作的详细信息,这对于排查问题非常有用。确保日志配置得当,以便在出现问题时能快速定位。 升级Rails版本涉及的文件上传变更可能需要对代码进行...

Global site tag (gtag.js) - Google Analytics