28
28
class LogStash ::Codecs ::Fluent < LogStash ::Codecs ::Base
29
29
config_name "fluent"
30
30
31
- public
32
31
def register
33
32
require "msgpack"
34
33
@decoder = MessagePack ::Unpacker . new
35
34
end
36
35
37
- public
38
- def decode ( data )
39
- @decoder . feed ( data )
40
- @decoder . each do |tag , epochtime , map |
41
- event = LogStash ::Event . new ( map . merge (
42
- LogStash ::Event ::TIMESTAMP => LogStash ::Timestamp . at ( epochtime ) ,
43
- "tags" => tag
44
- ) )
45
- yield event
36
+ def decode ( data , &block )
37
+ @decoder . feed_each ( data ) do |item |
38
+ decode_event ( item , &block )
46
39
end
47
40
end # def decode
48
41
49
- public
50
42
def encode ( event )
51
43
tag = event . get ( "tags" ) || "log"
52
44
epochtime = event . timestamp . to_i
@@ -59,4 +51,57 @@ def encode(event)
59
51
@on_event . call ( event , MessagePack . pack ( [ tag , epochtime , data . merge ( LogStash ::Event ::TIMESTAMP => event . timestamp . to_iso8601 ) ] ) )
60
52
end # def encode
61
53
54
+ private
55
+
56
+ def decode_event ( data , &block )
57
+ tag = data [ 0 ]
58
+ entries = data [ 1 ]
59
+
60
+ case entries
61
+ when String
62
+ # PackedForward
63
+ option = data [ 2 ]
64
+ compressed = ( option && option [ 'compressed' ] == 'gzip' )
65
+ if compressed
66
+ raise ( LogStash ::Error , "PackedForward with compression is not supported" )
67
+ end
68
+
69
+ entries_decoder = MessagePack ::Unpacker . new
70
+ entries_decoder . feed_each ( entries ) do |entry |
71
+ epochtime = entry [ 0 ]
72
+ map = entry [ 1 ]
73
+ event = LogStash ::Event . new ( map . merge (
74
+ LogStash ::Event ::TIMESTAMP => LogStash ::Timestamp . at ( epochtime ) ,
75
+ "tags" => [ tag ]
76
+ ) )
77
+ yield event
78
+ end
79
+ when Array
80
+ # Forward
81
+ entries . each do |entry |
82
+ epochtime = entry [ 0 ]
83
+ map = entry [ 1 ]
84
+ event = LogStash ::Event . new ( map . merge (
85
+ LogStash ::Event ::TIMESTAMP => LogStash ::Timestamp . at ( epochtime ) ,
86
+ "tags" => [ tag ]
87
+ ) )
88
+ yield event
89
+ end
90
+ when Fixnum
91
+ # Message
92
+ epochtime = entries
93
+ map = data [ 2 ]
94
+ event = LogStash ::Event . new ( map . merge (
95
+ LogStash ::Event ::TIMESTAMP => LogStash ::Timestamp . at ( epochtime ) ,
96
+ "tags" => [ tag ]
97
+ ) )
98
+ yield event
99
+ else
100
+ raise ( LogStash ::Error , "Unknown event type" )
101
+ end
102
+ rescue StandardError => e
103
+ @logger . error ( "Fluent parse error, original data now in message field" , :error => e , :data => data )
104
+ yield LogStash ::Event . new ( "message" => data , "tags" => [ "_fluentparsefailure" ] )
105
+ end
106
+
62
107
end # class LogStash::Codecs::Fluent
0 commit comments