File 4381-feat-kernel-allow-using-custom-IO-devices-in-logger_.patch of Package erlang
From 28f05cacb21d8ecdd4f4b969237814639b9c836a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C5=81ukasz=20Niemier?= <lukasz@niemier.pl>
Date: Fri, 31 Jan 2020 17:30:04 +0100
Subject: [PATCH 1/2] feat(kernel): allow using custom IO devices in
logger_std_h
This is needed for simpler integration with Elixir logger which allows
any device to be set as an output device. It also provides greater
flexibility when needed to integrate with log catchers.
---
lib/kernel/doc/src/logger_std_h.xml | 2 +-
lib/kernel/src/logger_std_h.erl | 5 +++++
2 files changed, 6 insertions(+), 1 deletion(-)
diff --git a/lib/kernel/doc/src/logger_std_h.xml b/lib/kernel/doc/src/logger_std_h.xml
index 5ac4f58d12..84f53fa9b1 100644
--- a/lib/kernel/doc/src/logger_std_h.xml
+++ b/lib/kernel/doc/src/logger_std_h.xml
@@ -55,7 +55,7 @@
is stored in a sub map with the key <c>config</c>, and can contain the
following parameters:</p>
<taglist>
- <tag><marker id="type"/><c>type = standard_io | standard_error | file</c></tag>
+ <tag><marker id="type"/><c>type = standard_io | standard_error | file | {device, atom() | file:io_device()}</c></tag>
<item>
<p>Specifies the log destination.</p>
<p>The value is set when the handler is added, and it cannot
diff --git a/lib/kernel/src/logger_std_h.erl b/lib/kernel/src/logger_std_h.erl
index dbbd6fbc1f..6465dd0e99 100644
--- a/lib/kernel/src/logger_std_h.erl
+++ b/lib/kernel/src/logger_std_h.erl
@@ -150,6 +150,8 @@ check_h_config(Type,[{type,Type} | Config]) when Type =:= standard_io;
Type =:= standard_error;
Type =:= file ->
check_h_config(Type,Config);
+check_h_config({device,Device},[{type,{device,Device}} | Config]) ->
+ check_h_config({device,Device},Config);
check_h_config(file,[{file,File} | Config]) when is_list(File) ->
check_h_config(file,Config);
check_h_config(file,[{modes,Modes} | Config]) when is_list(Modes) ->
@@ -419,6 +421,9 @@ file_ctrl_init(HandlerName,
{error,Reason} ->
Starter ! {self(),{error,{open_failed,FileName,Reason}}}
end;
+file_ctrl_init(HandlerName, #{type:={device,Dev}}, Starter) ->
+ Starter ! {self(),ok},
+ file_ctrl_loop(#{handler_name=>HandlerName,dev=>Dev});
file_ctrl_init(HandlerName, #{type:=StdDev}, Starter) ->
Starter ! {self(),ok},
file_ctrl_loop(#{handler_name=>HandlerName,dev=>StdDev}).
--
2.16.4