diff mbox series

[U-Boot,13/13] log: Add documentation

Message ID 20170916212331.170463-14-sjg@chromium.org
State Superseded
Delegated to: Simon Glass
Headers show
Series log: Add a new logging feature | expand

Commit Message

Simon Glass Sept. 16, 2017, 9:23 p.m. UTC
Add documentation for the log system.

Signed-off-by: Simon Glass <sjg@chromium.org>
---

 doc/README.log | 220 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 220 insertions(+)
 create mode 100644 doc/README.log

Comments

Bin Meng Sept. 18, 2017, 3:47 a.m. UTC | #1
On Sun, Sep 17, 2017 at 5:23 AM, Simon Glass <sjg@chromium.org> wrote:
> Add documentation for the log system.
>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>
>  doc/README.log | 220 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 220 insertions(+)
>  create mode 100644 doc/README.log
>

Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Masahiro Yamada Sept. 20, 2017, 3:04 a.m. UTC | #2
Hi Simon


2017-09-17 6:23 GMT+09:00 Simon Glass <sjg@chromium.org>:

> +
> +
> +To Do
> +-----
> +
> +There are lots of useful additions that could be made. None of the below is
> +implemented! If you do one, please add a test in test/py/tests/test_log.py
> +
> +Convenience functions to support setting the category:
> +
> +   log_arch(level, format_string, ...) - category LOGC_ARCH
> +   log_board(level, format_string, ...) - category LOGC_BOARD
> +   log_core(level, format_string, ...) - category LOGC_CORE
> +   log_dt(level, format_string, ...) - category LOGC_DT


I do not want to see any more proliferation of log functions...



> +Convenience functions to support a category defined for a single file, for
> +example:
> +
> +   #define LOG_CATEGORY   UCLASS_USB
> +
> +all of these can use LOG_CATEGORY as the category, and a log level
> +corresponding to the function name:
> +
> +   logc(level, format_string, ...)
> +   pr_panic(format_string, ...)
> +   pr_crit(format_string, ...)
> +   pr_err(format_string, ...)
> +   pr_warn(format_string, ...)
> +   pr_note(format_string, ...)
> +   pr_info(format_string, ...)
> +   pr_detail(format_string, ...)
> +   pr_debug(format_string, ...)
>


Linux uses:

pr_emerg(fmt, ...)
pr_alert(fmt, ...)
pr_crit(fmt, ...)
pr_err(fmt, ...)
pr_warn(fmt, ...)
pr_notice(fmt, ...)
pr_info(fmt, ...)
pr_debug(fmt, ...)


Please do not invent similar, but different APIs.
Simon Glass Sept. 20, 2017, 1:49 p.m. UTC | #3
Hi Masahiro,

On 19 September 2017 at 21:04, Masahiro Yamada
<yamada.masahiro@socionext.com> wrote:
> Hi Simon
>
>
> 2017-09-17 6:23 GMT+09:00 Simon Glass <sjg@chromium.org>:
>
>> +
>> +
>> +To Do
>> +-----
>> +
>> +There are lots of useful additions that could be made. None of the below is
>> +implemented! If you do one, please add a test in test/py/tests/test_log.py
>> +
>> +Convenience functions to support setting the category:
>> +
>> +   log_arch(level, format_string, ...) - category LOGC_ARCH
>> +   log_board(level, format_string, ...) - category LOGC_BOARD
>> +   log_core(level, format_string, ...) - category LOGC_CORE
>> +   log_dt(level, format_string, ...) - category LOGC_DT
>
>
> I do not want to see any more proliferation of log functions...

So just a function where you specify the category?

