fluent-plugin-windows-eventlog 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 182e98e93e8d43f333025671ae6698ccddefd580
4
- data.tar.gz: fdeda6fa7866b56938cfa714a0025aae635453ef
3
+ metadata.gz: 44561910d111a16a85de6b5d9faee8cf052fed71
4
+ data.tar.gz: 2bc58308403d20000efe50f2b6f73e86a9a6585a
5
5
  SHA512:
6
- metadata.gz: 7e46f28f6814ed735edb7db078a5784614f4e620457f1082737496b6ae80188168ed8dd5f3a5233e0ec66a261fb26a5519fc172f6821ab170c11d45ebd9568c1
7
- data.tar.gz: dcb0c4be720f231921fb7dfa5430563c96cf31b392661086e2e328e2c3d4e42412328258cceb3b062b5ab4db7563a159874c4b9d75f5b159cbd474e7b8b6a627
6
+ metadata.gz: 194172daa6b8dd788a785d89e392e3698fe7ed6b8ffa0de360ddc89bf2bd9d37818d8abd43bf5c6e71434cffdd603a91126f674ab80c45455aeffe969a5101c2
7
+ data.tar.gz: 2b45ac6f8ce1c4d142ce1aae21104945c2bdb706db26c57eb6f9a0e2ef90ba468a7b3fd5172242817c6e43f3b1575b2167bcd5f65ebd52600f4f461f3c0780ad
data/README.md CHANGED
@@ -2,65 +2,62 @@
2
2
 
3
3
  ## Component
4
4
 
5
- #### fluentd Input plugin for Windows Event Log
5
+ #### fluentd Input plugin for the Windows Event Log
6
6
 
