Class: SemanticLogger::Appender::Http
- Inherits:
-
Subscriber
- Object
- Base
- Subscriber
- SemanticLogger::Appender::Http
- Defined in:
- lib/semantic_logger/appender/http.rb
Overview
Log to any HTTP(S) server that accepts log messages in JSON form
Features:
-
JSON Formatted messages.
-
Uses a persistent http connection, if the server supports it.
-
SSL encryption (https).
Example:
SemanticLogger.add_appender(
appender: :http,
url: 'http://localhost:8088/path'
)
Direct Known Subclasses
Instance Attribute Summary collapse
-
#application ⇒ Object
Returns the value of attribute application.
-
#compress ⇒ Object
Returns the value of attribute compress.
-
#continue_timeout ⇒ Object
Returns the value of attribute continue_timeout.
-
#header ⇒ Object
Returns the value of attribute header.
-
#host ⇒ Object
Returns the value of attribute host.
-
#http ⇒ Object
readonly
Returns the value of attribute http.
-
#open_timeout ⇒ Object
Returns the value of attribute open_timeout.
-
#path ⇒ Object
readonly
Returns the value of attribute path.
-
#port ⇒ Object
readonly
Returns the value of attribute port.
-
#read_timeout ⇒ Object
Returns the value of attribute read_timeout.
-
#server ⇒ Object
readonly
Returns the value of attribute server.
-
#ssl_options ⇒ Object
readonly
Returns the value of attribute ssl_options.
-
#url ⇒ Object
readonly
Returns the value of attribute url.
-
#username ⇒ Object
Returns the value of attribute username.
Attributes inherited from Subscriber
Attributes inherited from Base
Instance Method Summary collapse
-
#initialize(options, &block) ⇒ Http
constructor
Create HTTP(S) log appender.
-
#log(log) ⇒ Object
Forward log messages to HTTP Server.
-
#reopen ⇒ Object
Re-open after process fork.
Methods inherited from Subscriber
Methods inherited from Base
#fast_tag, #level, #level=, #measure, #payload, #pop_tags, #push_tags, #silence, #tagged, #tags, #with_payload
Constructor Details
#initialize(options, &block) ⇒ Http
Create HTTP(S) log appender
Parameters:
url: [String]
Valid URL to post to.
Example: http://example.com/some_path
To enable SSL include https in the URL.
Example: https://example.com/some_path
verify_mode will default: OpenSSL::SSL::VERIFY_PEER
application: [String]
Name of this application to appear in log messages.
Default: SemanticLogger.application
host: [String]
Name of this host to appear in log messages.
Default: SemanticLogger.host
username: [String]
User name for basic Authentication.
Default: nil ( do not use basic auth )
password: [String]
Password for basic Authentication.
compress: [true|false]
Whether to compress the JSON string with GZip.
Default: false
ssl: [Hash]
Specific SSL options: For more details see NET::HTTP.start
ca_file, ca_path, cert, cert_store, ciphers, key, ssl_timeout,
ssl_version, verify_callback, verify_depth and verify_mode.
level: [:trace | :debug | :info | :warn | :error | :fatal]
Override the log level for this appender.
Default: SemanticLogger.default_level
formatter: [Object|Proc]
An instance of a class that implements #call, or a Proc to be used to format
the output from this appender
Default: Use the built-in formatter (See: #call)
filter: [Regexp|Proc]
RegExp: Only include log messages where the class name matches the supplied.
regular expression. All other messages will be ignored.
Proc: Only include log messages where the supplied Proc returns true
The Proc must return true or false.
open_timeout: [Float]
Default: 2.0
read_timeout: [Float]
Default: 1.0
continue_timeout: [Float]
Default: 1.0
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/semantic_logger/appender/http.rb', line 80 def initialize(, &block) = .dup @url = .delete(:url) @ssl_options = .delete(:ssl) @username = .delete(:username) @password = .delete(:password) @compress = .delete(:compress) || false @open_timeout = .delete(:open_timeout) || 2.0 @read_timeout = .delete(:read_timeout) || 1.0 @continue_timeout = .delete(:continue_timeout) || 1.0 raise(ArgumentError, 'Missing mandatory parameter :url') unless @url @header = { 'Accept' => 'application/json', 'Content-Type' => 'application/json', # On Ruby v2.0 and greater, Net::HTTP.new already uses a persistent connection if the server allows it 'Connection' => 'keep-alive', 'Keep-Alive' => '300' } @header['Content-Encoding'] = 'gzip' if @compress uri = URI.parse(@url) @server = uri.host raise(ArgumentError, "Invalid format for :url: #{@url.inspect}. Should be similar to: 'http://hostname:port/path'") unless @url @port = uri.port @username = uri.user if !@username && uri.user @password = uri.password if !@password && uri.password @path = uri.path if uri.scheme == 'https' @ssl_options ||= {} @ssl_options[:use_ssl] = true @ssl_options[:verify_mode] ||= OpenSSL::SSL::VERIFY_PEER @port ||= HTTP.https_default_port else @port ||= HTTP.http_default_port end @http = nil # Pass on the level and custom formatter if supplied super() reopen end |
Instance Attribute Details
#application ⇒ Object
Returns the value of attribute application.
19 20 21 |
# File 'lib/semantic_logger/appender/http.rb', line 19 def application @application end |
#compress ⇒ Object
Returns the value of attribute compress.
19 20 21 |
# File 'lib/semantic_logger/appender/http.rb', line 19 def compress @compress end |
#continue_timeout ⇒ Object
Returns the value of attribute continue_timeout.
19 20 21 |
# File 'lib/semantic_logger/appender/http.rb', line 19 def continue_timeout @continue_timeout end |
#header ⇒ Object
Returns the value of attribute header.
19 20 21 |
# File 'lib/semantic_logger/appender/http.rb', line 19 def header @header end |
#host ⇒ Object
Returns the value of attribute host.
19 20 21 |
# File 'lib/semantic_logger/appender/http.rb', line 19 def host @host end |
#http ⇒ Object (readonly)
Returns the value of attribute http.
21 22 23 |
# File 'lib/semantic_logger/appender/http.rb', line 21 def http @http end |
#open_timeout ⇒ Object
Returns the value of attribute open_timeout.
19 20 21 |
# File 'lib/semantic_logger/appender/http.rb', line 19 def open_timeout @open_timeout end |
#path ⇒ Object (readonly)
Returns the value of attribute path.
21 22 23 |
# File 'lib/semantic_logger/appender/http.rb', line 21 def path @path end |
#port ⇒ Object (readonly)
Returns the value of attribute port.
21 22 23 |
# File 'lib/semantic_logger/appender/http.rb', line 21 def port @port end |
#read_timeout ⇒ Object
Returns the value of attribute read_timeout.
19 20 21 |
# File 'lib/semantic_logger/appender/http.rb', line 19 def read_timeout @read_timeout end |
#server ⇒ Object (readonly)
Returns the value of attribute server.
21 22 23 |
# File 'lib/semantic_logger/appender/http.rb', line 21 def server @server end |
#ssl_options ⇒ Object (readonly)
Returns the value of attribute ssl_options.
21 22 23 |
# File 'lib/semantic_logger/appender/http.rb', line 21 def @ssl_options end |
#url ⇒ Object (readonly)
Returns the value of attribute url.
21 22 23 |
# File 'lib/semantic_logger/appender/http.rb', line 21 def url @url end |
#username ⇒ Object
Returns the value of attribute username.
19 20 21 |
# File 'lib/semantic_logger/appender/http.rb', line 19 def username @username end |
Instance Method Details
#log(log) ⇒ Object
Forward log messages to HTTP Server
151 152 153 154 155 |
# File 'lib/semantic_logger/appender/http.rb', line 151 def log(log) return false unless should_log?(log) post(formatter.call(log, self)) end |
#reopen ⇒ Object
Re-open after process fork
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/semantic_logger/appender/http.rb', line 127 def reopen # Close open connection if any begin @http.finish if @http rescue IOError end @http = Net::HTTP.new(server, port) if @ssl_options @http.methods.grep(/\A(\w+)=\z/) do |meth| key = $1.to_sym @ssl_options.key?(key) or next @http.__send__(meth, @ssl_options[key]) end end @http.open_timeout = @open_timeout @http.read_timeout = @read_timeout @http.continue_timeout = @continue_timeout @http.start end |