Wiki page log-levels.md changed with summary [] by Gareth Halfacree

This commit is contained in:
Gareth Halfacree 2017-12-11 06:57:36 -08:00 committed by apache
parent 73ac066ff1
commit 49ee869a22
1 changed files with 12 additions and 103 deletions

View File

@ -1,8 +1,8 @@
---
~~Title: Log Levels~~
~~Title: Error Logging~~
---
# Log Levels #
# Error Logging #
EFL uses a common method to log error messages, called ``Eina_Log``, which allows you to adjust the verbosity of the logs using environment variables.
@ -68,109 +68,18 @@ EINA_LOG_LEVEL={N} EINA_LOG_LEVELS_GLOB=eina_*:0 ./{application}
Removing these internal logs from the output makes it easier for you to see your own domain messages.
## Eina_Log_Print() ##
### Aborting on Selected Log Level ##
``Eina`` provides ``eina_log_print()``, a standard function to manage all logging messages. This function may be called directly or using helper macros including ``EINA_LOG_DBG()``, ``EINA_LOG_ERR()`` or those that take a specific domain as an argument as with ``EINA_LOG_DOM_DBG()`` and ``EINA_LOG_DOM_ERR()``. Internally, ``eina_log_print()`` will call the function defined with ``eina_log_print_cb_set()``, which defaults to ``eina_log_print_cb_stderr()`` but may be changed to do whatever you need such as networking or syslog logging.
As well as controlling the logs themselves, the respective log levels can be used to close a program - calling ``abort()`` - once a message of a given level is logged, allowing you to automatically terminate execution. This is toggled through the environment variable ``EINA_LOG_ABORT``, while the level to be considered critical - and thus terminate execution - through the environment variable ``EINA_LOG_ABORT_LEVEL``.
The logging system is thread-safe once initialized with ``eina_log_threads_enable()``. The thread that calls this function first is considered "main thread" and other threads will have their thread id (``pthread_self()``) printed in the log message so it is easy to detect from where the messages are coming.
> **NOTE:**
> Aborting at a particular log level can also be controlled from within the application itself using the ``eina_log_abort_on_critical_set()`` and ``eina_log_abort_on_critical_level_set()`` functions.
The different logging levels serve to customize the amount of debugging information and may be used to automatically call ``abort()`` once a message of a given level is printed. This is controlled by the environment variable ``EINA_LOG_ABORT`` and the level to be considered critical with ``EINA_LOG_ABORT_LEVEL``. These can be changed with ``eina_log_abort_on_critical_set()`` and ``eina_log_abort_on_critical_level_set()``.
```bash
EINA_LOG_ABORT_LEVEL={N} EINA_LOG_ABORT ./{application}
```
The default maximum level to print is defined by the environment variable ``EINA_LOG_LEVEL`` but may be set per-domain with ``EINA_LOG_LEVELS``. It will default to ``EINA_LOG_ERR``. This can be changed with ``eina_log_level_set()``.
## Further Reading ##
To use the log system ``Eina`` must be initialized with ``eina_init()`` and later shut down with ``eina_shutdown()``.
### Controlling Print Callbacks ###
The log module allows the user to change the way ``eina_log_print()`` displays messages. It suffices to pass to ``eina_log_print_cb_set()`` the function used to display the message. That function must be of type ``#Eina_Log_Print_Cb``. As custom data can be passed to that callback, customized messages can be displayed.
It is suggested to not use ``__FILE__``, ``__FUNCTION__`` or ``__LINE__`` when writing that callback, but when defining macros like ``EINA_LOG_ERR()`` and others.
## Logging from an Application ##
The following example, available for download from the [Enlightenment Project git repository](https://git.enlightenment.org/tools/examples.git/tree/reference/c/eina/src/eina_log.c), demonstrates the control of logging from within an application.
```c
#define EFL_EO_API_SUPPORT 1
#define EFL_BETA_API_SUPPORT 1
#include <stdio.h>
#include <Eina.h>
#include <Efl_Core.h>
/*
* Efl Core Log examples.
*
* This demo shows how to log at various levels and to change what log is shown.
* You can also use a custom log printer in your app as shown in _log_custom.
*/
static double
_divide(int num, int denom)
{
if (denom == 0)
EINA_LOG_CRIT("Attempt to divide by 0\n");
else
{
if (denom < 0)
EINA_LOG_WARN("Possible undesirable effect, divide by negative number");
double ret = ((double) num / denom);
EINA_LOG_INFO("%d / %d = %f\n", num, denom, ret);
return ret;
}
return -1;
}
static void
_divides()
{
_divide(5, 1);
_divide(5, -1);
_divide(5, 0);
}
static void
_log_levels()
{
printf("Executing with default logging\n");
_divides();
eina_log_level_set(EINA_LOG_LEVEL_WARN);
printf("Executing with WARN level\n"); // same as EINA_LOG_LEVEL = 2
_divides();
eina_log_level_set(EINA_LOG_LEVEL_INFO);
printf("Executing with INFO on\n"); // same as EINA_LOG_LEVEL = 3
_divides();
}
void _print_cb(const Eina_Log_Domain *domain EINA_UNUSED, Eina_Log_Level level,
const char *file, const char *fnc, int line,
const char *fmt, void *data EINA_UNUSED, va_list args)
{
fprintf(stdout, "LOG %d <%s (%s:%d)> ", level, fnc, file, line);
vfprintf(stdout, fmt, args);
putc('\n', stdout);
}
static void
_log_custom()
{
printf("Executing with custom log printer\n");
eina_log_print_cb_set(_print_cb, NULL);
_divides();
}
EAPI_MAIN void
efl_main(void *data EINA_UNUSED, const Efl_Event *ev EINA_UNUSED)
{
_log_levels();
_log_custom();
efl_exit(0);
}
EFL_MAIN()
```
[Eina Programming Guide: Logging](/develop/c/eina/logging.md)
: A reference, including example, for the Eina_Log module.