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

LoggerとLogrageを使用してRubyにログインする

Rubyでのログの操作

ロギングは、アプリケーションが通常対処する主要なタスクの1つです。ログは、たとえば、必要なときに使用されます

  • アプリ内で何が起こっているかを確認します
  • それらを監視する、または
  • 特定のデータの指標を収集します。

新しいプログラミング言語を学ぶとき、情報を記録するための最初の明白な選択は、ネイティブメカニズムです。通常、それは簡単で、文書化されており、コミュニティ全体に広く行き渡っています。

ログデータは、使用している会社、ビジネス、アプリケーションの種類によって大きく異なります。したがって、あなたとあなたのチームが選択したロギングソリューションがその全体的な使用にどのように影響するかを理解することは非常に重要です。

この記事では、組み込みのものから最愛のサードパーティコミュニティフレームワークまで、RubyとRailsのロギングで利用可能なオプションについて説明します。行きましょう!

ルビーの組み込みオプション

Rubyには、ロギングを処理するための2つの組み込みオプションがあります。印刷コマンド(コマンドラインシナリオ用に特別に設計されたもの)とLoggerクラスです。

それらを少し調べてみましょう。

コンソールへの印刷

Rubyには、コンソールにテキストを印刷する4つの一般的な方法があります。putsprintp 、およびpp

puts メソッドは、渡したものをすべて出力し、その後に新しい行を続けます:

2.7.0 :001 > puts "Hey, I'm a log!"
Hey, I'm a log!
 => nil

print メソッドはputsに似ています ただし、常にto_sを使用して引数を文字列に変換します メソッド。

最後に、p およびpp メソッドは両方とも、変換を実行せずに、渡した生のオブジェクトを出力します。唯一の違いは、後者は出力をよりインデントされた方法でフォーマットするのに対し、前者はフォーマットしないことです。

アプリケーションログ

サーバーで実行されているアプリケーションの場合、コンソールに印刷することは意味がありません。

代わりに、Loggerを使用します クラス、はるかに柔軟です。

これを使用して「デバッグ」ログを印刷する方法は次のとおりです。

require "logger"
logger = Logger.new(STDOUT)
logger.debug("I'm a debug log")

ログをファイルに保存するように構成したり、必要に応じてSTDOUTに出力する代わりに、ログアグリゲーターに送信したりすることもできます。

ご参考までに、「デバッグ」はログレベルです。ログレベルを使用すると、「このログメッセージは特定の種類のイベントに関連しています」とシステムに通知できます。組み込みのログレベルには、致命的、エラー、警告、情報、デバッグ、不明の6つがあります。

logger.debug("I'm a debug log")
logger.info("I'm an info log")
logger.warn("I'm a warn log")
logger.error("I'm an error log: error message")
logger.fatal("I'm a fatal log")

ログ出力を見ると、ログレベル、プロセスID、タイムスタンプが各行に追加されていることがわかります。

LoggerとLogrageを使用してRubyにログインする

もう1つの優れた機能は、Loggerを設定する機能です。 特定のレベルのオブジェクト:

logger.level = Logger::WARN

これを行うときは、Logger 警告以上のログのみを処理します 重要です。これは、サイズやセキュリティ上の理由から「デバッグ」ログを保存したくない本番環境で非常に役立ちます。

これが出力になります:

LoggerとLogrageを使用してRubyにログインする

ログのカスタマイズ

ログをカスタマイズしたい場合は、たくさんのオプションがあります。たとえば、日付と時刻を変更するには、デフォルトのものを上書きするだけです。

logger.datetime_format = "%Y-%m-%d %H:%M"

出力の例を次に示します。

