Skip to content

Instantly share code, notes, and snippets.

@mosson
Last active August 29, 2015 14:17
Show Gist options
  • Save mosson/a27f6853c6d8cf1c52b0 to your computer and use it in GitHub Desktop.
Save mosson/a27f6853c6d8cf1c52b0 to your computer and use it in GitHub Desktop.
こんな感じかな
# -*- coding: utf-8 -*-
require 'fluent-logger'
require 'active_support/core_ext'
require 'forwardable'
module Mosson
module FluentLogger
module ModuleMethods
def new(file = Rails.root.join("config", "fluent-logger.yml.erb"))
ActiveSupport::TaggedLogging.new(logger(file))
end
def config(file)
YAML.load(ERB.new(file.read).result)[Rails.env]
end
def settings(file)
config(file).slice('tag', 'host', 'port', 'type')
end
def level
::Logger::SEV_LABEL.index(Rails.application.config.log_level.to_s.upcase)
end
def logger(file)
Mosson::Logger.new(settings(file), level)
end
end
extend ModuleMethods
end
class Logger < ActiveSupport::Logger
extend Forwardable
# logger.rb L.237
# attr_accessor :level
attr_reader :port, :host, :type, :tag, :severity, :messages
def_delegators :fluent_logger,
:post,
:close
def initialize(options, level)
@host, @port, @tag = options[:host], optins[:port], options[:tag]
@type = (options[:messages_type] || :array).to_sym
@level = level
@severity, @messages = 0, []
end
def fluent_logger
@fluent_logger ||= ::Fluent::Logger::FluentLogger.new(
nil,
host: host,
port: port
)
end
# === super: Logger#add
# === Args
#
# +severity+::
# Severity. Constants are defined in Logger namespace: +DEBUG+, +INFO+,
# +WARN+, +ERROR+, +FATAL+, or +UNKNOWN+.
# +message+::
# The log message. A String or Exception.
# +progname+::
# Program name string. Can be omitted. Treated as a message if no
# +message+ and +block+ are given.
# +block+::
# Can be omitted. Called to get a message string if +message+ is nil.
#
# === Return
#
# When the given severity is not high enough (for this particular logger),
# log no message, and return +true+.
def add(_severity, message = nil, progname = nil, &block)
return true if severity < level
message = (block_given? ? block.call : progname ) if message.blank?
add_message(message)
true
end
def add_message(message)
if message.to_s.encoding == Encoding::UTF_8
messages << message
else
messages << message.dup.force_encoding(Encoding::UTF_8)
end
end
def flush
return if messages.empty?
post(
tag,
message: post_messages,
level: format_severity(severity)
)
@severity = 0
messages.clear
end
def post_messages
if @messages_type == :string
messages.join("\n")
else
messages
end
end
def format_severity(severity)
::Logger::SEV_LABEL[severity] || 'ANY'
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment