Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

ログが読めない混乱にならないようにする

奇妙な、一見解決できないバグに遭遇した場合、ログを改善することが最善のステップになる可能性があります。 優れたロギングは、バグのクラス全体を検出して修正する最も簡単な方法です。 十分な情報をログに記録すると、リクエスト中にデータがどのように変化するかを確認できます。他のサービスへの通話を追跡し、応答を調査できます。実際、デバッガーが失敗したとき、ロギングは私が今まで遭遇した中で最も困難なバグを修正するのに役立ちました。

ただし、ログを記録しすぎると、ログファイルがすぐに読めない、役に立たないメッセージの寄せ集めになります。 気になる情報だけをそのデータの山からどのように切り取ることができますか?後で簡単にフィルタリングできる方法でメッセージを印刷できますか?

ログメッセージのマーキング

RailsにはTaggedLoggingが含まれており、関連するログメッセージをすばやく分類するのに役立ちます。 ロガーにタグを付けると、メッセージの先頭にマーカーが表示されます。代わりに:

Finding people...
  Person Load (0.3ms)  SELECT "people".* FROM "people"
Found 0 people!

Railsロガーにタグを付けることができます:

logger.tagged("People") do
  logger.debug "Finding people..."
  @people = Person.all
  logger.debug "Found #{@people.length} people!"
end

そして、次のようなものが表示されます:

[People] Finding people...
[People]   Person Load (0.3ms)  SELECT "people".* FROM "people"
[People] Found 0 people!

これで、さまざまなことに関心のあるログメッセージを見ることができます。 違います。

いくつかのタグ付きロガーの例

より頻繁にログを記録し、より複雑なものをログに記録すると、それらのタグがメッセージをより明確にする領域に自然に気付くでしょう。 しかし、タグ付きロギングが特に役立つと思った場所がいくつかあります。 通常、すぐにタグを付けます。

他のAPIへのリクエストをログに記録できます:

logger.tagged("GitHub API") do
  uri = URI("https://api.github.com/repos/rails/rails/tags")

  logger.info { "Fetching #{uri}" }
  tags = JSON.parse(Net::HTTP.get(uri))
  logger.info { "First tag: #{tags.first["name"]}" }
end
[GitHub API] Fetching https://api.github.com/repos/rails/rails/tags
[GitHub API] First tag: v4.2.4.rc1

そうすれば、アプリがそのAPIといつどのように通信しているかを簡単に確認できます。

(これは、ファラデーミドルウェアで、またはゲートウェイを介してのみサーバーと通信する場合に特に効果的です。)

バックグラウンドジョブは、タグ付きロギングでもうまく機能します:

require "active_support/tagged_logging"

Resque.logger = ActiveSupport::TaggedLogging.new(Resque.logger)

module LoggedJob
  def around_perform_log_job(*args)
    logger.tagged(name) do
      logger.info { "Performing #{name} with #{args.inspect}" }
      yield
    end
  end
end

class MyJob
  extend LoggedJob

  def self.perform(*args)
    ...
  end
end

これで、LoggedJobを拡張するジョブには、すべてのログメッセージにジョブのクラス名のタグが付けられます。

ログインしているユーザーがいる場合は、そのユーザーIDでメッセージにタグを付けることができます:

logger.tagged(current_user_id ? "user-#{current_user_id}" : "user-anonymous") do
  logger.debug "Finding people..."
  @people = Person.all
  logger.debug "Found #{@people.length} people!"
end
[user-123] Finding people...
[user-123]   Person Load (0.3ms)  SELECT "people".* FROM "people"
[user-123] Found 0 people!

最後に、config/environments/production.rbに行を追加した場合 (またはdevelopment.rb )、Railsにメッセージに自動的にタグを付けることができます:

config.log_tags = [ :subdomain, :uuid ]

log_tags すべてのRailsログエントリの先頭に表示するタグを一覧表示します。各シンボルはActionDispatch::Requestのメソッドを参照しているため、:uuid request.uuidを意味します 。

requestを受け取るProcを渡すこともできます オブジェクト:

config.log_tags = [ :subdomain, :uuid, lambda { |request| request.headers["User-Agent"] } ]

しかし、私はそれほど頻繁には見ません。

これらのデフォルトのタグは素晴らしいです:uuid 1つのリクエストで発生するすべてのログエントリを結び付けることができます。サーバーでセッションを維持している場合は、セッションIDも役立ちます。 これらのタグと十分なメッセージがあれば、アプリ内の非常に複雑なパスをたどることができます。 そして通常、それは厄介なバグがどのように起こったかを理解するために必要なことです。

アプリでRailsロガーをどのくらい使用していますか?タグ付きロギングを試しましたか?まだの場合は、その場所を探してみてください。 ユーザーが実行したアクションにタグを付けることは良いスタートです。 次回、クレイジーなマルチステップのバグをデバッグする必要があるときに役立ちます。

ロギングやその他のデバッグ手法について詳しく知りたい場合は、アプリの作成時に発生するエラーを見つけて修正するために、「レールの練習」の章全体を取り上げました。 ここで最初の章を無料で入手してください。


  1. Windows 10 で PC からマルウェアを削除する方法

    マルウェアは、コンピュータやネットワークに損害を与えるように設計された、悪意のあるソフトウェアです。コンピューターをマルウェアから安全に保つための戦略の 1 つは、マルウェアがコンピューターにアクセスできないようにすることです。これは、ファイアウォールとウイルス対策ソフトウェアを使用して行われます。しかし、一度感染すると、マルウェアを簡単に削除することはできません。これは、マルウェアがコンピュータに隠れたままになり、アンチウイルス スキャンを逃れる可能性さえあるためです。そのため、正しい手順に従ってマルウェアを駆除することが非常に重要です。 コンピュータがマルウェアに感染しているかどうか

  2. ノートパソコンの過熱を防ぐ方法

    ほとんどの場合、過熱はラップトップの経年劣化によるものです。古いラップトップは、ブルー スクリーンやデータ損失など、多くの問題に直面しています。根本的な原因を突き止めることさえできず、いつの間にかマザーボードが燃え尽きてしまっていることがあります。 ラップトップの過熱を診断して修正する方法について説明しましょう。なぜなら予防は治療に勝るからです。 ノートパソコンが過熱する原因 ラップトップが過熱する原因はいくつかありますが、内部冷却が不十分である、ほこりやその他の粒子が通気孔、ファン、排気ポートまたはラジエーターを詰まらせている可能性が高いです. ラップトップが過熱していることを確認する方