7
- [Fluentd](http://fluentd.org) plugin to read Windows Event Log.
8
- You must use fluentd 'Windows' brach to use me, and it doesn't work on Linux of course.
7
+ [Fluentd](http://fluentd.org) plugin to read the Windows Event Log.
9
8
 
10
9
  ## Installation
11
10
  gem install fluent-plugin-windows-eventlog
12
11
 
13
12
  ## Configuration
14
- #### fluentd Input plugin for Windows Event Log
13
+ #### fluentd Input plugin for the Windows Event Log
15
14
 
16
15
  <source>
17
- type windows_eventlog
16
+ @type windows_eventlog
17
+ @id windows_eventlog
18
18
  channels application,system
19
- pos_file c:\temp\mypos
20
19
  read_interval 2
21
20
  tag winevt.raw
21
+ <storage>
22
+ @type local # @type local is the default.
23
+ persistent true # default is true. Set to false to use in-memory storage.
24
+ path ./tmp/storage.json # This is required when persistent is true.
25
+ # Or, please consider using <system> section's `root_dir` parameter.
26
+ </storage>
22
27
  </source>
23
28
 
24
-
25
29
  #### parameters
26
30
 
27
31
  |name | description |
28
32
  |:----- |:----- |
29
- |channels | (option) 'applicaion' as default. one or combination of {application, system, setup, security}. If you want to read setup or security, administrator priv is required to launch fluentd. |
30
- |pos_file | (option, but higly recommended) a path of position file to save record numbers. |
31
- |read_interval | (option) a read interval in second. 2 seconds as default.|
32
- |from_encoding | (option) an input characters encoding. nil as default.|
33
- |encoding | (option) an output characters encoding. nil as default.|
34
-
33
+ |`channels` | (option) 'application' as default. One or more of {'application', 'system', 'setup', 'security'}. If you want to read 'setup' or 'security' logs, you must launch fluentd with administrator privileges.|
34
+ |`keys` | (option) A subset of [keys](#read-keys) to read. Defaults to all keys.|
35
+ |`read_interval` | (option) Read interval in seconds. 2 seconds as default.|
36
+ |`from_encoding` | (option) Input character encoding. `nil` as default.|
37
+ |`encoding` | (option) Output character encoding. `nil` as default.|
38
+ |`read_from_head`| (option) Start to read the entries from the oldest, not from when fluentd is started. Defaults to `false`.|
39
+ |`<storage>` | Setting for `storage` plugin for recording read position like `in_tail`'s `pos_file`.|
35
40
 
36
41
  #### read keys
37
- This plugin reads follows from Windws Event Log. No customization is allowed currently.
42
+ This plugin reads the following fields from Windows Event Log entries. Use the `keys` configuration option to select a subset. No other customization is allowed for now.
38
43
 
39
44
  |key|
40
45
  |:----- |
41
- |record_number |
42
- |time_generated|
43
- |time_written |
44
- |event_id |
45
- |event_type |
46
- |event_category |
47
- |source_name |
48
- |computer_name |
49
- |user |
50
- |description |
51
-
52
-
53
-
54
- ## Etc.
55
- 'read_from_head' is not supporeted currently.You can read newer records after you start first.
56
- No customize to read information keys.
57
-
58
-
59
-
46
+ |`record_number` |
47
+ |`time_generated`|
48
+ |`time_written` |
49
+ |`event_id` |
50
+ |`event_type` |
51
+ |`event_category`|
52
+ |`source_name` |
53
+ |`computer_name` |
54
+ |`user` |
55
+ |`description` |
56
+ |`string_inserts`|
60
57
 
61
58
  ## Copyright
62
- ####Copyright
59
+ #### Copyright
63
60
  Copyright(C) 2014- @okahashi117
64
- ####License
61
+ #### License
65
62
  Apache License, Version 2.0
66
63
 
data/appveyor.yml ADDED
@@ -0,0 +1,27 @@
1
+ version: '{build}'
2
+
3
+ # init:
4
+ # - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
5
+
6
+ install:
7
+ - SET PATH=C:\Ruby%ruby_version%\bin;%PATH%
8
+ - "%devkit%\\devkitvars.bat"
9
+ - ruby --version
10
+ - gem --version
11
+ - bundle install
12
+ build: off
13
+ test_script:
14
+ - bundle exec rake test
15
+ # - bundle exec rake test TESTOPTS=-v
16
+
17
+ branches:
18
+ only:
19
+ - master
20
+
21
+ # https://www.appveyor.com/docs/installed-software/#ruby
22
+ environment:
23
+ matrix:
24
+ - ruby_version: "23-x64"
25
+ devkit: C:\Ruby23-x64\DevKit
26
+ - ruby_version: "23"
27
+ devkit: C:\Ruby23\DevKit
@@ -4,9 +4,9 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "fluent-plugin-windows-eventlog"
7
- spec.version = "0.1.0"
7
+ spec.version = "0.2.1"
8
8
  spec.authors = ["okahashi117", "Hiroshi Hatake", "Masahiro Nakagawa"]
9
- spec.email = ["naruki_okahashi@jbat.co.jp", "cosmo0920.wp@gmail.com", "repeatedly@gmail.com"]
9
+ spec.email = ["naruki_okahashi@jbat.co.jp", "cosmo0920.oucc@gmail.com", "repeatedly@gmail.com"]
10
10
  spec.summary = %q{Fluentd Input plugin to read windows event log.}
11
11
  spec.description = %q{Fluentd Input plugin to read windwos event log.}
12
12
  spec.homepage = "https://github.com/fluent/fluent-plugin-windows-eventlog"
@@ -20,6 +20,6 @@ Gem::Specification.new do |spec|
20
20
  spec.add_development_dependency "bundler"
21
21
  spec.add_development_dependency "rake"
22
22
  spec.add_development_dependency "test-unit", "~> 3.2.0"
23
- spec.add_runtime_dependency "fluentd", [">= 0.14.11", "< 2"]
23
+ spec.add_runtime_dependency "fluentd", [">= 0.14.12", "< 2"]
24
24
  spec.add_runtime_dependency "win32-eventlog"
25
25
  end
@@ -6,28 +6,37 @@ module Fluent::Plugin
6
6
  class WindowsEventLogInput < Input
7
7
  Fluent::Plugin.register_input('windows_eventlog', self)
8
8
 
9
- helpers :timer
10
-
11
- KEY_MAP = {"record_number" => :record_number,
12
- "time_generated" => :time_generated,
13
- "time_written" => :time_written,
14
- "event_id" => :event_id,
15
- "event_type" => :event_type,
16
- "event_category" => :category,
17
- "source_name" => :source,
18
- "computer_name" => :computer,
19
- "user" => :user,
20
- "description" => :description}
9
+ helpers :timer, :storage
10
+
11
+ DEFAULT_STORAGE_TYPE = 'local'
12
+ KEY_MAP = {"record_number" => [:record_number, :string],
13
+ "time_generated" => [:time_generated, :string],
14
+ "time_written" => [:time_written, :string],
15
+ "event_id" => [:event_id, :string],
16
+ "event_type" => [:event_type, :string],
17
+ "event_category" => [:category, :string],
18
+ "source_name" => [:source, :string],
19
+ "computer_name" => [:computer, :string],
20
+ "user" => [:user, :string],
21
+ "description" => [:description, :string],
22
+ "string_inserts" => [:string_inserts, :array]}
21
23
 
22
24
  config_param :tag, :string
23
25
  config_param :read_interval, :time, default: 2
24
- config_param :pos_file, :string, default: nil
25
- config_param :channels, :array, default: ['Application']
26
- config_param :keys, :string, default: []
26
+ config_param :pos_file, :string, default: nil,
27
+ obsoleted: "This section is not used anymore. Use 'store_pos' instead."
28
+ config_param :channels, :array, default: ['application']
29
+ config_param :keys, :array, default: []
27
30
  config_param :read_from_head, :bool, default: false
28
31
  config_param :from_encoding, :string, default: nil
29
32
  config_param :encoding, :string, default: nil
30
33
 
34
+ config_section :storage do
35
+ config_set_default :usage, "positions"
36
+ config_set_default :@type, DEFAULT_STORAGE_TYPE
37
+ config_set_default :persistent, true
38
+ end
39
+
31
40
  attr_reader :chs
32
41
 
33
42
  def initialize
@@ -55,6 +64,7 @@ module Fluent::Plugin
55
64
  else
56
65
  method(:no_encode_record)
57
66
  end
67
+ @pos_storage = storage_create(usage: "positions")
58
68
  end
59
69
 
60
70
  def configure_encoding
@@ -92,229 +102,86 @@ module Fluent::Plugin
92
102
 
93
103
  def start
94
104
  super
95
- if @pos_file
96
- @pf_file = File.open(@pos_file, File::RDWR|File::CREAT|File::BINARY)
97
- @pf_file.sync = true
98
- @pf = PositionFile.parse(@pf_file)
99
- end
100
- start_watchers(@chs)
101
- end
102
-
103
- def shutdown
104
- stop_watchers(@tails.keys, true)
105
- @pf_file.close if @pf_file
106
- super
107
- end
108
-
109
- def setup_wacther(ch, pe)
110
- wlw = WindowsLogWatcher.new(ch, pe, &method(:receive_lines))
111
- wlw.attach do |watcher|
112
- wlw.timer_trigger = timer_execute(:in_winevtlog, @read_interval, &watcher.method(:on_notify))
113
- end
114
- wlw
115
- end
116
-
117
- def start_watchers(chs)
118
- chs.each { |ch|
119
- pe = nil
120
- if @pf
121
- pe = @pf[ch]
122
- if @read_from_head && pe.read_num.zero?
123
- el = Win32::EventLog.open(ch)
124
- pe.update(el.oldest_record_number-1,1)
125
- el.close
126
- end
105
+ @chs.each do |ch|
106
+ start, num = @pos_storage.get(ch)
107
+ if @read_from_head || (!num || num.zero?)
108
+ el = Win32::EventLog.open(ch)
109
+ @pos_storage.put(ch, [el.oldest_record_number - 1, 1])
110
+ el.close
127
111
  end
128
- @tails[ch] = setup_wacther(ch, pe)
129
- }
130
- end
131
-
132
- def stop_watchers(chs, unwatched = false)
133
- chs.each { |ch|
134
- wlw = @tails.delete(ch)
135
- if wlw
136
- wlw.unwatched = unwatched
137
- close_watcher(wlw)
112
+ timer_execute("in_windows_eventlog_#{escape_channel(ch)}".to_sym, @read_interval) do
113
+ on_notify(ch)
138
114
  end
139
- }
115
+ end
140
116
  end
141
117
 
142
- def close_watcher(wlw)
143
- wlw.close
144
- # flush_buffer(wlw)
118
+ def escape_channel(ch)
119
+ ch.gsub(/[^a-zA-Z0-9]/, '_')
145
120
  end
146
121
 
147
- def receive_lines(ch, lines, pe)
122
+ def receive_lines(ch, lines)
148
123
  return if lines.empty?
149
124
  begin
150
125
  for r in lines
151
126
  h = {"channel" => ch}
152
- @keynames.each {|k| h[k]=@receive_handlers.call(r.send(KEY_MAP[k]).to_s)}
153
- #h = Hash[@keynames.map {|k| [k, r.send(KEY_MAP[k]).to_s]}]
127
+ @keynames.each do |k|
128
+ type = KEY_MAP[k][1]
129
+ value = r.send(KEY_MAP[k][0])
130
+ h[k]=case type
131
+ when :string
132
+ @receive_handlers.call(value.to_s)
133
+ when :array
134
+ value.map {|v| @receive_handlers.call(v.to_s)}
135
+ else
136
+ raise "Unknown value type: #{type}"
137
+ end
138
+ end
139
+ #h = Hash[@keynames.map {|k| [k, r.send(KEY_MAP[k][0]).to_s]}]
154
140
  router.emit(@tag, Fluent::Engine.now, h)
155
- pe[1] +=1
156
141
  end
157
- rescue
158
- $log.error "unexpected error", error: $!.to_s
159
- $log.error_backtrace
142
+ rescue => e
143
+ log.error "unexpected error", error: e
144
+ log.error_backtrace
160
145
  end
161
146
  end
162
147
 
148
+ def on_notify(ch)
149
+ el = Win32::EventLog.open(ch)
163
150
 
164
- class WindowsLogWatcher
165
- def initialize(ch, pe, &receive_lines)
166
- @ch = ch
167
- @pe = pe || MemoryPositionEntry.new
168
- @receive_lines = receive_lines
169
- @timer_trigger = nil
170
- end
151
+ current_oldest_record_number = el.oldest_record_number
152
+ current_total_records = el.total_records
171
153
 
172
- attr_reader :ch
173
- attr_accessor :unwatched
174
- attr_accessor :pe
175
- attr_accessor :timer_trigger
154
+ read_start, read_num = @pos_storage.get(ch)
176
155
 
177
- def attach
178
- yield self
179
- on_notify
156
+ # if total_records is zero, oldest_record_number has no meaning.
157
+ if current_total_records == 0
158
+ return
180
159
  end
181
160
 
182
- def detach
183
- @timer_trigger.detach if @timer_trigger.attached?
161
+ if read_start == 0 && read_num == 0
162
+ @pos_storage.put(ch, [current_oldest_record_number, current_total_records])
163
+ return
184
164
  end
185
165
 
186
- def close
187
- detach
188
- end
189
-
190
- def on_notify
191
- el = Win32::EventLog.open(@ch)
192
- rl_sn = [el.oldest_record_number, el.total_records]
193
- pe_sn = [@pe.read_start, @pe.read_num]
194
- # if total_records is zero, oldest_record_number has no meaning.
195
- if rl_sn[1] == 0
196
- return
197
- end
198
-
199
- if pe_sn[0] == 0 && pe_sn[1] == 0
200
- @pe.update(rl_sn[0], rl_sn[1])
201
- return
202
- end
203
-
204
- cur_end = rl_sn[0] + rl_sn[1] -1
205
- old_end = pe_sn[0] + pe_sn[1] -1
206
-
207
- if (rl_sn[0] < pe_sn[0])
208
- # may be a record number rotated.
209
- cur_end += 0xFFFFFFFF
210
- end
211
-
212
- if (cur_end < old_end)
213
- # something occured.
214
- @pe.update(rl_sn[0], rl_sn[1])
215
- return
216
- end
166
+ current_end = current_oldest_record_number + current_total_records - 1
167
+ old_end = read_start + read_num - 1
217
168
 
218
- read_more = false
219
- begin
220
- numlines = cur_end - old_end
221
-
222
- winlogs = el.read(Win32::EventLog::SEEK_READ | Win32::EventLog::FORWARDS_READ, old_end + 1)
223
- @receive_lines.call(@ch, winlogs, pe_sn)
224
-
225
- @pe.update(pe_sn[0], pe_sn[1])
226
- old_end = pe_sn[0] + pe_sn[1] -1
227
- end while read_more
228
- el.close
169
+ if current_oldest_record_number < read_start
170
+ # may be a record number rotated.
171
+ current_end += 0xFFFFFFFF
229
172
  end
230
- end
231
173
 
232
- class PositionFile
233
- def initialize(file, map, last_pos)
234
- @file = file
235
- @map = map
236
- @last_pos = last_pos
174
+ if current_end < old_end
175
+ # something occured.
176
+ @pos_storage.put(ch, [current_oldest_record_number, current_total_records])
177
+ return
237
178
  end
238
179
 
239
- def [](ch)
240
- if m = @map[ch]
241
- return m
242
- end
243
- @file.pos = @last_pos
244
- @file.write ch
245
- @file.write "\t"
246
- seek = @file.pos
247
- @file.write "00000000\t00000000\n"
248
- @last_pos = @file.pos
249
- @map[ch] = FilePositionEntry.new(@file, seek)
250
- end
251
-
252
- # parsing file and rebuild mysself
253
- def self.parse(file)
254
- map = {}
255
- file.pos = 0
256
- file.each_line {|line|
257
- # check and get a matched line as m
258
- m = /^([^\t]+)\t([0-9a-fA-F]+)\t([0-9a-fA-F]+)/.match(line)
259
- next unless m
260
- ch = m[1]
261
- pos = m[2].to_i(16)
262
- seek = file.pos - line.bytesize + ch.bytesize + 1
263
- map[ch] = FilePositionEntry.new(file, seek)
264
- }
265
- new(file, map, file.pos)
266
- end
180
+ winlogs = el.read(Win32::EventLog::SEEK_READ | Win32::EventLog::FORWARDS_READ, old_end + 1)
181
+ receive_lines(ch, winlogs)
182
+ @pos_storage.put(ch, [read_start, read_num + winlogs.size])
183
+ ensure
184
+ el.close
267
185
  end
268
-
269
- class FilePositionEntry
270
- START_SIZE = 8
271
- NUM_OFFSET = 9
272
- NUM_SIZE = 8
273
- LN_OFFSET = 17
274
- SIZE = 18
275
-
276
- def initialize(file, seek)
277
- @file = file
278
- @seek = seek
279
- end
280
-
281
- def update(start, num)
282
- @file.pos = @seek
283
- @file.write "%08x\t%08x" % [start, num]
284
- end
285
-
286
- def read_start
287
- @file.pos = @seek
288
- raw = @file.read(START_SIZE)
289
- raw ? raw.to_i(16) : 0
290
- end
291
-
292
- def read_num
293
- @file.pos = @seek + NUM_OFFSET
294
- raw = @file.read(NUM_SIZE)
295
- raw ? raw.to_i(16) : 0
296
- end
297
- end
298
-
299
- class MemoryPositionEntry
300
- def initialize
301
- @start = 0
302
- @num = 0
303
- end
304
-
305
- def update(start, num)
306
- @start = start
307
- @num = num
308
- end
309
-
310
- def read_start
311
- @start
312
- end
313
-
314
- def read_num
315
- @num
316
- end
317
- end
318
-
319
186
  end
320
187
  end
@@ -0,0 +1,47 @@
1
+ require 'win32/eventlog'
2
+
3
+ class EventLog
4
+ def initialize
5
+ @logger = Win32::EventLog.new
6
+ @app_source = "fluent-plugins"
7
+ end
8
+
9
+ def info(event_id, message)
10
+ @logger.report_event(
11
+ source: @app_source,
12
+ event_type: Win32::EventLog::INFO_TYPE,
13
+ event_id: event_id,
14
+ data: message
15
+ )
16
+ end
17
+
18
+ def warn(event_id, message)
19
+ @logger.report_event(
20
+ source: @app_source,
21
+ event_type: Win32::EventLog::WARN_TYPE,
22
+ event_id: event_id,
23
+ data: message
24
+ )
25
+ end
26
+
27
+ def crit(event_id, message)
28
+ @logger.report_event(
29
+ source: @app_source,
30
+ event_type: Win32::EventLog::ERROR_TYPE,
31
+ event_id: event_id,
32
+ data: message
33
+ )
34
+ end
35
+
36
+ end
37
+
38
+ module Fluent
39
+ module Plugin
40
+ class EventService
41
+ def run
42
+ eventlog = EventLog.new()
43
+ eventlog.info(65500, "Hi, from fluentd-plugins!! at " + Time.now.strftime("%Y/%m/%d %H:%M:%S "))
44
+ end
45
+ end
46
+ end
47
+ end
data/test/helper.rb CHANGED
@@ -27,3 +27,6 @@ require 'fluent/plugin/in_windows_eventlog'
27
27
 
28
28
  class Test::Unit::TestCase
29
29
  end
30
+ require 'fluent/test/helpers'
31
+
32
+ include Fluent::Test::Helpers
@@ -1,13 +1,18 @@
1
1
  require 'helper'
2
+ require 'generate-windows-event'
2
3
 
3
4
  class WindowsEventLogInputTest < Test::Unit::TestCase
5
+
4
6
  def setup
5
7
  Fluent::Test.setup
6
8
  end
7
9
 
8
- CONFIG = %[
9
- tag fluent.eventlog
10
- ]
10
+ CONFIG = config_element("ROOT", "", {"tag" => "fluent.eventlog"}, [
11
+ config_element("storage", "", {
12
+ '@type' => 'local',
13
+ 'persistent' => false
14
+ })
15
+ ])
11
16
 
12
17
  def create_driver(conf = CONFIG)
13
18
  Fluent::Test::Driver::Input.new(Fluent::Plugin::WindowsEventLogInput).configure(conf)
@@ -18,34 +23,26 @@ class WindowsEventLogInputTest < Test::Unit::TestCase
18
23
  assert_equal 'fluent.eventlog', d.instance.tag
19
24
  assert_equal 2, d.instance.read_interval
20
25
  assert_nil d.instance.pos_file
21
- assert_equal ['Application'], d.instance.channels
26
+ assert_equal ['application'], d.instance.channels
22
27
  assert_true d.instance.keys.empty?
23
28
  assert_false d.instance.read_from_head
24
29
  end
25
30
 
26
- def test_format
27
- d = create_driver
28
-
29
- # time = Time.parse("2011-01-02 13:14:15 UTC").to_i
30
- # d.emit({"a"=>1}, time)
31
- # d.emit({"a"=>2}, time)
32
-
33
- # d.expect_format %[2011-01-02T13:14:15Z\ttest\t{"a":1}\n]
34
- # d.expect_format %[2011-01-02T13:14:15Z\ttest\t{"a":2}\n]
35
-
36
- # d.run
37
- end
38
-
39
31
  def test_write
40
32
  d = create_driver
41
33
 
42
- # time = Time.parse("2011-01-02 13:14:15 UTC").to_i
43
- # d.emit({"a"=>1}, time)
44
- # d.emit({"a"=>2}, time)
34
+ service = Fluent::Plugin::EventService.new
35
+
36
+ d.run(expect_emits: 1) do
37
+ service.run
38
+ end
45
39
 
46
- # ### FileOutput#write returns path
47
- # path = d.run
48
- # expect_path = "#{TMP_DIR}/out_file_test._0.log.gz"
49
- # assert_equal expect_path, path
40
+ assert(d.events.length >= 1)
41
+ event = d.events.last
42
+ record = event.last
43
+ assert_equal("application", record["channel"])
44
+ assert_equal("65500", record["event_id"])
45
+ assert_equal("information", record["event_type"])
46
+ assert_equal("fluent-plugins", record["source_name"])
50
47
  end
51
48
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fluent-plugin-windows-eventlog
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - okahashi117
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2017-01-23 00:00:00.000000000 Z
13
+ date: 2017-06-06 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: bundler
@@ -60,7 +60,7 @@ dependencies:
60
60
  requirements:
61
61
  - - ">="
62
62
  - !ruby/object:Gem::Version
63
- version: 0.14.11
63
+ version: 0.14.12
64
64
  - - "<"
65
65
  - !ruby/object:Gem::Version
66
66
  version: '2'
@@ -70,7 +70,7 @@ dependencies:
70
70
  requirements:
71
71
  - - ">="
72
72
  - !ruby/object:Gem::Version
73
- version: 0.14.11
73
+ version: 0.14.12
74
74
  - - "<"
75
75
  - !ruby/object:Gem::Version
76
76
  version: '2'
@@ -91,7 +91,7 @@ dependencies:
91
91
  description: Fluentd Input plugin to read windwos event log.
92
92
  email:
93
93
  - naruki_okahashi@jbat.co.jp
94
- - cosmo0920.wp@gmail.com
94
+ - cosmo0920.oucc@gmail.com
95
95
  - repeatedly@gmail.com
96
96
  executables: []
97
97
  extensions: []
@@ -102,8 +102,10 @@ files:
102
102
  - LICENSE.txt
103
103
  - README.md
104
104
  - Rakefile
105
+ - appveyor.yml
105
106
  - fluent-plugin-winevtlog.gemspec
106
107
  - lib/fluent/plugin/in_windows_eventlog.rb
108
+ - test/generate-windows-event.rb
107
109
  - test/helper.rb
108
110
  - test/plugin/test_in_winevtlog.rb
109
111
  homepage: https://github.com/fluent/fluent-plugin-windows-eventlog
@@ -126,10 +128,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
126
128
  version: '0'
127
129
  requirements: []
128
130
  rubyforge_project:
129
- rubygems_version: 2.6.8
131
+ rubygems_version: 2.6.11
130
132
  signing_key:
131
133
  specification_version: 4
132
134
  summary: Fluentd Input plugin to read windows event log.
133
135
  test_files:
136
+ - test/generate-windows-event.rb
134
137
  - test/helper.rb
135
138
  - test/plugin/test_in_winevtlog.rb