mirror of
https://github.com/fluent/fluentd-ui.git
synced 2025-08-20 14:01:02 +02:00
commit
21eff246da
@ -117,12 +117,14 @@ class Fluentd
|
|||||||
# 2014-06-30 11:24:08 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.2/lib/ruby/2.1.0/socket.rb:461:in `block in tcp_server_sockets'
|
# 2014-06-30 11:24:08 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.2/lib/ruby/2.1.0/socket.rb:461:in `block in tcp_server_sockets'
|
||||||
# ]
|
# ]
|
||||||
# }
|
# }
|
||||||
subject, *notes = *buf.reverse
|
split_error_lines_to_error_units(buf.reverse).each do |error_unit|
|
||||||
block.call({
|
block.call({
|
||||||
subject: subject,
|
subject: error_unit[:subject],
|
||||||
notes: notes,
|
notes: error_unit[:notes],
|
||||||
})
|
})
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
buf = []
|
buf = []
|
||||||
next
|
next
|
||||||
end
|
end
|
||||||
@ -132,6 +134,37 @@ class Fluentd
|
|||||||
io && io.close
|
io && io.close
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def split_error_lines_to_error_units(buf)
|
||||||
|
# NOTE: if a following log is given
|
||||||
|
#
|
||||||
|
#2014-05-27 10:54:37 +0900 [error]: unexpected error error_class=Errno::EADDRINUSE error=#<Errno::#EADDRINUSE: Address already in use - bind(2) for "0.0.0.0" port 24224>
|
||||||
|
#2014-05-27 10:55:40 +0900 [error]: unexpected error error_class=Errno::EADDRINUSE error=#<Errno::#EADDRINUSE: Address already in use - bind(2) for "0.0.0.0" port 24224>
|
||||||
|
# 2014-05-27 10:55:40 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/cool.io-1.2.4/lib/cool.io/server.rb:57:in `initialize'
|
||||||
|
# 2014-05-27 10:55:40 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/cool.io-1.2.4/lib/cool.io/server.rb:57:in `new'
|
||||||
|
#
|
||||||
|
#the first line and second line must be each "error_unit". and after third lines lines are "notes" of second error unit of .
|
||||||
|
# [
|
||||||
|
# { subject: "2014-05-27 10:54:37 +0900 [error]: unexpected error error_class=Errno::EADDRINUSE error=#<Errno::#EADDRINUSE: Address already in use - bind(2) for "0.0.0.0" port 24224> ",
|
||||||
|
# notes: [] },
|
||||||
|
# { subject: "2014-05-27 10:55:40 +0900 [error]: unexpected error error_class=Errno::EADDRINUSE error=#<Errno::#EADDRINUSE: Address already in use - bind(2) for "0.0.0.0" port 24224> ",
|
||||||
|
# notes: [
|
||||||
|
# "2014-05-27 10:55:40 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/cool.io-1.2.4/lib/cool.io/server.rb:57:in `initialize'",
|
||||||
|
# "2014-05-27 10:55:40 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/cool.io-1.2.4/lib/cool.io/server.rb:57:in `new'"
|
||||||
|
# ]
|
||||||
|
# },
|
||||||
|
# ]
|
||||||
|
#
|
||||||
|
return_array = []
|
||||||
|
buf.each_with_index do |b, i|
|
||||||
|
if b.match(/\A /)
|
||||||
|
return_array[-1][:notes] << b
|
||||||
|
else
|
||||||
|
return_array << { subject: b, notes: [] }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return return_array.reverse
|
||||||
|
end
|
||||||
|
|
||||||
def detached_command(cmd)
|
def detached_command(cmd)
|
||||||
thread = Bundler.with_clean_env do
|
thread = Bundler.with_clean_env do
|
||||||
pid = spawn(cmd)
|
pid = spawn(cmd)
|
||||||
|
@ -7,26 +7,24 @@ class FileReverseReader
|
|||||||
end
|
end
|
||||||
|
|
||||||
def each_line(&block)
|
def each_line(&block)
|
||||||
|
#read from the end of file
|
||||||
io.seek(0, IO::SEEK_END)
|
io.seek(0, IO::SEEK_END)
|
||||||
buf = ""
|
buf = ""
|
||||||
loop do
|
loop do
|
||||||
if reach_start_of_file?
|
if reach_start_of_file?
|
||||||
last_pos = io.pos
|
read_rest(buf, &block)
|
||||||
io.seek(0, IO::SEEK_SET)
|
|
||||||
buf.insert(0, io.read(last_pos))
|
|
||||||
split_each_line(buf, &block)
|
|
||||||
break
|
break
|
||||||
end
|
end
|
||||||
|
|
||||||
io.seek(-1 * step, IO::SEEK_CUR)
|
read_to_buf_by_step(buf)
|
||||||
buf.insert(0, io.read(step))
|
|
||||||
io.seek(-1 * step, IO::SEEK_CUR)
|
#if buffer dose not include multi lines, seek more.
|
||||||
next if buf[$/].nil?
|
if buf[$/].nil?
|
||||||
gap = buf.index($/)
|
next
|
||||||
buf.gsub!(/\A.*?\n/, "")
|
else
|
||||||
split_each_line(buf, &block)
|
split_only_whole_lines(buf, &block)
|
||||||
buf = ""
|
buf = ""
|
||||||
io.seek(gap, IO::SEEK_CUR)
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -43,6 +41,33 @@ class FileReverseReader
|
|||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
|
def read_rest(buf, &block)
|
||||||
|
last_pos = io.pos
|
||||||
|
io.seek(0, IO::SEEK_SET)
|
||||||
|
buf.insert(0, io.read(last_pos))
|
||||||
|
split_each_line(buf, &block)
|
||||||
|
end
|
||||||
|
|
||||||
|
def read_to_buf_by_step(buf)
|
||||||
|
#move up file pointer by one step
|
||||||
|
io.seek(-1 * step, IO::SEEK_CUR) #point[A]
|
||||||
|
#read strings by one step from the pointer, and insert to buffer
|
||||||
|
#(on io.read, file pointer returns down to the point before [A])
|
||||||
|
buf.insert(0, io.read(step))
|
||||||
|
#forword file pointer to [A]
|
||||||
|
io.seek(-1 * step, IO::SEEK_CUR)
|
||||||
|
end
|
||||||
|
|
||||||
|
def split_only_whole_lines(buf, &block)
|
||||||
|
#if budder includes multi lines,
|
||||||
|
gap = buf.index($/)
|
||||||
|
#cut off first line (*first* line because it's seeking from end of file, and first line may be broken-line)
|
||||||
|
buf.gsub!(/\A.*?\n/, "")
|
||||||
|
split_each_line(buf, &block)
|
||||||
|
#move file pointer to the gap(= the end of *first* line)
|
||||||
|
io.seek(gap, IO::SEEK_CUR)
|
||||||
|
end
|
||||||
|
|
||||||
def split_each_line(buf, &block)
|
def split_each_line(buf, &block)
|
||||||
return unless buf.force_encoding('utf-8').valid_encoding?
|
return unless buf.force_encoding('utf-8').valid_encoding?
|
||||||
buf.split($/).reverse.each do |line|
|
buf.split($/).reverse.each do |line|
|
||||||
|
7
spec/support/fixtures/error3.log
Normal file
7
spec/support/fixtures/error3.log
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
2014-05-27 10:54:37 +0900 [info]: listening fluent socket on 0.0.0.0:24224
|
||||||
|
2014-05-27 10:54:37 +0900 [error]: unexpected error error_class=Errno::EADDRINUSE error=#<Errno::EADDRINUSE: 1 Address already in use - bind(2) for "0.0.0.0" port 24224>
|
||||||
|
2014-05-27 10:55:40 +0900 [error]: unexpected error error_class=Errno::EADDRINUSE error=#<Errno::EADDRINUSE: 2 Address already in use - bind(2) for "0.0.0.0" port 24224>
|
||||||
|
2014-05-27 10:55:40 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/cool.io-1.2.4/lib/cool.io/server.rb:57:in `initialize'
|
||||||
|
2014-05-27 10:55:40 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/cool.io-1.2.4/lib/cool.io/server.rb:57:in `new'
|
||||||
|
2014-05-27 11:28:12 +0900 [error]: unexpected error error_class=Errno::EADDRINUSE error=#<Errno::EADDRINUSE: 3 Address already in use - bind(2) for "0.0.0.0" port 24224>
|
||||||
|
2014-05-27 11:28:12 +0900 [error]: /Users/uu59/.rbenv/versions/2.1.0/lib/ruby/gems/2.1.0/gems/cool.io-1.2.4/lib/cool.io/server.rb:57:in `initialize'
|
@ -108,6 +108,20 @@ shared_examples_for "Fluentd::Agent has common behavior" do |klass|
|
|||||||
one.should >= two
|
one.should >= two
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context "have 3 errors log includeing sequential 2 error log" do
|
||||||
|
let(:logfile) { File.expand_path("./spec/support/fixtures/error3.log", Rails.root) }
|
||||||
|
subject { instance.recent_errors(3) }
|
||||||
|
|
||||||
|
it "count 3 errors" do
|
||||||
|
subject[0][:subject].should include("3 Address already in use - bind(2)")
|
||||||
|
subject[0][:notes].size.should be 1
|
||||||
|
subject[1][:subject].should include("2 Address already in use - bind(2)")
|
||||||
|
subject[1][:notes].size.should be 2
|
||||||
|
subject[2][:subject].should include("1 Address already in use - bind(2)")
|
||||||
|
subject[2][:notes].size.should be 0
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Loading…
x
Reference in New Issue
Block a user