class Fluent::Syslog
Constants
- DISCARD_STRING
declare const string for nullifying token if we decide to discard records
Attributes
sockets[RW]
Public Instance Methods
configure(conf)
click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_syslog.rb, line 31 def configure(conf) super # parses fluent config end
create_packet(tag, time, record)
click to toggle source
# File lib/fluent/plugin/out_syslog.rb, line 75 def create_packet(tag, time, record) # construct Syslog RFC 5424 compliant packet from fluent record, see: # https://tools.ietf.org/html/rfc5424 # example: # '<134>1 2018-05-10T21:11:58-05:00 mysite.com myapp procid msgid \ # [xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx@41058 tag="syslog"] \ # message' if record.dig('log') begin record['message'] = record['log'] record.delete('log') end end if record.dig('levelname') begin record['level'] = record['levelname'] record.delete('levelname') end end if @parse_json begin parser = Yajl::Parser.new parsed_message = parser.parse(record['message']) if parsed_message.is_a?(Hash) record = record.merge(parsed_message) end rescue Yajl::ParseError end end pri = 134 # 134 is hardcoded facility local0 and severity info version = 1 # Syslog Protocol v1 record_time = time ? Time.at(time) : Time.now timestamp = record_time.to_datetime.rfc3339 hostname = @syslog_hostname || '-' app_name = @syslog_app || tag || '-' procid = '-' # set procid and msgid to NILVALUE msgid = '-' pen = @syslog_pen tag = @syslog_tag ? " tag=\"#{@syslog_tag},fluentd\"" : '' # write tag only if passed in through config token = @syslog_token ? " key=\"#{@syslog_token}\"" : '' structured_data = "[#{pen} #{token} #{tag}]" msg = Yajl.dump(record) "<#{pri}>#{version} #{timestamp} #{hostname} #{app_name} #{procid} #{msgid} #{structured_data} #{msg}\n" end
create_socket(host, port)
click to toggle source
# File lib/fluent/plugin/out_syslog.rb, line 58 def create_socket(host, port) log.info "initializing tcp socket for #{host}:#{port}" begin socket = TCPSocket.new(host, port) log.debug "enabling ssl for socket #{host}:#{port}" ssl = OpenSSL::SSL::SSLSocket.new(socket) # close tcp and ssl socket when either fails ssl.sync_close = true # initiate SSL/TLS handshake with server ssl.connect rescue => e log.warn "failed to create tcp socket #{host}:#{port}: #{e}" ssl = nil end ssl end
format(tag, time, record)
click to toggle source
# File lib/fluent/plugin/out_syslog.rb, line 47 def format(tag, time, record) [tag, time, record].to_msgpack end
send_to_syslog(packet)
click to toggle source
# File lib/fluent/plugin/out_syslog.rb, line 125 def send_to_syslog(packet) # recreate the socket if it's nil @socket ||= create_socket(@syslog_host, @syslog_port) if @socket.nil? err_msg = "Unable to create socket with #{@syslog_host}:#{@syslog_port}" raise SocketFailureError, err_msg else begin # send it @socket.write packet rescue => e # socket failed, reset to nil to recreate for the next write @socket = nil err_msg = "Closing socket. #{e.class} writing to '#{@syslog_host}:#{@syslog_port}': #{e}" raise SocketFailureError, err_msg, e.backtrace end end end
shutdown()
click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_syslog.rb, line 42 def shutdown super @socket.close end
start()
click to toggle source
Calls superclass method
# File lib/fluent/plugin/out_syslog.rb, line 36 def start super # create initial socket based on config param @socket = create_socket(@syslog_host, @syslog_port) end
write(chunk)
click to toggle source
# File lib/fluent/plugin/out_syslog.rb, line 51 def write(chunk) chunk.msgpack_each { |(tag, time, record)| packet = create_packet(tag, time, record) send_to_syslog(packet) } end