-
Notifications
You must be signed in to change notification settings - Fork 64
/
log_stream.ex
71 lines (59 loc) · 2.09 KB
/
log_stream.ex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
defmodule RigOutboundGateway.Kinesis.LogStream do
@moduledoc """
Converts the Java-client output to Elixir log messages.
"""
require Logger
alias __MODULE__
defstruct buffer: ""
defimpl Collectable do
@log_prefix "[KINESIS JAVA-CLIENT] "
def into(%LogStream{} = original_stream) do
collector_fn = fn
stream, {:cont, x} -> handle_input(stream, x)
stream, _ -> handle_input(stream)
end
acc = original_stream
{acc, collector_fn}
end
defp handle_input(stream) do
# No input, so we've reached the end. Handle remaining input:
handle_line(stream.buffer)
%LogStream{buffer: ""}
end
defp handle_input(stream, input) do
buffered_input = stream.buffer <> input
case String.split(buffered_input, "\n") do
[_incomplete_line] ->
# No newline yet -> use as new buffer:
%LogStream{buffer: buffered_input}
[line_closing | remainder] ->
# There is a newline in the stream -> log the line:
handle_line(line_closing)
# Set the buffer to the remaining input:
%LogStream{buffer: Enum.join(remainder)}
end
end
# The log message format is set by the -D parameter to Porcelain.exec below.
# Here we parse the actual log level out of the message.
defp handle_line(line) do
case Regex.named_captures(~r/^(?<level>[^:]+): (?<msg>.+)$/, line) do
nil -> Logger.error(@log_prefix <> line)
%{"level" => java_level, "msg" => msg} -> handle_parsed_line(java_level, msg)
end
end
defp handle_parsed_line(java_level, msg) do
case convert_level(java_level) do
nil ->
Logger.error("failed to parse log level #{java_level}")
Logger.error("#{@log_prefix}#{java_level}: #{msg}")
elixir_level ->
Logger.log(elixir_level, @log_prefix <> msg)
end
end
defp convert_level("FINE"), do: :debug
defp convert_level("INFO"), do: :info
defp convert_level("WARNING"), do: :warn
defp convert_level("SEVERE"), do: :error
defp convert_level(_), do: nil
end
end