@@ -244,26 +244,38 @@ defmodule Logger.Formatter do
244244 case if ( is_function ( enabled , 0 ) , do: enabled . ( ) , else: enabled ) do
245245 true ->
246246 color = md [ :ansi_color ] || Map . fetch! ( colors , level )
247- fragment = IO.ANSI . format_fragment ( color , true )
248- data = IO . iodata_to_binary ( data )
249- size = byte_size ( data )
247+ [ IO.ANSI . format_fragment ( color , true ) , add_reset ( data ) ]
250248
251- cond do
252- :binary . at ( data , size - 2 ) == ?\r and :binary . at ( data , size - 1 ) == ?\n ->
253- [ fragment , binary_part ( data , 0 , size - 2 ) , IO.ANSI . reset ( ) | "\r \n " ]
249+ false ->
250+ data
251+ end
252+ end
254253
255- :binary . at ( data , size - 1 ) == ?\n ->
256- [ fragment , binary_part ( data , 0 , size - 1 ) , IO.ANSI . reset ( ) , ?\n ]
254+ defp add_reset ( binary ) when is_binary ( binary ) do
255+ size = byte_size ( binary )
257256
258- true ->
259- [ fragment , data | IO.ANSI . reset ( ) ]
257+ cond do
258+ binary == "" ->
259+ IO.ANSI . reset ( )
260+
261+ :binary . at ( binary , size - 1 ) == ?\n ->
262+ if size > 1 and :binary . at ( binary , size - 2 ) == ?\r do
263+ [ binary_part ( binary , 0 , size - 2 ) , IO.ANSI . reset ( ) | "\r \n " ]
264+ else
265+ [ binary_part ( binary , 0 , size - 1 ) , IO.ANSI . reset ( ) , ?\n ]
260266 end
261267
262- false ->
263- data
268+ true ->
269+ [ binary | IO.ANSI . reset ( ) ]
264270 end
265271 end
266272
273+ defp add_reset ( [ ?\r , ?\n ] ) , do: [ IO.ANSI . reset ( ) , ?\r , ?\n ]
274+ defp add_reset ( [ ?\n ] ) , do: [ IO.ANSI . reset ( ) , ?\n ]
275+ defp add_reset ( [ last ] ) , do: add_reset ( last )
276+ defp add_reset ( [ h | t ] ) , do: [ h | add_reset ( t ) ]
277+ defp add_reset ( rest ) , do: [ rest | IO.ANSI . reset ( ) ]
278+
267279 @ doc """
268280 Formats the message of a log event.
269281 """
0 commit comments