【问题标题】:Which tags should I consider using for logging a multi-user Rails application?我应该考虑使用哪些标签来记录多用户 Rails 应用程序?
【发布时间】:2016-12-21 11:12:31
【问题描述】:

我正在维护一个 Rails 3.2 应用程序。客户希望修复一些错误。但是,其中一些是超时错误,并且应用程序是多用户的,因此使用默认日志记录很难确定导致它们的操作。客户不想要像 Rollbar 这样的外部第三方日志记录系统,因此改进现有日志记录是唯一可行的方法。

我宁愿使用 Rails 提供的记录器而不是新的 gem,以确保最小化对应用程序的更改,而不是降低性能、添加新的错误或需要额外的维护。

我很难在任何版本的 Rails 中找到关于标记日志记录的好文档,更不用说 Rails 3.2了

Rails 指南Configuring Rails Applications 有一些信息,但不是以日志为中心。

Rails 指南“调试 Rails 应用程序”提到了 tagged logging 的概念,但没有具体说明。 Justin Weiss 的文章Keeping Your Logs From Becoming an Unreadable Mess 是一个很好的介绍,但没有足够的信息。它谈到 config.log_tags 具有基于来自 ActionDispatch::Request 的属性的选项,但该类的文档是通用的,并没有足够固执地建议使用哪些方法,哪些不使用,以及为什么。

我应该考虑使用哪些标签来记录多用户 Rails 应用程序,我应该避免哪些标签,为什么?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 logging multi-user


    【解决方案1】:

    使用 Rails 的 ActiveSupport::TaggedLogging 记录器是一个很好的选择。

    config.log_tags 中指定的标签由Rails::Rack::Logger 在每个请求上计算。

    除了ActionDispatch::Request属性外,还可以指定接收请求的Procs(source)。这将打开对 Rack 环境的访问。

    config.log_tags [:uuid, proc { |request| ExampleService.call(request.env) }]
    

    要访问更高级别的 API,ActionController 中的简单 around_filter 就足够了。

    around_filter :current_user_tag
    
    def current_user_tag
      logger.tagged("CU_#{current_user.id}") do
        yield
      end
    end
    

    用上面的around_filterconfig.log_tags = [:uuid]取样

    [830bb7df-b760-4537-94a7-62ab0f862e52] Started GET "/users" for ::1 at 2016-09-16 16:15:20 +0100
    [830bb7df-b760-4537-94a7-62ab0f862e52] Processing by UsersController#index as HTML
    [830bb7df-b760-4537-94a7-62ab0f862e52]   User Load (0.1ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ?  ORDER BY "users"."id" ASC LIMIT 1  [["id", 1]]
    [830bb7df-b760-4537-94a7-62ab0f862e52] [CU_1]   User Load (0.1ms)  SELECT "users".* FROM "users"
    [830bb7df-b760-4537-94a7-62ab0f862e52] [CU_1]   Rendered users/_user.html.erb (0.2ms)
    [830bb7df-b760-4537-94a7-62ab0f862e52] [CU_1]   Rendered users/index.html.erb within layouts/application (1.3ms)
    [830bb7df-b760-4537-94a7-62ab0f862e52] [CU_1]   Rendered layouts/_navigation_links.html.erb (0.1ms)
    [830bb7df-b760-4537-94a7-62ab0f862e52] [CU_1]   Rendered layouts/_nav_links_for_auth.html.erb (0.2ms)
    [830bb7df-b760-4537-94a7-62ab0f862e52] [CU_1]   Rendered layouts/_navigation.html.erb (1.8ms)
    [830bb7df-b760-4537-94a7-62ab0f862e52] [CU_1]   Rendered layouts/_messages.html.erb (0.0ms)
    [830bb7df-b760-4537-94a7-62ab0f862e52] Completed 200 OK in 85ms (Views: 83.6ms | ActiveRecord: 0.2ms)
    

    在多用户应用程序中,我会推荐以下标签:

    • 请求 ID
    • 当前用户 ID(例如 CU_1
    • 当前管理员 ID(例如 AD_8

    【讨论】:

    • 在这种情况下什么是“ExampleService”? Rails 模型?
    • ExampleService 是一个负责计算标签的类。当逻辑变得复杂时,建议这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多