`

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
分享到:
评论

相关推荐

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

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

    Web开发敏捷之道-应用Rails进行敏捷Web开发-第三版.rar

    15.5 Rails的日志 200 15.6 调试信息 200 15.7 精彩预告 202 第16章 Active Support 203 16.1 通用扩展 203 16.2 枚举和数组 204 16.3 Hash 205 16.4 字符串扩展 206 16.5 数值的扩展 208 16.6 时间和日期的扩展 208...

    google_cloud_run:Google Cloud Run上的Rails

    Google Cloud Run上的Rails 关于Google Cloud Run上Rails的有针对性的日志记录,错误报告和次要补丁。 适用于Ruby 3和Rails 6。 logger . info "Hello World"logger . info do "Expensive logging operation, only ...

    UTIM-Check-IO:旨在保留UTIM大学社区便携式设备的进出日志的项目

    旨在保留UTIM大学社区便携式设备的进入/退出日志的项目。 其开发在Rails v4.1.0中实现 目前执行: *注册/编辑/搜索设备和所有者** 注册设备时,它会列出注册的所有者,然后创建一个新的* 设备进出记录* 查看收支...

    awesome_tasks:一个Rails应用程序,用于为自由职业者管理项目,任务,已用时间,沟通,发票等

    它还使编写发票文档,显示所有时间日志说明等变得容易。 还支持组织访问,因此组织可以为各种任务编写评论和反馈。 用Ruby on Rails编写。 贡献于令人敬畏的任务 请检查最新的母版,以确保尚未实现该功能或尚未...

    beautiful-log

    美丽的:: Log(beta) 使Rails日志更漂亮! 彩色日志 多亏了 ,记录的消息根据其级别脱颖而出。 消息排列精美,因此您... 您所需要做的就是挽救错误,只需将其记录为Rails.logger.error e 。 登录Rake任务 仅通过向

    backburner:简单可靠的Rubybeanstalkd作业队列

    后燃器 Backburner是一个由作业队列,可以处理非常大量的作业。... 此外,Backburner还具有强大的支持,可用于重试失败的作业,处理错误情况,自定义日志记录和可扩展的插件挂钩。 为什么选择Backburner? Bac

    gloss:光泽是基于Ruby和水晶的高级语言,可编译为Ruby

    约路线图: 改善错误处理和日志记录(当前几乎不存在) 解决Linux兼容性(当前或多或少不存在) 实施不同的类型检查严格性元编程助手/安全性:* 抽象类和方法编译时的方法查找/存在检查方法重载相关项目: Rails助手...

    rff:Ruby宝石,可使用FFmpeg对HTML5进行简单的音频和视频转换

    变更日志 版本0.1-编写了gem类(请勿使用此版本) 版本0.2-消除了在OutputReader的缓冲区中混合输出的错误(是一个静态变量,现在是实例变量。是的,那我在想什么?)。 记录代码。 做了一些小错误修正。 版本0.2.1-...

    EditPlus 3.31 Build 860 简体中文版

    * 默认支持 Python/Ruby on Rails 语法加亮 * 改进语法加亮速度 (长行) *“未修改文档禁用保存按钮”选项 (“参数设置”-“文件”) * 在分隔命令中显示制表符和空格 * 在文件中查找允许以“;”号间隔的多文件夹名称 ...

    EditPlus 3.31 Build 1129

    * 默认支持 Python/Ruby on Rails 语法加亮 * 改进语法加亮速度 (长行) *“未修改文档禁用保存按钮”选项 (“参数设置”-“文件”) * 在分隔命令中显示制表符和空格 * 在文件中查找允许以“;”号间隔的多文件夹名称 ...

    phonelib:Ruby gem,用于使用Google libphonenumber库数据进行电话验证和格式化

    信息变更记录更改日志可以在repo的发布页面错误报告如果您发现Phonelib gem的问题,请告诉我们。 应用范例您可以在此gem的spec / dummy应用程序中看到通过phonelib进行ActiveRecord验证的示例入门Phonelib是在Rails&gt;...

    honeybadger-ruby:Ruby gem向honeybadger.io报告错误

    变更日志 参见 发展历程 欢迎提出请求。 如果您要添加新功能,请先; 这样,您可以(中等)确定您的请求将被接受。 如果您要将自己的gem /开源项目与Honeybadger集成在一起,请考虑向我们的gem提交一个官方插件。 ...

    java开源包1

    以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 ...

    java开源包11

    以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 ...

    java开源包2

    以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 ...

    java开源包3

    以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 ...

    java开源包6

    以运行时异常的方式来管理错误的响应 使用泛型来做强类型编程 多协议扩展支持(REST, RPC, SOAP, etc) Rails3消息队列系统 Sidekiq Sidekiq 为 Rails 3 应用程序提供一个高效的消息队列系统。 Java文件上传组件 ...

Global site tag (gtag.js) - Google Analytics