forked from enlightenment/www-content
Wiki page log-levels.md changed with summary [] by Gareth Halfacree
This commit is contained in:
parent
73ac066ff1
commit
49ee869a22
|
@ -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.
|
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.
|
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()``.
|
|
||||||
|
|
||||||
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()
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Further Reading ##
|
||||||
|
|
||||||
|
[Eina Programming Guide: Logging](/develop/c/eina/logging.md)
|
||||||
|
: A reference, including example, for the Eina_Log module.
|
Loading…
Reference in New Issue