W, [2020-07-28 10:50#87786]  WARN -- : I'm a warn log

date_time フォーマットは標準仕様に準拠しているため、このような変更を行う場合は必ず参照してください。

ただし、ログの形式を完全に変更する必要がある場合もあります。この目的のために、RubyはFormatterクラスを提供します。これは、開発者がデフォルトのテンプレートであるLoggerを上書きできるようにすることで機能します。 ログの印刷に使用します。

アプリが一元化されたログ分析ツールを利用しており、すべてのログをname=valueに印刷する必要があるとします。 フォーマット。これは新しいフォーマッタコードになります:

logger.formatter = proc do |severity, datetime, progname, msg|
    date_format = datetime.strftime("%Y-%m-%d %H:%M:%S")
    "date=[#{date_format}] severity=#{severity.ljust(5)} pid=##{Process.pid} message='#{msg}'\n"
end

ここでは、procを使用しています すべてのログをインターセプトし、デフォルトの印刷方法を目的のログに変更します。これで、次の結果が得られました。

LoggerとLogrageを使用してRubyにログインする

ほんの数行のコードで、すべてのアプリログをツールでインデックスに登録できるようになりました。

JSONへのログ記録

Formatterの力で 手元にあるので、ログを必要な出力タイプに簡単にカスタマイズできます。たとえば、JSONモジュールを使用して、ログをその形式で出力できます。

require "json"
logger.formatter = proc do |severity, datetime, progname, msg|
    date_format = datetime.strftime("%Y-%m-%d %H:%M:%S")
    JSON.dump(date: "#{date_format}", severity:"#{severity.ljust(5)}", pid:"##{Process.pid}", message: msg) + "\n"
end

そして、結果のログは次のとおりです。

LoggerとLogrageを使用してRubyにログインする

ファイルへのログ記録

前に見たように、Logger コンストラクターは、最初の引数として、ログを格納する場所を受け取ります。

ログをファイルに保存する場合は、次のように言ってください:

require 'logger'
logger = Logger.new('my_logs.log')

これにより、新しいファイル my_logs.log が作成されます このコードを含むRubyファイルが置かれているのと同じフォルダにあります:

LoggerとLogrageを使用してRubyにログインする

ただし、このクラスでは、保持ポリシーの構成など、多数のカスタムオプションも使用できます。次の例を見てください:

# Keep data for the current week.
Logger.new('my_weekly_logs.log', 'weekly')
# Keep data for today and the past 2 months.
Logger.new('my_latest_2_months_logs.log', 2, 'monthly')
# Restarts the log over when it exceeds 26GB in size.
Logger.new('my_custom_logs.log', 0, 20 * 1024 * 1024 * 1024)

2番目のパラメーターとして、Logger ログを保持または消去する頻度の定義を受け入れます。

最初のオブジェクトでは、ログは1週間だけ保持されます。 2つ目は、2か月の範囲でファイルを保存しますが、最新のものは、3つ目のパラメータに基づいて、ファイルのサイズだけを分析します(たとえば、20 GBに達すると、破棄されます)。

RubyonRailsでのログイン

Loggerのメリットのほとんど これまで見てきたように、すべてRailsアプリと一緒に使用できます。 RailsバージョンのLogger これは、Rubyのネイティブクラスの単純な拡張です。

それとは別に、Railsは、開発者がログを複数のロガーにブロードキャストできるようにする優れた機能も追加します。したがって、複数のログライブラリを操作する場合は、Rails logger内で操作できます。 :

custom_logger = Logger.new(STDOUT)
Rails.logger.extend(ActiveSupport::Logger.broadcast(custom_logger))

これは、ログを移動する場所に関するインテリジェンスが必要な場合にも役立ちます。アプリの一部では、さまざまな場所やさまざまな形式のログが必要になる場合があります。

サードパーティのログフレームワークの選択

Rubyの組み込みロガーが必要なことを正確に実行しない場合は、オプションがあります。

サードパーティのロギングフレームワークを選択する場合、多くのオプションがあります。これらの中で最も人気があるのはLogrageです。見てみましょう!

Logrageの最初のステップ

LogrageはRailsアプリ用に作成されました。バニラルビーを使用している場合、それは良い選択ではないかもしれません。

インストールするには、次のgemを追加するだけです:

bundle add lograge

次に、 config / initializers / lograge.rbに新しい構成ファイルを作成します。 次のコードで:

Rails.application.configure do
    config.lograge.enabled = true
    config.lograge.custom_options = lambda do |event|
        { time: event.time }
    end
end

この構成により、Logrageが有効になり、フレームワークのイベントと見なされるログを印刷する必要がある時間が定義されます。

Railsアプリを起動して最初のエンドポイントにアクセスすると、Logrageはリクエストの概要を出力します。 Logrageのセットアップ前後のログをそれぞれ比較すると、次のようになります。

LoggerとLogrageを使用してRubyにログインする

繰り返しますが、Logrageは特効薬ではありません。それは実際には非常に意見の分かれるフレームワークです。そのため、組み込みのLoggerと一緒に使用する必要があります。 (またはお好みの他のフレームワーク)

まとめ

結局、ロギングはプロジェクトの重要な部分であるだけでなく、非常に過小評価されていることが明らかになります。ネイティブであるかどうかに関係なく、使用しているツールをよりよく理解することは、より良い結果を達成するのにも役立ちます。

新しいフレームワークを採用するために、常に多くのテストを実施してください。プラットフォームには、優れた組み込みオプションがすでにバンドルされている場合があります。そうでない場合は、すでに内部にあるフレームワークと統合された他のフレームワークの使用を許可するかどうかを判断します。

頑張ってください!


  1. TCmallocを使用したRubyのメモリ割り当てのプロファイリング

    Rubyではメモリ割り当てはどのように機能しますか? Rubyはページと呼ばれるチャンクでメモリを取得し、新しいオブジェクトはここに保存されます。 次に… これらのページがいっぱいになると、より多くのメモリが必要になります。 Rubyは、mallocを使用してオペレーティングシステムからより多くのメモリを要求します 機能。 このmalloc 関数はオペレーティングシステム自体の一部ですが、使用できる代替の実装があります。 それらの実装の1つは、Googleのtcmallocです。 TCmallocはGoogleパフォーマンスツールスイートの一部です。 これらのツールを使用し

  2. Rubyでパーサーを構築する方法

    構文解析は、一連の文字列を理解し、それらを理解できるものに変換する技術です。正規表現を使用することもできますが、必ずしもその仕事に適しているとは限りません。 たとえば、HTMLを正規表現で解析することはおそらく良い考えではないことは一般的な知識です。 Rubyには、この作業を実行できるnokogiriがありますが、独自のパーサーを作成することで多くのことを学ぶことができます。始めましょう! Rubyでの解析 パーサーの中核はStringScannerです クラス。 このクラスは、文字列のコピーと位置ポインタを保持します。ポインタを使用すると、特定のトークンを検索するために文字列をトラバ