>
>
>
>> +Convenience functions to support a category defined for a single file, for
>> +example:
>> +
>> +   #define LOG_CATEGORY   UCLASS_USB
>> +
>> +all of these can use LOG_CATEGORY as the category, and a log level
>> +corresponding to the function name:
>> +
>> +   logc(level, format_string, ...)
>> +   pr_panic(format_string, ...)
>> +   pr_crit(format_string, ...)
>> +   pr_err(format_string, ...)
>> +   pr_warn(format_string, ...)
>> +   pr_note(format_string, ...)
>> +   pr_info(format_string, ...)
>> +   pr_detail(format_string, ...)
>> +   pr_debug(format_string, ...)
>>
>
>
> Linux uses:
>
> pr_emerg(fmt, ...)
> pr_alert(fmt, ...)
> pr_crit(fmt, ...)
> pr_err(fmt, ...)
> pr_warn(fmt, ...)
> pr_notice(fmt, ...)
> pr_info(fmt, ...)
> pr_debug(fmt, ...)
>
>
> Please do not invent similar, but different APIs.

See my comment about log levels in the previous patch. I can keep
these all the same but want to add at least one more detail level.

Regards,
Simon
diff mbox series

Patch

diff --git a/doc/README.log b/doc/README.log
new file mode 100644
index 0000000000..0f2d8b84dd
--- /dev/null
+++ b/doc/README.log
@@ -0,0 +1,220 @@ 
+Logging in U-Boot
+=================
+
+Introduction
+------------
+
+U-Boot's internal operation involves many different steps and actions. From
+setting up the board to displaying a start-up screen to loading an Operating
+System, there are many component parts each with many actions.
+
+Most of the time this internal detail is not useful. Displaying it on the
+console would delay booting (U-Boot's primary purpose) and confuse users.
+
+But for digging into what is happening in a particular area, or for debugging
+a problem it is often useful to see what U-Boot is doing in more detail than
+is visible from the basic console output.
+
+U-Boot's logging feature aims to satisfy this goal for both users and
+developers.
+
+
+Logging levels
+--------------
+
+There are a number logging levels available, in increasing order of verbosity:
+
+   LOGL_PANIC	- Printed before U-Boot halts
+   LOGL_CRIT	- Indicates a critical error that will cause boot failure
+   LOGL_ERR	- Indicates an error that may cause boot failure
+   LOGL_WARN	- Warning about an unexpected condition
+   LOGL_NOTE	- Important information about progress
+   LOGL_INFO	- Information about normal boot progress
+   LOGL_DETAIL	- Detailed information (e.g. internal operation of drivers)
+   LOGL_DEBUG	- Debug information (useful for debugging a driver or subsystem)
+
+
+Logging category
+----------------
+
+Logging can come from a wide variety of places within U-Boot. Each log message
+has a category which is intended to allow messages to be filtered according to
+their source.
+
+The following main categories are defined:
+
+   LOGC_NONE	- Unknown category (e.g. a debug() statement)
+   UCLASS_...	- Related to a particular uclass (e.g. UCLASS_USB)
+   LOGC_ARCH	- Related to architecture-specific code
+   LOGC_BOARD	- Related to board-specific code
+   LOGC_CORE	- Related to core driver-model support
+   LOGC_DT	- Related to device tree control
+
+
+Enabling logging
+----------------
+
+The following options are used to enable logging at compile time:
+
+   CONFIG_LOG		- Enables the logging system
+   CONFIG_MAX_LOG_LEVEL - Max log level to build (anything higher is compiled
+				out)
+   CONFIG_LOG_CONSOLE	- Enable writing log records to the console
+
+If CONFIG_LOG is not set, then no logging will be available.
+
+The above have SPL versions also, e.g. CONFIG_SPL_MAX_LOG_LEVEL.
+
+
+Using DEBUG
+-----------
+
+U-Boot has traditionally used a #define called DEBUG to enable debugging on a
+file-by-file basis. The debug() macro compiles to a printf() statement if
+DEBUG is enabled, and an empty statement if not.
+
+With logging enabled, debug() statements are interpreted as logging output
+with a level of LOGL_DEBUG and a category of LOGC_NONE.
+
+The logging facilities are intended to replace DEBUG, but if DEBUG is defined
+at the top of a file, then it takes precedence. This means that debug()
+statements will result in output to the console and this output will not be
+logged.
+
+
+Logging destinations
+--------------------
+
+If logging information goes nowhere then it serves no purpose. U-Boot provides
+several possible determinations for logging information, all of which can be
+enabled or disabled independently:
+
+   console - goes to stdout
+
+
+Filters
+-------
+
+Filters are attached to log drivers to control what those drivers emit. Only
+records that pass through the filter make it to the driver.
+
+Filters can be based on several criteria:
+
+   - maximum log level
+   - in a set of categories
+   - in a set of files
+
+If no filters are attached to a driver then a default filter is used, which
+limits output to records with a level less than CONFIG_LOG_MAX_LEVEL.
+
+
+Logging statements
+------------------
+
+The main logging function is:
+
+   log(category, level, format_string, ...)
+
+Also debug() and error() will generate log records  - these use LOG_CATEGORY
+as the category, so you should #define this right at the top of the source
+file to ensure the category is correct.
+
+
+Code size
+---------
+
+Code size impact depends largely on what is enabled. The following numbers are
+for snow, which is a Thumb-2 board:
+
+This series: adds bss +20.0 data +4.0 rodata +4.0 text +44.0
+CONFIG_LOG: bss -52.0 data +92.0 rodata -635.0 text +1048.0
+CONFIG_LOG_MAX_LEVEL=7: bss +188.0 data +4.0 rodata +49183.0 text +98124.0
+
+The last option turns every debug() statement into a logging call, which
+bloats the code hugely. The advantage is that it is then possible to enable
+all logging within U-Boot.
+
+
+To Do
+-----
+
+There are lots of useful additions that could be made. None of the below is
+implemented! If you do one, please add a test in test/py/tests/test_log.py
+
+Convenience functions to support setting the category:
+
+   log_arch(level, format_string, ...) - category LOGC_ARCH
+   log_board(level, format_string, ...) - category LOGC_BOARD
+   log_core(level, format_string, ...) - category LOGC_CORE
+   log_dt(level, format_string, ...) - category LOGC_DT
+
+Convenience functions to support a category defined for a single file, for
+example:
+
+   #define LOG_CATEGORY   UCLASS_USB
+
+all of these can use LOG_CATEGORY as the category, and a log level
+corresponding to the function name:
+
+   logc(level, format_string, ...)
+   pr_panic(format_string, ...)
+   pr_crit(format_string, ...)
+   pr_err(format_string, ...)
+   pr_warn(format_string, ...)
+   pr_note(format_string, ...)
+   pr_info(format_string, ...)
+   pr_detail(format_string, ...)
+   pr_debug(format_string, ...)
+
+More logging destinations:
+
+   device - goes to a device (e.g. serial)
+   buffer - recorded in a memory buffer
+
+Convert debug() statements in the code to log() statements
+
+Support making printf() emit log statements a L_INFO level
+
+Convert error() statements in the code to log() statements
+
+Figure out what to do with BUG(), BUG_ON() and warn_non_spl()
+
+Figure out what to do with assert()
+
+Add a way to browse log records
+
+Add a way to record log records for browsing using an external tool
+
+Add commands to add and remove filters
+
+Add commands to add and remove log devices
+
+Allow sharing of printf format strings in log records to reduce storage size
+for large numbers of log records
+
+Add a command-line option to sandbox to set the default logging level
+
+Convert core driver model code to use logging
+
+Convert uclasses to use logging with the correct category
+
+Consider making log() calls emit an automatic newline, perhaps with a logn()
+   function to avoid that
+
+Passing log records through to linux (e.g. via device tree /chosen)
+
+Provide a command to access the number of log records generated, and the
+number dropped due to them being generated before the log system was ready.
+
+Add a printf() format string pragma so that log statements are checked properly
+
+Enhance the log console driver to show level / category / file / line
+information
+
+Add a command to add new log records and delete existing records.
+
+Provide additional log() functions - e.g. logc() to specify the category
+
+--
+Simon Glass <sjg@chromium.org>
+15-Sep-17