gmessages: Add support for G_MESSAGES_USE_STDERR env variable

Make possible to run glib processes where all the GMessage's output is
written to stderr.

By default we do it only for log levels greater or equal than warning,
but in some cases we may want to send all the glib logging to stderr.

This was possible to do programmatically, but there might be still cases
in which this has to be setup in the environment.

So, add support for a new environment variable, without changing the
ability for a program to set this to another value (at early start).
This commit is contained in:
Marco Trevisan (Treviño) 2023-01-12 22:38:00 +01:00
parent 6a0ea79203
commit 2547675af9
2 changed files with 37 additions and 1 deletions

View File

@ -112,6 +112,24 @@ How to run and debug your GLib application
</para>
</formalpara>
<formalpara id="G_MESSAGES_USE_STDERR">
<title><envar>G_MESSAGES_USE_STDERR</envar></title>
<para>
Set it to `1` in order to use `stderr` by default to write messages of
levels %G_LOG_LEVEL_INFO and %G_LOG_LEVEL_DEBUG (that by default are
written to `stdin`).
</para>
<para>
This value can be overridden by applications using
g_log_writer_default_set_use_stderr().
</para>
<para>
This environment variable only affects the default log handler,
g_log_default_handler().
</para>
</formalpara>
<formalpara id="G-DEBUG:CAPS">
<title><envar>G_DEBUG</envar></title>

View File

@ -1169,6 +1169,20 @@ static const gchar *log_level_to_color (GLogLevelFlags log_level,
static const gchar *color_reset (gboolean use_color);
static gboolean gmessages_use_stderr = FALSE;
static gsize gmessages_use_stderr_initialized = 0;
static inline gboolean
g_messages_use_stderr (void)
{
if (g_once_init_enter (&gmessages_use_stderr_initialized))
{
gmessages_use_stderr = g_strcmp0 (
g_getenv ("G_MESSAGES_USE_STDERR"), "1") == 0;
g_once_init_leave (&gmessages_use_stderr_initialized, TRUE);
}
return gmessages_use_stderr;
}
/**
* g_log_writer_default_set_use_stderr:
@ -1195,6 +1209,10 @@ void
g_log_writer_default_set_use_stderr (gboolean use_stderr)
{
g_return_if_fail (g_thread_n_created () == 0);
if (g_once_init_enter (&gmessages_use_stderr_initialized))
g_once_init_leave (&gmessages_use_stderr_initialized, TRUE);
gmessages_use_stderr = use_stderr;
}
@ -1478,7 +1496,7 @@ log_level_to_priority (GLogLevelFlags log_level)
static FILE *
log_level_to_file (GLogLevelFlags log_level)
{
if (gmessages_use_stderr)
if G_UNLIKELY (g_messages_use_stderr ())
return stderr;
if (log_level & (G_LOG_LEVEL_ERROR | G_LOG_LEVEL_CRITICAL |