remote_syslog_sender_ms 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 9c293d5b6bca01f37f10bc8313a65b85cb499cf941ce0d214d971a7ac97d862b
4
+ data.tar.gz: 3801f0a6540c44f28e3459da2c678af6a9f44c2777c3ea4224208ce5d8e60f34
5
+ SHA512:
6
+ metadata.gz: 5a1eaabdb44e22dc8927b18198bbc84165914ec80f937b6b5987050c5ec13441395b36f9f05aae203db74b496d665df488b1e8e90fb4cef4cb1df8568b475a42
7
+ data.tar.gz: 4e268997351dd9059c6107c205f3084bee515ca43afc59f55e028cb0d51a8ed389502f95fb63c4c8363239173a78d36ca1c019342b1ca53b4c088e15eb36236c
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ Gemfile.lock
2
+ .bundle
3
+ pkg
4
+
5
+ .idea
6
+ vendor
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gemspec
4
+
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License
2
+
3
+ Copyright (c) 2017 joker1007
4
+ Original Copyright (c) 2011 Eric Lindvall
5
+
6
+ Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ of this software and associated documentation files (the "Software"), to deal
8
+ in the Software without restriction, including without limitation the rights
9
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
+ copies of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be included in
14
+ all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,105 @@
1
+ # Remote Syslog Sender
2
+
3
+ This gem is syslog sender that is extracted from [papertrail/remote_syslog_logger](https://github.com/papertrail/remote_syslog_logger)
4
+
5
+ This can send message to remote syslog server via UDP, TCP, TCP+TLS.
6
+ (Original does not support TCP, TCP+TLS protocol).
7
+
8
+ ## Changes
9
+
10
+ Use [`syslog_protocol_ms`](https://github.com/torbencarstens/syslog_protocol_ms) instead of `syslog_protocol` ()
11
+
12
+ ## Installation
13
+
14
+ The easiest way to install `remote_syslog_sender_ms` is with Bundler. Add
15
+ `remote_syslog_sender_ms` to your `Gemfile`.
16
+
17
+ If you are not using a `Gemfile`, run:
18
+
19
+ $ [sudo] gem install remote_syslog_sender_ms
20
+
21
+
22
+ ## Usage
23
+
24
+ ```ruby
25
+ sender = RemoteSyslogSender.new('syslog.domain.com', 514) # default protocol is UDP
26
+ sender.transmit("message body")
27
+ # or
28
+ sender.write("message body")
29
+
30
+ ## TCP
31
+ sender = RemoteSyslogSender.new('syslog.domain.com', 514, protocol: :tcp)
32
+ sender.transmit("message body")
33
+
34
+ ## TCP+TLS
35
+ sender = RemoteSyslogSender.new('syslog.domain.com', 514, protocol: :tcp, tls: true, ca_file: "custom_ca.pem")
36
+ sender.transmit("message body")
37
+ ```
38
+
39
+ To point the logs to your local system, use `localhost` and ensure that
40
+ the system's syslog daemon is bound to `127.0.0.1`.
41
+
42
+
43
+ ## Limitations
44
+
45
+ If the specified host cannot be resolved, `syslog.domain.com` in the
46
+ example under the usage section above, `remote_syslog_sender_ms` will block
47
+ for approximately 20 seconds before displaying an error. This could
48
+ result in the application failing to start or even stopping responding.
49
+
50
+ Workarounds for this include:
51
+
52
+ * use an IP address instead of a hostname.
53
+ * put a hosts entry in `/etc/hosts` or equivalent, so that DNS is not
54
+ actually consulted
55
+ * instead of logging directly to the network, write to a file and
56
+ transmit new entries with a standalone daemon like
57
+ [remote_syslog](https://github.com/papertrail/remote_syslog),
58
+
59
+ ## Message length
60
+
61
+ All log lines are truncated to a maximum of 1024 characters. This restriction
62
+ comes from [RFC 3164 section 4.1][rfc-limit]:
63
+
64
+ > The total length of the packet MUST be 1024 bytes or less.
65
+
66
+ Additionally, the generally-accepted [MTU][] of the Internet is 1500 bytes, so
67
+ regardless of the RFC, UDP syslog packets longer than 1500 bytes would not
68
+ arrive. For details or to use TCP syslog for longer messages, see
69
+ [help.papertrailapp.com][troubleshoot].
70
+
71
+ [rfc-limit]: https://tools.ietf.org/html/rfc3164#section-4.1
72
+ [MTU]: (https://en.wikipedia.org/wiki/Maximum_transmission_unit)
73
+ [troubleshoot]: http://help.papertrailapp.com/kb/configuration/troubleshooting-remote-syslog-reachability/#message-length
74
+
75
+
76
+ ## Default program name
77
+
78
+ By default, the `program` value is set to the name and ID of the invoking
79
+ process. For example, `puma[12345]` or `rack[3456]`.
80
+
81
+ The `program` value is used to populate the syslog "tag" field, must be 32
82
+ or fewer characters. In a few cases, an artifact of how the app is launched
83
+ may lead to a default `program` value longer than 32 characters. For example,
84
+ the `thin` Web server may generate a default `program` value such
85
+ as:
86
+
87
+ thin server (0.0.0.0:3001)[11179]
88
+
89
+ If this occurs, the following exception will be raised when a
90
+ `RemoteSyslogSender` is instantiated:
91
+
92
+ Tag must not be longer than 32 characters (ArgumentError)
93
+
94
+ To remedy this, explicitly provide a `program` argument which is shorter than
95
+ 32 characters. See [Usage](#usage).
96
+
97
+
98
+ ## Contributing
99
+
100
+ Bug reports and pull requests are welcome on GitHub at https://github.com/torbencarstens/remote_syslog_sender_ms.
101
+
102
+
103
+ ## License
104
+
105
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rake/testtask'
4
+ Rake::TestTask.new(:test) do |test|
5
+ test.libs << 'lib' << 'test'
6
+ test.pattern = 'test/**/test_*.rb'
7
+ test.verbose = true
8
+ end
9
+
10
+ task :default => :test
@@ -0,0 +1,15 @@
1
+ require 'remote_syslog_sender_ms/udp_sender'
2
+ require 'remote_syslog_sender_ms/tcp_sender'
3
+
4
+ module RemoteSyslogSender
5
+ VERSION = '1.0.3'
6
+
7
+ def self.new(remote_hostname, remote_port, options = {})
8
+ protocol = options.delete(:protocol)
9
+ if protocol && protocol.to_sym == :tcp
10
+ TcpSender.new(remote_hostname, remote_port, options)
11
+ else
12
+ UdpSender.new(remote_hostname, remote_port, options)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,73 @@
1
+ require 'socket'
2
+ require 'syslog_protocol_ms'
3
+
4
+ module RemoteSyslogSender
5
+ class Sender
6
+ # To suppress initialize warning
7
+ class Packet < SyslogProtocol::Packet
8
+ def initialize(*)
9
+ super
10
+ @time = nil
11
+ end
12
+ end
13
+
14
+ attr_reader :socket
15
+ attr_accessor :packet
16
+
17
+ def initialize(remote_hostname, remote_port, options = {})
18
+ @remote_hostname = remote_hostname
19
+ @remote_port = remote_port
20
+ @whinyerrors = options[:whinyerrors]
21
+ @packet_size = options[:packet_size] || 1024
22
+
23
+ @packet = Packet.new
24
+
25
+ local_hostname = options[:hostname] || options[:local_hostname] || (Socket.gethostname rescue `hostname`.chomp)
26
+ local_hostname = 'localhost' if local_hostname.nil? || local_hostname.empty?
27
+ @packet.hostname = local_hostname
28
+
29
+ @packet.facility = options[:facility] || 'user'
30
+ @packet.severity = options[:severity] || 'notice'
31
+ @packet.tag = options[:tag] || options[:program] || "#{File.basename($0)}[#{$$}]"
32
+
33
+ @socket = nil
34
+ end
35
+
36
+ def transmit(message, packet_options = nil)
37
+ message.split(/\r?\n/).each do |line|
38
+ begin
39
+ next if line =~ /^\s*$/
40
+ packet = @packet.dup
41
+ if packet_options
42
+ packet.tag = packet_options[:program] if packet_options[:program]
43
+ packet.hostname = packet_options[:local_hostname] if packet_options[:local_hostname]
44
+ %i(hostname facility severity tag).each do |key|
45
+ packet.send("#{key}=", packet_options[key]) if packet_options[key]
46
+ end
47
+ end
48
+ packet.content = line
49
+ send_msg(packet.assemble(@packet_size))
50
+ rescue
51
+ if @whinyerrors
52
+ raise
53
+ else
54
+ $stderr.puts "#{self.class} error: #{$!.class}: #{$!}\nOriginal message: #{line}"
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ # Make this act a little bit like an `IO` object
61
+ alias_method :write, :transmit
62
+
63
+ def close
64
+ @socket.close
65
+ end
66
+
67
+ private
68
+
69
+ def send_msg(payload)
70
+ raise NotImplementedError, "please override"
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,157 @@
1
+ require 'socket'
2
+ require 'syslog_protocol_ms'
3
+ require 'remote_syslog_sender_ms/sender'
4
+
5
+ module RemoteSyslogSender
6
+ class TcpSender < Sender
7
+ class NonBlockingTimeout < StandardError; end
8
+
9
+ def initialize(remote_hostname, remote_port, options = {})
10
+ super
11
+ @tls = options[:tls]
12
+ @retry_limit = options[:retry_limit] || 3
13
+ @retry_interval = options[:retry_interval] || 0.5
14
+ @remote_hostname = remote_hostname
15
+ @remote_port = remote_port
16
+ @ssl_method = options[:ssl_method] || 'TLSv1_2'
17
+ @ca_file = options[:ca_file]
18
+ @verify_mode = options[:verify_mode]
19
+ @timeout = options[:timeout] || 600
20
+ @timeout_exception = !!options[:timeout_exception]
21
+ @exponential_backoff = !!options[:exponential_backoff]
22
+
23
+ @mutex = Mutex.new
24
+ @tcp_socket = nil
25
+
26
+ if [:SOL_SOCKET, :SO_KEEPALIVE, :IPPROTO_TCP, :TCP_KEEPIDLE].all? {|c| Socket.const_defined? c}
27
+ @keep_alive = options[:keep_alive]
28
+ end
29
+ if Socket.const_defined?(:TCP_KEEPIDLE)
30
+ @keep_alive_idle = options[:keep_alive_idle]
31
+ end
32
+ if Socket.const_defined?(:TCP_KEEPCNT)
33
+ @keep_alive_cnt = options[:keep_alive_cnt]
34
+ end
35
+ if Socket.const_defined?(:TCP_KEEPINTVL)
36
+ @keep_alive_intvl = options[:keep_alive_intvl]
37
+ end
38
+ connect
39
+ end
40
+
41
+ def close
42
+ @socket.close if @socket
43
+ @tcp_socket.close if @tcp_socket
44
+ end
45
+
46
+ private
47
+
48
+ def connect
49
+ connect_retry_count = 0
50
+ connect_retry_limit = 3
51
+ connect_retry_interval = 1
52
+ @mutex.synchronize do
53
+ begin
54
+ close
55
+
56
+ @tcp_socket = TCPSocket.new(@remote_hostname, @remote_port)
57
+
58
+ if @keep_alive
59
+ @tcp_socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_KEEPALIVE, true)
60
+ @tcp_socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPIDLE, @keep_alive_idle) if @keep_alive_idle
61
+ @tcp_socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPCNT, @keep_alive_cnt) if @keep_alive_cnt
62
+ @tcp_socket.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_KEEPINTVL, @keep_alive_intvl) if @keep_alive_intvl
63
+ end
64
+ if @tls
65
+ require 'openssl'
66
+ context = OpenSSL::SSL::SSLContext.new(@ssl_method)
67
+ context.ca_file = @ca_file if @ca_file
68
+ context.verify_mode = @verify_mode if @verify_mode
69
+
70
+ @socket = OpenSSL::SSL::SSLSocket.new(@tcp_socket, context)
71
+ @socket.connect
72
+ if @verify_mode != OpenSSL::SSL::VERIFY_NONE
73
+ @socket.post_connection_check(@remote_hostname)
74
+ raise "verification error" if @socket.verify_result != OpenSSL::X509::V_OK
75
+ end
76
+ else
77
+ @socket = @tcp_socket
78
+ end
79
+ rescue
80
+ if connect_retry_count < connect_retry_limit
81
+ sleep connect_retry_interval
82
+ connect_retry_count += 1
83
+ retry
84
+ else
85
+ raise
86
+ end
87
+ end
88
+ end
89
+ end
90
+
91
+ def send_msg(payload)
92
+ if @timeout && @timeout >= 0
93
+ method = :write_nonblock
94
+ else
95
+ method = :write
96
+ end
97
+
98
+ retry_limit = @retry_limit.to_i
99
+ retry_interval = @retry_interval.to_f
100
+ retry_count = 0
101
+
102
+ payload << "\n"
103
+ payload.force_encoding(Encoding::ASCII_8BIT)
104
+ payload_size = payload.bytesize
105
+
106
+ until payload_size <= 0
107
+ start = get_time
108
+ begin
109
+ result = @mutex.synchronize { @socket.__send__(method, payload) }
110
+ payload_size -= result
111
+ payload.slice!(0, result) if payload_size > 0
112
+ rescue IO::WaitReadable
113
+ timeout_wait = @timeout - (get_time - start)
114
+ retry if IO.select([@socket], nil, nil, timeout_wait)
115
+
116
+ raise NonBlockingTimeout if @timeout_exception
117
+ break
118
+ rescue IO::WaitWritable
119
+ timeout_wait = @timeout - (get_time - start)
120
+ retry if IO.select(nil, [@socket], nil, timeout_wait)
121
+
122
+ raise NonBlockingTimeout if @timeout_exception
123
+ break
124
+ rescue
125
+ if retry_count < retry_limit
126
+ sleep retry_interval
127
+ retry_count += 1
128
+ retry_interval *= 2 if @exponential_backoff
129
+ connect
130
+ retry
131
+ else
132
+ raise
133
+ end
134
+ end
135
+ end
136
+ end
137
+
138
+ POSIX_CLOCK =
139
+ if defined?(Process::CLOCK_MONOTONIC_COARSE)
140
+ Process::CLOCK_MONOTONIC_COARSE
141
+ elsif defined?(Process::CLOCK_MONOTONIC)
142
+ Process::CLOCK_MONOTONIC
143
+ elsif defined?(Process::CLOCK_REALTIME_COARSE)
144
+ Process::CLOCK_REALTIME_COARSE
145
+ elsif defined?(Process::CLOCK_REALTIME)
146
+ Process::CLOCK_REALTIME
147
+ end
148
+
149
+ def get_time
150
+ if POSIX_CLOCK
151
+ Process.clock_gettime(POSIX_CLOCK)
152
+ else
153
+ Time.now.to_f
154
+ end
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,18 @@
1
+ require 'socket'
2
+ require 'syslog_protocol_ms'
3
+ require 'remote_syslog_sender_ms/sender'
4
+
5
+ module RemoteSyslogSender
6
+ class UdpSender < Sender
7
+ def initialize(remote_hostname, remote_port, options = {})
8
+ super
9
+ @socket = UDPSocket.new
10
+ end
11
+
12
+ private
13
+
14
+ def send_msg(payload)
15
+ @socket.send(payload, 0, @remote_hostname, @remote_port)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = 'remote_syslog_sender_ms'
3
+ s.version = '1.3.0'
4
+ s.summary = "Message sender that sends directly to a remote syslog endpoint"
5
+ s.description = "Message sender that sends directly to a remote syslog endpoint (Support UDP, TCP, TCP+TLS)"
6
+
7
+ s.authors = ["Tomohiro Hashidate", "Eric Lindvall", "Torben Carstens"]
8
+ s.email = %w[kakyoin.hierophant@gmail.com rubygems@carstens.tech]
9
+ s.homepage = 'https://github.com/torbencarstens/remote_syslog_logger'
10
+
11
+ s.files = `git ls-files -z`.split("\x0")
12
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
13
+ s.executables = s.files.grep(%r{^bin/}) { |f| File.basename(f) }
14
+ s.require_paths = %w[lib]
15
+
16
+ s.add_runtime_dependency 'syslog_protocol_ms', '>= 0.10.0'
17
+
18
+ s.add_development_dependency "bundler", ">= 1.6", "< 3.0"
19
+ s.add_development_dependency "rake"
20
+ s.add_development_dependency "test-unit"
21
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,12 @@
1
+ $:.unshift File.expand_path('../../lib', __FILE__)
2
+
3
+ unless ENV['BUNDLE_GEMFILE']
4
+ require 'rubygems'
5
+ require 'bundler'
6
+ Bundler.setup
7
+ Bundler.require
8
+ end
9
+
10
+ require 'remote_syslog_sender_ms'
11
+
12
+ require 'test/unit'
@@ -0,0 +1,66 @@
1
+ require File.expand_path('../helper', __FILE__)
2
+
3
+ class TestRemoteSyslogSender < Test::Unit::TestCase
4
+ def setup
5
+ @server_port = rand(50000) + 1024
6
+ @socket = UDPSocket.new
7
+ @socket.bind('127.0.0.1', @server_port)
8
+
9
+ @tcp_server = TCPServer.open('127.0.0.1', 0)
10
+ @tcp_server_port = @tcp_server.addr[1]
11
+
12
+ @tcp_server_wait_thread = Thread.start do
13
+ @tcp_server.accept
14
+ end
15
+ end
16
+
17
+ def teardown
18
+ @socket.close
19
+ @tcp_server.close
20
+ end
21
+
22
+ def test_sender
23
+ @sender = RemoteSyslogSender.new('127.0.0.1', @server_port)
24
+ @sender.write "This is a test"
25
+
26
+ message, _ = *@socket.recvfrom(1024)
27
+ assert_match(/This is a test/, message)
28
+ end
29
+
30
+ def test_sender_long_payload
31
+ @sender = RemoteSyslogSender.new('127.0.0.1', @server_port, packet_size: 10240)
32
+ @sender.write "abcdefgh" * 1000
33
+
34
+ message, _ = *@socket.recvfrom(10240)
35
+ assert_match(/#{"abcdefgh" * 1000}/, message)
36
+ end
37
+
38
+ def test_sender_tcp
39
+ @sender = RemoteSyslogSender.new('127.0.0.1', @tcp_server_port, protocol: :tcp)
40
+ @sender.write "This is a test"
41
+ sock = @tcp_server_wait_thread.value
42
+
43
+ message, _ = *sock.recvfrom(1024)
44
+ assert_match(/This is a test/, message)
45
+ end
46
+
47
+ def test_sender_tcp_nonblock
48
+ @sender = RemoteSyslogSender.new('127.0.0.1', @tcp_server_port, protocol: :tcp, timeout: 20)
49
+ @sender.write "This is a test"
50
+ sock = @tcp_server_wait_thread.value
51
+
52
+ message, _ = *sock.recvfrom(1024)
53
+ assert_match(/This is a test/, message)
54
+ end
55
+
56
+ def test_sender_multiline
57
+ @sender = RemoteSyslogSender.new('127.0.0.1', @server_port)
58
+ @sender.write "This is a test\nThis is the second line"
59
+
60
+ message, _ = *@socket.recvfrom(1024)
61
+ assert_match(/This is a test/, message)
62
+
63
+ message, _ = *@socket.recvfrom(1024)
64
+ assert_match(/This is the second line/, message)
65
+ end
66
+ end
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: remote_syslog_sender_ms
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Tomohiro Hashidate
8
+ - Eric Lindvall
9
+ - Torben Carstens
10
+ autorequire:
11
+ bindir: bin
12
+ cert_chain: []
13
+ date: 2021-08-03 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: syslog_protocol_ms
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: 0.10.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: 0.10.0
29
+ - !ruby/object:Gem::Dependency
30
+ name: bundler
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '1.6'
36
+ - - "<"
37
+ - !ruby/object:Gem::Version
38
+ version: '3.0'
39
+ type: :development
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: '1.6'
46
+ - - "<"
47
+ - !ruby/object:Gem::Version
48
+ version: '3.0'
49
+ - !ruby/object:Gem::Dependency
50
+ name: rake
51
+ requirement: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ - !ruby/object:Gem::Dependency
64
+ name: test-unit
65
+ requirement: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ">="
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :development
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ description: Message sender that sends directly to a remote syslog endpoint (Support
78
+ UDP, TCP, TCP+TLS)
79
+ email:
80
+ - kakyoin.hierophant@gmail.com
81
+ - rubygems@carstens.tech
82
+ executables: []
83
+ extensions: []
84
+ extra_rdoc_files: []
85
+ files:
86
+ - ".gitignore"
87
+ - Gemfile
88
+ - LICENSE
89
+ - README.md
90
+ - Rakefile
91
+ - lib/remote_syslog_sender_ms.rb
92
+ - lib/remote_syslog_sender_ms/sender.rb
93
+ - lib/remote_syslog_sender_ms/tcp_sender.rb
94
+ - lib/remote_syslog_sender_ms/udp_sender.rb
95
+ - remote_syslog_sender_ms.gemspec
96
+ - test/helper.rb
97
+ - test/test_remote_syslog_logger.rb
98
+ homepage: https://github.com/torbencarstens/remote_syslog_logger
99
+ licenses: []
100
+ metadata: {}
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubygems_version: 3.2.15
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: Message sender that sends directly to a remote syslog endpoint
120
+ test_files:
121
+ - test/helper.rb
122
+ - test/test_remote_syslog_logger.rb