Sha256: 804681ff23b2393ea26fe1a41ba08348061a1532cf6e9ef55cd2141bb37bf170

Contents?: true

Size: 1.67 KB

Versions: 2

Compression:

Stored size: 1.67 KB

Contents

# frozen_string_literal: true

module SlackWebhookLogger
  class Formatter < ::Logger::Formatter
    attr_writer :format

    MAX_LENGTH = 20000

    def format
      @format ||= proc do |severity, time, _progname, msg|
        heading = case severity
        when "FATAL"
          "📛 *#{severity}*"
        when "ERROR"
          "🛑 *#{severity}*"
        when "WARN"
          "⚠ī¸ *#{severity}*"
        when "INFO"
          "ℹī¸ *#{severity}*"
        when "DEBUG"
          "🐛 *#{severity}*"
        else
          "đŸĒĩ *Logger*"
        end

        title = "#{heading} (#{time}) [#{ENV.fetch("RAILS_ENV", nil)}]"

        text = <<~MSG
          #{msg2str(msg)}
        MSG

        slackify(truncate(title), truncate(text))
      end
    end

    def call(severity, time, progname, msg)
      format.call(severity, time, progname, msg)
    end

    def slackify(title, text)
      {
        text: [title, text].join("\n").to_s,
        blocks: [
          {
            type: "section",
            text: {
              type: "mrkdwn",
              text: title,
            },
          },
          {
            type: "divider",
          },
          {
            type: "section",
            text: {
              type: "plain_text",
              text: text,
            },
          },
        ],
      }
    end

    private def msg2str(msg)
      case msg
      when ::String
        msg
      when ::Exception
        "#{msg.message} (#{msg.class})\n" <<
          (msg.backtrace || []).join("\n")
      else
        msg.inspect
      end
    end

    private def truncate(string)
      string.length > MAX_LENGTH ? "#{string[0...MAX_LENGTH]}..." : string
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
slack_webhook_logger-0.5.4 lib/slack_webhook_logger/formatter.rb
slack_webhook_logger-0.5.2 lib/slack_webhook_logger/formatter.rb