Semantic Logger

Rubyと Rails向けの包括的ロギングインターフェース。人間読み取り可能なカラフルテキストログと機械読み取り可能なJSONログを同時出力。複数の出力先への同時書き込み、メモリ内キューによる高性能処理(毎秒数千行)を実現。

ロギングRubyRails構造化ログ高性能

ロギングライブラリ

Semantic Logger

概要

Semantic LoggerはRubyとRails向けの包括的ロギングインターフェースです。人間読み取り可能なカラフルテキストログと機械読み取り可能なJSONログを同時出力し、複数の出力先への同時書き込み、メモリ内キューによる高性能処理(毎秒数千行)を実現します。

詳細

Semantic Loggerは従来のRubyロギングライブラリの制約を克服するために設計された次世代ロギングフレームワークです。主要な特徴として、専用スレッドでのログ処理により、アプリケーションの主処理に影響を与えることなく高スループットを実現します。

主要機能

  • 多出力先サポート: Sentry、syslog、DataDog、Splunk、Elasticsearch、MongoDB等への専用アペンダー
  • 構造化ログ: JSON、カラー、カスタムフォーマッターによる柔軟な出力形式
  • 非同期処理: 別スレッドでのログ処理による高パフォーマンス
  • Rails統合: rails_semantic_loggerによるシームレスなRails統合
  • 多様なアペンダー: HTTP、TCP、UDP、Kafka、RabbitMQ等の豊富な出力先

メリット・デメリット

メリット

  • 高性能: メモリ内キューと非同期処理により毎秒数千行の処理が可能
  • 豊富な出力先: 15以上の組み込みアペンダーで様々なサービスに対応
  • 構造化ログ: JSON出力による機械読み取り可能なログ形式
  • 設定の柔軟性: アペンダー毎の詳細な設定とフィルタリング機能
  • Rails統合: 既存のRailsアプリケーションへの簡単な導入
  • メトリクス機能: パフォーマンス測定とメトリクス収集機能内蔵

デメリット

  • 学習コスト: 豊富な機能により初期設定が複雑になる場合がある
  • メモリ使用量: 非同期処理のためのキューがメモリを消費
  • 依存関係: 一部のアペンダーは追加gemが必要

参考ページ

書き方の例

基本的な設定

require 'semantic_logger'

# グローバルデフォルトログレベルの設定
SemanticLogger.default_level = :trace

# ファイルアペンダーの追加(カラーフォーマッター使用)
SemanticLogger.add_appender(file_name: 'development.log', formatter: :color)

# ロガーインスタンスの作成
logger = SemanticLogger['MyClass']
logger.info "Hello World"

複数アペンダーの設定

# ファイルとSyslogサーバーへの同時出力
SemanticLogger.add_appender(file_name: "development.log", formatter: :color)
SemanticLogger.add_appender(appender: :syslog, url: "tcp://myloghost:514")

# JSON形式でのファイル出力
SemanticLogger.add_appender(file_name: "app.json", formatter: :json)

構造化ログの使用

logger = SemanticLogger['UserService']

# 構造化データ付きログ
logger.info "User login", 
  user_id: 12345, 
  ip_address: "192.168.1.100",
  user_agent: "Mozilla/5.0..."

# メトリクス付きパフォーマンス測定
logger.measure_info "Database query" do
  User.find(12345)
end

カスタムアペンダーの実装

class SimpleAppender < SemanticLogger::Subscriber
  def initialize(host: nil, **args, &block)
    @host = host
    super(**args, &block)
  end

  def log(log)
    # ログ構造の表示
    p log
    
    # フォーマット済み出力の表示
    puts formatter.call(log)
  end

  def flush
    puts "Flush executed"
  end

  def close
    puts "Appender closing"
  end
end

# カスタムアペンダーの追加
SemanticLogger.add_appender(appender: SimpleAppender.new)

アペンダー別ログレベル設定

# 警告レベル以上をwarnings.logに出力
SemanticLogger.add_appender(file_name: "log/warnings.log", level: :warn)

# トレースレベル以上をtrace.logに出力
SemanticLogger.add_appender(file_name: "log/trace.log", level: :trace)

logger = SemanticLogger["MyClass"]
logger.level = :trace
logger.trace "詳細なトレース情報"
logger.warn "警告メッセージ"

外部サービス統合

# Elasticsearch統合
SemanticLogger.add_appender(
  appender:    :elasticsearch,
  url:         "http://localhost:9200",
  index:       "my-app-logs",
  data_stream: true
)

# Sentry統合
SemanticLogger.add_appender(appender: :sentry_ruby)

# HTTP エンドポイント統合
SemanticLogger.add_appender(
  appender: :http,
  url:      "https://api.example.com/logs",
  formatter: :json
)