remote_syslog 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ gem 'daemons'
2
+ gem 'eventmachine'
3
+ gem 'eventmachine-tail'
data/Gemfile.lock ADDED
@@ -0,0 +1,14 @@
1
+ GEM
2
+ specs:
3
+ daemons (1.1.0)
4
+ eventmachine (0.12.10)
5
+ eventmachine-tail (0.5.20101005181243)
6
+ eventmachine
7
+
8
+ PLATFORMS
9
+ ruby
10
+
11
+ DEPENDENCIES
12
+ daemons
13
+ eventmachine
14
+ eventmachine-tail
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2010 Seven Scale LLC
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOa AND
17
+ NONINFRINGEMENT. IN NO EVENT SaALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,96 @@
1
+ # remote_syslog Ruby daemon & sender
2
+
3
+ Lightweight Ruby daemon to tail one or more log files and transmit UDP syslog
4
+ messages to a remote syslog host (centralized log aggregation).
5
+
6
+ remote_syslog generates UDP packets itself instead of depending on a system
7
+ syslog daemon, so its configuration doesn't affect system-wide
8
+ logging - syslog is just the transport.
9
+
10
+ Uses:
11
+
12
+ * collecting logs from servers & daemons which don't natively support syslog
13
+ * when reconfiguring the system logger is less convenient than a
14
+ purpose-built daemon (e.g., automated app deployments)
15
+ * aggregating files not generated by daemons (e.g., package manager logs)
16
+
17
+ The library can also be used to generate one-off log messages from Ruby code.
18
+
19
+ Tested with the hosted log management service [Papertrail] and should work for
20
+ transmitting to any syslog server.
21
+
22
+
23
+ ## Installation
24
+
25
+ Install the gem, which includes a binary called "remote_syslog":
26
+
27
+ gem install remote_syslog
28
+
29
+ Optionally, create a log_files.yml with the log file paths to read and the
30
+ host/port to log to (see examples/log_files.yml.example). These can also be
31
+ specified as arguments to the remote_syslog daemon. More below.
32
+
33
+
34
+ ## Usage
35
+
36
+ $ remote_syslog -h
37
+ Usage: remote_syslog [options] <path to add'l log 1> .. <path to add'l log n>
38
+
39
+ Example: remote_syslog -c configs/logs.yml -p 12345 /var/log/mysqld.log
40
+
41
+ Options:
42
+ -c, --configfile PATH Path to config (/etc/log_files.yml)
43
+ -d, --dest-host HOSTNAME Destination syslog hostname or IP (logs.papertrailapp.com)
44
+ -D, --no-detach Don't daemonize and detach from the terminal
45
+ -f, --facility FACILITY Facility (user)
46
+ -p, --dest-port PORT Destination syslog port (514)
47
+ -P, --pid-dir DIRECTORY Directory to write .pid file in (/var/run/)
48
+ -s, --severity SEVERITY Severity (notice)
49
+ -h, --help Show this message
50
+
51
+
52
+ ## Example
53
+
54
+ Daemonize, collecting from files mentioned in ./config/logs.yml as well as
55
+ /var/log/mysqld.log:
56
+ remote_syslog -c configs/logs.yml -p 12345 /var/log/mysqld.log
57
+
58
+ Stay attached to the terminal, look for and use /etc/log_files.yml if it exists,
59
+ write PID to /tmp/remote_syslog.pid, and send with facility local0:
60
+ remote_syslog -d a.server.com -f local0 -P /tmp /var/log/mysqld.log
61
+
62
+ remote_syslog will daemonize by default. A sample init file is in the gem as
63
+ remote_syslog.init.d. You may be able to:
64
+ cp examples/remote_syslog.init.d /etc/init.d/remote_syslog
65
+
66
+
67
+ ## Configuration
68
+
69
+ The gem comes with a sample config. Optionally:
70
+
71
+ cp examples/log_files.yml.example /etc/log_files.yml
72
+
73
+ log_files.yml has filenames to log from (as an array) and hostname and port
74
+ to log to (as a hash). Only 1 destination server is supported; the command-line
75
+ argument wins. Filenames given on the command line are additive to those
76
+ in the config file.
77
+
78
+
79
+ ## Contribute
80
+
81
+ Bug report:
82
+
83
+ 1. See whether the issue has already been reported:
84
+ http://github.com/papertrail/remote_syslog/issues/
85
+ 2. If you don't find one, create an issue with a repro case.
86
+
87
+ Enhancement or fix:
88
+
89
+ 1. Fork the project:
90
+ http://github.com/papertrail/remote_syslog
91
+ 2. Make your changes with tests.
92
+ 3. Commit the changes without changing the Rakefile or other files unrelated
93
+ to your enhancement.
94
+ 4. Send a pull request.
95
+
96
+ [Papertrail]: http://papertrailapp.com/
data/Rakefile ADDED
@@ -0,0 +1,150 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'date'
4
+
5
+ #############################################################################
6
+ #
7
+ # Helper functions
8
+ #
9
+ #############################################################################
10
+
11
+ def name
12
+ @name ||= Dir['*.gemspec'].first.split('.').first
13
+ end
14
+
15
+ def version
16
+ line = File.read("lib/#{name}.rb")[/^\s*VERSION\s*=\s*.*/]
17
+ line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
18
+ end
19
+
20
+ def date
21
+ Date.today.to_s
22
+ end
23
+
24
+ def rubyforge_project
25
+ name
26
+ end
27
+
28
+ def gemspec_file
29
+ "#{name}.gemspec"
30
+ end
31
+
32
+ def gem_file
33
+ "#{name}-#{version}.gem"
34
+ end
35
+
36
+ def replace_header(head, header_name)
37
+ head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
38
+ end
39
+
40
+ #############################################################################
41
+ #
42
+ # Standard tasks
43
+ #
44
+ #############################################################################
45
+
46
+ task :default => :test
47
+
48
+ require 'rake/testtask'
49
+ Rake::TestTask.new(:test) do |test|
50
+ test.libs << 'lib' << 'test'
51
+ test.pattern = 'test/**/test_*.rb'
52
+ test.verbose = true
53
+ end
54
+
55
+ desc "Generate RCov test coverage and open in your browser"
56
+ task :coverage do
57
+ require 'rcov'
58
+ sh "rm -fr coverage"
59
+ sh "rcov test/test_*.rb"
60
+ sh "open coverage/index.html"
61
+ end
62
+
63
+ require 'rake/rdoctask'
64
+ Rake::RDocTask.new do |rdoc|
65
+ rdoc.rdoc_dir = 'rdoc'
66
+ rdoc.title = "#{name} #{version}"
67
+ rdoc.rdoc_files.include('README*')
68
+ rdoc.rdoc_files.include('lib/**/*.rb')
69
+ end
70
+
71
+ desc "Open an irb session preloaded with this library"
72
+ task :console do
73
+ sh "irb -rubygems -r ./lib/#{name}.rb"
74
+ end
75
+
76
+ #############################################################################
77
+ #
78
+ # Custom tasks (add your own tasks here)
79
+ #
80
+ #############################################################################
81
+
82
+
83
+
84
+ #############################################################################
85
+ #
86
+ # Packaging tasks
87
+ #
88
+ #############################################################################
89
+
90
+ desc "Create tag v#{version} and build and push #{gem_file} to Rubygems"
91
+ task :release => :build do
92
+ unless `git branch` =~ /^\* master$/
93
+ puts "You must be on the master branch to release!"
94
+ exit!
95
+ end
96
+ sh "git commit --allow-empty -a -m 'Release #{version}'"
97
+ sh "git tag v#{version}"
98
+ sh "git push origin master"
99
+ sh "git push origin v#{version}"
100
+ sh "gem push pkg/#{name}-#{version}.gem"
101
+ end
102
+
103
+ desc "Build #{gem_file} into the pkg directory"
104
+ task :build => :gemspec do
105
+ sh "mkdir -p pkg"
106
+ sh "gem build #{gemspec_file}"
107
+ sh "mv #{gem_file} pkg"
108
+ end
109
+
110
+ desc "Generate #{gemspec_file}"
111
+ task :gemspec => :validate do
112
+ # read spec file and split out manifest section
113
+ spec = File.read(gemspec_file)
114
+ head, manifest, tail = spec.split(" # = MANIFEST =\n")
115
+
116
+ # replace name version and date
117
+ replace_header(head, :name)
118
+ replace_header(head, :version)
119
+ replace_header(head, :date)
120
+ #comment this out if your rubyforge_project has a different name
121
+ replace_header(head, :rubyforge_project)
122
+
123
+ # determine file list from git ls-files
124
+ files = `git ls-files`.
125
+ split("\n").
126
+ sort.
127
+ reject { |file| file =~ /^\./ }.
128
+ reject { |file| file =~ /^(rdoc|pkg)/ }.
129
+ map { |file| " #{file}" }.
130
+ join("\n")
131
+
132
+ # piece file back together and write
133
+ manifest = " s.files = %w[\n#{files}\n ]\n"
134
+ spec = [head, manifest, tail].join(" # = MANIFEST =\n")
135
+ File.open(gemspec_file, 'w') { |io| io.write(spec) }
136
+ puts "Updated #{gemspec_file}"
137
+ end
138
+
139
+ desc "Validate #{gemspec_file}"
140
+ task :validate do
141
+ libfiles = Dir['lib/*'] - ["lib/#{name}.rb", "lib/#{name}"]
142
+ unless libfiles.empty?
143
+ puts "Directory `lib` should only contain a `#{name}.rb` file and `#{name}` dir."
144
+ exit!
145
+ end
146
+ unless Dir['VERSION*'].empty?
147
+ puts "A `VERSION` file at root level violates Gem best practices."
148
+ exit!
149
+ end
150
+ end
data/bin/remote_syslog ADDED
@@ -0,0 +1,116 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'bundler'
5
+
6
+ require 'optparse'
7
+ require 'yaml'
8
+ require 'pathname'
9
+ require 'socket'
10
+
11
+ require 'daemons'
12
+ require 'eventmachine'
13
+ require 'eventmachine-tail'
14
+
15
+ require 'remote_syslog'
16
+
17
+ def remote_syslog_daemon(args)
18
+ options = {
19
+ :configfile => '/etc/log_files.yml',
20
+ :dest_host => 'logs.papertrailapp.com',
21
+ :dest_port => 514
22
+ }
23
+ daemonize_options = {
24
+ :app_name => File.basename($0) || "remote_syslog",
25
+ :ARGV => ['start'],
26
+ :dir_mode => :system,
27
+ :multiple => false,
28
+ :ontop => false,
29
+ :mode => :exec,
30
+ :backtrace => false,
31
+ :monitor => false
32
+ }
33
+
34
+ op = OptionParser.new do |opts|
35
+ opts.banner = "Usage: remote_syslog [options] <path to add'l log 1> .. <path to add'l log n>"
36
+ opts.separator ''
37
+ opts.separator "Example: remote_syslog -c configs/logs.yml -p 12345 /var/log/mysqld.log"
38
+ opts.separator ''
39
+ opts.separator "Options:"
40
+
41
+ opts.on("-c", "--configfile PATH", "Path to config (/etc/log_files.yml)") do |v|
42
+ options[:configfile] = File.expand_path(v)
43
+ end
44
+ opts.on("-d", "--dest-host HOSTNAME", "Destination syslog hostname or IP (logs.papertrailapp.com)") do |v|
45
+ options[:dest_host] = v
46
+ end
47
+ opts.on("-D", "--no-detach", "Don't daemonize and detach from the terminal") do
48
+ daemonize_options[:ontop] = true
49
+ daemonize_options[:ARGV] = ['run']
50
+ # write PID file in . because /var/run is sometimes only writable by root
51
+ daemonize_options[:dir_mode] = :script
52
+ daemonize_options[:dir] = '.'
53
+ end
54
+ opts.on("-f", "--facility FACILITY", "Facility (user)") do |v|
55
+ options[:facility] = v.upcase
56
+ end
57
+ opts.on("-p", "--dest-port PORT", "Destination syslog port (514)") do |v|
58
+ options[:dest_port] = v
59
+ end
60
+ opts.on("-P", "--pid-dir DIRECTORY", "Directory to write .pid file in (/var/run/)") do |v|
61
+ daemonize_options[:dir_mode] = :script
62
+ daemonize_options[:dir] = v
63
+ end
64
+ opts.on("-s", "--severity SEVERITY", "Severity (notice)") do |v|
65
+ options[:severity] = v.upcase
66
+ end
67
+ opts.on_tail("-h", "--help", "Show this message") do
68
+ puts opts
69
+ exit
70
+ end
71
+ end
72
+
73
+ op.parse!
74
+
75
+ files = ARGV
76
+ if File.exist?(options[:configfile])
77
+ config = open(options[:configfile]) do |f|
78
+ YAML.load(f)
79
+ end
80
+
81
+ files += config['files']
82
+ if config['destination']
83
+ options[:dest_host] = config['destination']['host'] if config['destination']['host']
84
+ options[:dest_port] = config['destination']['port'] if config['destination']['port']
85
+ end
86
+ elsif files.empty?
87
+ puts "No filenames provided and #{options[:configfile]} not found."
88
+ puts ''
89
+ puts op
90
+ exit
91
+ end
92
+
93
+ # handle relative paths before Daemonize changes the wd to /
94
+ files.map! { |f| File.expand_path(f) }
95
+
96
+ Daemons.run_proc(daemonize_options[:app_name], daemonize_options) do
97
+ EventMachine.run do
98
+ socket = EventMachine.open_datagram_socket('0.0.0.0', 0)
99
+
100
+ files.each do |path|
101
+ begin
102
+ EventMachine::file_tail(File.expand_path(path), RemoteSyslog::Reader,
103
+ options[:dest_host], options[:dest_port],
104
+ { :socket => socket, :facility => options[:facility],
105
+ :severity => options[:severity] })
106
+
107
+ rescue Errno::ENOENT => e
108
+ puts "#{File.expand_path(path)} not found, continuing. (#{e.message})"
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ end
115
+
116
+ remote_syslog_daemon(ARGV)
@@ -0,0 +1,4 @@
1
+ files: [/var/log/httpd/access_log, /var/log/httpd/error_log, /var/log/mysqld.log, /var/run/mysqld/mysqld-slow.log]
2
+ destination:
3
+ host: logs.papertrailapp.com
4
+ port: 12345
@@ -0,0 +1,91 @@
1
+ #!/bin/bash
2
+
3
+ prog="remote_syslog"
4
+ config="/etc/log_files.yml"
5
+ pid_dir="/var/run"
6
+
7
+ EXTRAOPTIONS=""
8
+
9
+ pid_file="$pid_dir/$prog.pid"
10
+
11
+ PATH=/sbin:/bin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
12
+
13
+ RETVAL=0
14
+
15
+ is_running(){
16
+ [ -e $pid_file ]
17
+ }
18
+
19
+ start(){
20
+ echo -n $"Starting $prog: "
21
+
22
+ unset HOME MAIL USER USERNAME
23
+ $prog -c $config -P $pid_dir "$EXTRAOPTIONS"
24
+ RETVAL=$?
25
+ echo
26
+ return $RETVAL
27
+ }
28
+
29
+ stop(){
30
+ echo -n $"Stopping $prog: "
31
+ if (is_running); then
32
+ kill `cat $pid_file`
33
+ RETVAL=$?
34
+ echo
35
+ return $RETVAL
36
+ else
37
+ echo "$pid_file not found"
38
+ fi
39
+ }
40
+
41
+ status(){
42
+ echo -n $"Checking for $pid_file: "
43
+
44
+ if (is_running); then
45
+ echo "found"
46
+ else
47
+ echo "not found"
48
+ fi
49
+ }
50
+
51
+ reload(){
52
+ restart
53
+ }
54
+
55
+ restart(){
56
+ stop
57
+ start
58
+ }
59
+
60
+ condrestart(){
61
+ is_running && restart
62
+ return 0
63
+ }
64
+
65
+
66
+ # See how we were called.
67
+ case "$1" in
68
+ start)
69
+ start
70
+ ;;
71
+ stop)
72
+ stop
73
+ ;;
74
+ status)
75
+ status
76
+ ;;
77
+ restart)
78
+ restart
79
+ ;;
80
+ reload)
81
+ reload
82
+ ;;
83
+ condrestart)
84
+ condrestart
85
+ ;;
86
+ *)
87
+ echo $"Usage: $0 {start|stop|status|restart|condrestart|reload}"
88
+ RETVAL=1
89
+ esac
90
+
91
+ exit $RETVAL
@@ -0,0 +1,37 @@
1
+ module RemoteSyslog
2
+ class Levels
3
+ SEVERITIES = {
4
+ :emerg => 0,
5
+ :alert => 1,
6
+ :crit => 2,
7
+ :err => 3,
8
+ :warning => 4,
9
+ :notice => 5,
10
+ :info => 6,
11
+ :debug => 7
12
+ }.freeze
13
+
14
+ FACILITIES = {
15
+ :kern => (0<<3),
16
+ :user => (1<<3),
17
+ :mail => (2<<3),
18
+ :daemon => (3<<3),
19
+ :auth => (4<<3),
20
+ :syslog => (5<<3),
21
+ :lpr => (6<<3),
22
+ :news => (7<<3),
23
+ :uucp => (8<<3),
24
+ :cron => (9<<3),
25
+ :authpriv => (10<<3),
26
+ :ftp => (11<<3),
27
+ :local0 => (16<<3),
28
+ :local1 => (17<<3),
29
+ :local2 => (18<<3),
30
+ :local3 => (19<<3),
31
+ :local4 => (20<<3),
32
+ :local5 => (21<<3),
33
+ :local6 => (22<<3),
34
+ :local7 => (23<<3)
35
+ }.freeze
36
+ end
37
+ end
@@ -0,0 +1,57 @@
1
+ module RemoteSyslog
2
+ class Reader < EventMachine::FileTail
3
+ def initialize(path, dest_addr, dest_port, options = {})
4
+ @dest_addr = dest_addr
5
+ @dest_port = dest_port.to_i
6
+
7
+ @socket = options[:socket] || EventMachine.open_datagram_socket('0.0.0.0', 0)
8
+ @program = options[:program] || File.basename(path) || 'remote_syslog'
9
+ @hostname = options[:hostname] || `hostname`.strip
10
+ @hostname = 'localhost' unless @hostname && @hostname != ''
11
+
12
+ if options[:severity]
13
+ @severity = severity_value(options[:severity]) || raise(ArgumentError, "Invalid severity: #{options[:severity]} (valid: #{severities.keys.join(', ')})")
14
+ else
15
+ @severity = severity_value(:notice)
16
+ end
17
+
18
+ if options[:facility]
19
+ @facility = facility_value(options[:facility]) || raise(ArgumentError, "Invalid facility: #{options[:facility]} (valid: #{facilities.keys.join(', ')}")
20
+ else
21
+ @facility = facility_value(:user)
22
+ end
23
+
24
+ super(path, -1)
25
+ @buffer = BufferedTokenizer.new
26
+ end
27
+
28
+ def receive_data(data)
29
+ @buffer.extract(data).each do |line|
30
+ transmit(line)
31
+ end
32
+ end
33
+
34
+ def transmit(message)
35
+ time ||= Time.now
36
+ day = time.strftime('%b %d').sub(/0(\d)/, ' \\1')
37
+
38
+ @socket.send_datagram("<#{(@facility) + @severity}>#{day} #{time.strftime('%T')} #{@hostname} #{@program}: #{message}", @dest_addr, @dest_port)
39
+ end
40
+
41
+ def facility_value(f)
42
+ f.is_a?(Integer) ? f*8 : facilities[f.to_sym]
43
+ end
44
+
45
+ def severity_value(s)
46
+ s.is_a?(Integer) ? s : severities[s.to_sym]
47
+ end
48
+
49
+ def facilities
50
+ Levels::FACILITIES
51
+ end
52
+
53
+ def severities
54
+ Levels::SEVERITIES
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,6 @@
1
+ module RemoteSyslog
2
+ VERSION = "0.1.0"
3
+ end
4
+
5
+ require 'remote_syslog/levels'
6
+ require 'remote_syslog/reader'
@@ -0,0 +1,78 @@
1
+ # https://github.com/mojombo/rakegem
2
+ Gem::Specification.new do |s|
3
+ s.specification_version = 2 if s.respond_to? :specification_version=
4
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
5
+ s.rubygems_version = '1.3.5'
6
+
7
+ ## Leave these as is they will be modified for you by the rake gemspec task.
8
+ ## If your rubyforge_project name is different, then edit it and comment out
9
+ ## the sub! line in the Rakefile
10
+ s.name = 'remote_syslog'
11
+ s.version = '0.1.0'
12
+ s.date = '2010-12-17'
13
+ s.rubyforge_project = 'remote_syslog'
14
+
15
+ ## Make sure your summary is short. The description may be as long
16
+ ## as you like.
17
+ s.summary = 'Monitor plain text log file(s) for new entries and send to remote syslog collector'
18
+ s.description = "Lightweight daemon to tail one or more log files and transmit UDP syslog messages to a remote syslog host (centralized log aggregation). Generates UDP packets itself instead of depending on a system syslog daemon, so it doesn't affect system-wide logging configuration."
19
+
20
+ ## List the primary authors. If there are a bunch of authors, it's probably
21
+ ## better to set the email to an email list or something. If you don't have
22
+ ## a custom homepage, consider using your GitHub URL or the like.
23
+ s.authors = ['Papertrail']
24
+ s.email = 'troy@sevenscale.com'
25
+ s.homepage = 'http://github.com/papertrail/remote_syslog'
26
+
27
+ ## This gets added to the $LOAD_PATH so that 'lib/NAME.rb' can be required as
28
+ ## require 'NAME.rb' or'/lib/NAME/file.rb' can be as require 'NAME/file.rb'
29
+ s.require_paths = %w[lib]
30
+
31
+ ## This sections is only necessary if you have C extensions.
32
+ #s.require_paths << 'ext'
33
+ #s.extensions = %w[ext/extconf.rb]
34
+
35
+ ## If your gem includes any executables, list them here.
36
+ s.executables = ['remote_syslog']
37
+ s.default_executable = 'remote_syslog'
38
+
39
+ ## Specify any RDoc options here. You'll want to add your README and
40
+ ## LICENSE files to the extra_rdoc_files list.
41
+ s.rdoc_options = ["--charset=UTF-8"]
42
+ s.extra_rdoc_files = %w[README.md LICENSE]
43
+
44
+ ## List your runtime dependencies here. Runtime dependencies are those
45
+ ## that are needed for an end user to actually USE your code.
46
+ #s.add_dependency('DEPNAME', [">= 1.1.0", "< 2.0.0"])
47
+ s.add_dependency 'daemons'
48
+ s.add_dependency 'eventmachine'
49
+ s.add_dependency 'eventmachine-tail'
50
+
51
+ ## List your development dependencies here. Development dependencies are
52
+ ## those that are only needed during development
53
+ #s.add_development_dependency('DEVDEPNAME', [">= 1.1.0", "< 2.0.0"])
54
+
55
+ ## Leave this section as-is. It will be automatically generated from the
56
+ ## contents of your Git repository via the gemspec task. DO NOT REMOVE
57
+ ## THE MANIFEST COMMENTS, they are used as delimiters by the task.
58
+ # = MANIFEST =
59
+ s.files = %w[
60
+ Gemfile
61
+ Gemfile.lock
62
+ LICENSE
63
+ README.md
64
+ Rakefile
65
+ bin/remote_syslog
66
+ examples/log_files.yml.example
67
+ examples/remote_syslog.init.d
68
+ lib/remote_syslog.rb
69
+ lib/remote_syslog/levels.rb
70
+ lib/remote_syslog/reader.rb
71
+ remote_syslog.gemspec
72
+ ]
73
+ # = MANIFEST =
74
+
75
+ ## Test files will be grabbed from the file list. Make sure the path glob
76
+ ## matches what you actually use.
77
+ s.test_files = s.files.select { |path| path =~ /^test\/test_.*\.rb/ }
78
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: remote_syslog
3
+ version: !ruby/object:Gem::Version
4
+ hash: 27
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 1
9
+ - 0
10
+ version: 0.1.0
11
+ platform: ruby
12
+ authors:
13
+ - Papertrail
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-12-17 00:00:00 -08:00
19
+ default_executable: remote_syslog
20
+ dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ name: daemons
23
+ prerelease: false
24
+ requirement: &id001 !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ hash: 3
30
+ segments:
31
+ - 0
32
+ version: "0"
33
+ type: :runtime
34
+ version_requirements: *id001
35
+ - !ruby/object:Gem::Dependency
36
+ name: eventmachine
37
+ prerelease: false
38
+ requirement: &id002 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ hash: 3
44
+ segments:
45
+ - 0
46
+ version: "0"
47
+ type: :runtime
48
+ version_requirements: *id002
49
+ - !ruby/object:Gem::Dependency
50
+ name: eventmachine-tail
51
+ prerelease: false
52
+ requirement: &id003 !ruby/object:Gem::Requirement
53
+ none: false
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ hash: 3
58
+ segments:
59
+ - 0
60
+ version: "0"
61
+ type: :runtime
62
+ version_requirements: *id003
63
+ description: Lightweight daemon to tail one or more log files and transmit UDP syslog messages to a remote syslog host (centralized log aggregation). Generates UDP packets itself instead of depending on a system syslog daemon, so it doesn't affect system-wide logging configuration.
64
+ email: troy@sevenscale.com
65
+ executables:
66
+ - remote_syslog
67
+ extensions: []
68
+
69
+ extra_rdoc_files:
70
+ - README.md
71
+ - LICENSE
72
+ files:
73
+ - Gemfile
74
+ - Gemfile.lock
75
+ - LICENSE
76
+ - README.md
77
+ - Rakefile
78
+ - bin/remote_syslog
79
+ - examples/log_files.yml.example
80
+ - examples/remote_syslog.init.d
81
+ - lib/remote_syslog.rb
82
+ - lib/remote_syslog/levels.rb
83
+ - lib/remote_syslog/reader.rb
84
+ - remote_syslog.gemspec
85
+ has_rdoc: true
86
+ homepage: http://github.com/papertrail/remote_syslog
87
+ licenses: []
88
+
89
+ post_install_message:
90
+ rdoc_options:
91
+ - --charset=UTF-8
92
+ require_paths:
93
+ - lib
94
+ required_ruby_version: !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ none: false
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ hash: 3
109
+ segments:
110
+ - 0
111
+ version: "0"
112
+ requirements: []
113
+
114
+ rubyforge_project: remote_syslog
115
+ rubygems_version: 1.3.7
116
+ signing_key:
117
+ specification_version: 2
118
+ summary: Monitor plain text log file(s) for new entries and send to remote syslog collector
119
+ test_files: []
120
+