blob: 7fdd1132efe1767c4d1327f0fdacb1f89bbb247c [file] [log] [blame]
Heinrich Schuchardta7813912020-05-31 10:46:12 +02001.. SPDX-License-Identifier: GPL-2.0+
2.. Copyright (c) 2017 Simon Glass <sjg@chromium.org>
3
4Logging in U-Boot
5=================
6
7Introduction
8------------
9
10U-Boot's internal operation involves many different steps and actions. From
11setting up the board to displaying a start-up screen to loading an Operating
12System, there are many component parts each with many actions.
13
14Most of the time this internal detail is not useful. Displaying it on the
15console would delay booting (U-Boot's primary purpose) and confuse users.
16
17But for digging into what is happening in a particular area, or for debugging
18a problem it is often useful to see what U-Boot is doing in more detail than
19is visible from the basic console output.
20
21U-Boot's logging feature aims to satisfy this goal for both users and
22developers.
23
Heinrich Schuchardta7813912020-05-31 10:46:12 +020024Logging levels
25--------------
26
Sean Anderson8ba0f892020-10-27 19:55:41 -040027There are a number logging levels available.
Heinrich Schuchardta7813912020-05-31 10:46:12 +020028
Sean Anderson8ba0f892020-10-27 19:55:41 -040029.. kernel-doc:: include/log.h
30 :identifiers: log_level_t
Heinrich Schuchardta7813912020-05-31 10:46:12 +020031
32Logging category
33----------------
34
35Logging can come from a wide variety of places within U-Boot. Each log message
36has a category which is intended to allow messages to be filtered according to
37their source.
38
Sean Anderson8ba0f892020-10-27 19:55:41 -040039.. kernel-doc:: include/log.h
40 :identifiers: log_category_t
Heinrich Schuchardta7813912020-05-31 10:46:12 +020041
42Enabling logging
43----------------
44
45The following options are used to enable logging at compile time:
46
47* CONFIG_LOG - Enables the logging system
48* CONFIG_LOG_MAX_LEVEL - Max log level to build (anything higher is compiled
49 out)
50* CONFIG_LOG_CONSOLE - Enable writing log records to the console
51
52If CONFIG_LOG is not set, then no logging will be available.
53
54The above have SPL and TPL versions also, e.g. CONFIG_SPL_LOG_MAX_LEVEL and
55CONFIG_TPL_LOG_MAX_LEVEL.
56
Heinrich Schuchardta7813912020-05-31 10:46:12 +020057Temporary logging within a single file
58--------------------------------------
59
60Sometimes it is useful to turn on logging just in one file. You can use this
61
62.. code-block:: c
63
64 #define LOG_DEBUG
65
66to enable building in of all logging statements in a single file. Put it at
Sean Anderson8ba0f892020-10-27 19:55:41 -040067the top of the file, before any #includes.
Heinrich Schuchardta7813912020-05-31 10:46:12 +020068
Sean Anderson8ba0f892020-10-27 19:55:41 -040069To actually get U-Boot to output this you need to also set the default logging
70level - e.g. set CONFIG_LOG_DEFAULT_LEVEL to 7 (:c:type:`LOGL_DEBUG`) or more.
71Otherwise debug output is suppressed and will not be generated.
72
73Using DEBUG
74-----------
75
76U-Boot has traditionally used a #define called DEBUG to enable debugging on a
77file-by-file basis. The debug() macro compiles to a printf() statement if
78DEBUG is enabled, and an empty statement if not.
79
80With logging enabled, debug() statements are interpreted as logging output
81with a level of LOGL_DEBUG and a category of LOGC_NONE.
82
83The logging facilities are intended to replace DEBUG, but if DEBUG is defined
84at the top of a file, then it takes precedence. This means that debug()
85statements will result in output to the console and this output will not be
86logged.
87
88Logging statements
89------------------
90
91The main logging function is:
92
93.. code-block:: c
94
95 log(category, level, format_string, ...)
96
97Also debug() and error() will generate log records - these use LOG_CATEGORY
98as the category, so you should #define this right at the top of the source
99file to ensure the category is correct.
100
101You can also define CONFIG_LOG_ERROR_RETURN to enable the log_ret() macro. This
102can be used whenever your function returns an error value:
103
104.. code-block:: c
105
106 return log_ret(uclass_first_device(UCLASS_MMC, &dev));
107
108This will write a log record when an error code is detected (a value < 0). This
109can make it easier to trace errors that are generated deep in the call stack.
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200110
111Convenience functions
Sean Anderson8ba0f892020-10-27 19:55:41 -0400112~~~~~~~~~~~~~~~~~~~~~
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200113
114A number of convenience functions are available to shorten the code needed
115for logging:
116
117* log_err(_fmt...)
118* log_warning(_fmt...)
119* log_notice(_fmt...)
120* log_info(_fmt...)
121* log_debug(_fmt...)
122* log_content(_fmt...)
123* log_io(_fmt...)
124
125With these the log level is implicit in the name. The category is set by
126LOG_CATEGORY, which you can only define once per file, above all #includes, e.g.
127
128.. code-block:: c
129
130 #define LOG_CATEGORY LOGC_ALLOC
131
Simon Glass7ad1e0b2020-10-13 19:55:07 -0600132or
133
134.. code-block:: c
135
136 #define LOG_CATEGORY UCLASS_SPI
137
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200138Remember that all uclasses IDs are log categories too.
139
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200140Logging destinations
141--------------------
142
143If logging information goes nowhere then it serves no purpose. U-Boot provides
144several possible determinations for logging information, all of which can be
145enabled or disabled independently:
146
147* console - goes to stdout
148* syslog - broadcast RFC 3164 messages to syslog servers on UDP port 514
149
150The syslog driver sends the value of environmental variable 'log_hostname' as
151HOSTNAME if available.
152
Sean Anderson8ba0f892020-10-27 19:55:41 -0400153Filters
154-------
155
156Filters are attached to log drivers to control what those drivers emit. FIlters
157can either allow or deny a log message when they match it. Only records which
158are allowed by a filter make it to the driver.
159
160Filters can be based on several criteria:
161
162* minimum or maximum log level
163* in a set of categories
164* in a set of files
165
166If no filters are attached to a driver then a default filter is used, which
167limits output to records with a level less than CONFIG_MAX_LOG_LEVEL.
168
169Log command
170-----------
171
172The 'log' command provides access to several features:
173
174* level - list log levels or set the default log level
175* categories - list log categories
176* drivers - list log drivers
177* filter-list - list filters
178* filter-add - add a new filter
179* filter-remove - remove filters
180* format - access the console log format
181* rec - output a log record
182
183Type 'help log' for details.
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200184
185Log format
Sean Anderson8ba0f892020-10-27 19:55:41 -0400186~~~~~~~~~~
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200187
188You can control the log format using the 'log format' command. The basic
189format is::
190
191 LEVEL.category,file.c:123-func() message
192
193In the above, file.c:123 is the filename where the log record was generated and
Sean Anderson8ba0f892020-10-27 19:55:41 -0400194func() is the function name. By default ('log format default') only the message
195is displayed on the console. You can control which fields are present, but not
196the field order.
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200197
Sean Anderson8ba0f892020-10-27 19:55:41 -0400198Adding Filters
199~~~~~~~~~~~~~~
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200200
Sean Anderson8ba0f892020-10-27 19:55:41 -0400201To add new filters at runtime, use the 'log filter-add' command. For example, to
202suppress messages from the SPI and MMC subsystems, run::
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200203
Sean Anderson8ba0f892020-10-27 19:55:41 -0400204 log filter-add -D -c spi -c mmc
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200205
Sean Anderson8ba0f892020-10-27 19:55:41 -0400206You will also need to add another filter to allow other messages (because the
207default filter no longer applies)::
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200208
Sean Anderson8ba0f892020-10-27 19:55:41 -0400209 log filter-add -A -l info
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200210
Sean Anderson8ba0f892020-10-27 19:55:41 -0400211Log levels may be either symbolic names (like above) or numbers. For example, to
212disable all debug and above (log level 7) messages from ``drivers/core/lists.c``
213and ``drivers/core/ofnode.c``, run::
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200214
Sean Anderson8ba0f892020-10-27 19:55:41 -0400215 log filter-add -D -f drivers/core/lists.c,drivers/core/ofnode.c -L 7
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200216
Sean Anderson8ba0f892020-10-27 19:55:41 -0400217To view active filters, use the 'log filter-list' command. Some example output
218is::
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200219
Sean Anderson8ba0f892020-10-27 19:55:41 -0400220 => log filter-list
221 num policy level categories files
222 2 deny >= DEBUG drivers/core/lists.c,drivers/core/ofnode.c
223 0 deny <= IO spi
224 mmc
225 1 allow <= INFO
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200226
Sean Anderson8ba0f892020-10-27 19:55:41 -0400227Note that filters are processed in-order from top to bottom, not in the order of
228their filter number. Filters are added to the top of the list if they deny when
229they match, and to the bottom if they allow when they match. For more
230information, consult the usage of the 'log' command, by running 'help log'.
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200231
232Code size
233---------
234
235Code size impact depends largely on what is enabled. The following numbers are
236generated by 'buildman -S' for snow, which is a Thumb-2 board (all units in
237bytes)::
238
239 This series: adds bss +20.0 data +4.0 rodata +4.0 text +44.0
240 CONFIG_LOG: bss -52.0 data +92.0 rodata -635.0 text +1048.0
241 CONFIG_LOG_MAX_LEVEL=7: bss +188.0 data +4.0 rodata +49183.0 text +98124.0
242
243The last option turns every debug() statement into a logging call, which
244bloats the code hugely. The advantage is that it is then possible to enable
245all logging within U-Boot.
246
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200247To Do
248-----
249
250There are lots of useful additions that could be made. None of the below is
Sean Anderson8ba0f892020-10-27 19:55:41 -0400251implemented! If you do one, please add a test in test/log/log_test.c
252log filter-add -D -f drivers/core/lists.c,drivers/core/ofnode.c -l 6
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200253Convenience functions to support setting the category:
254
255* log_arch(level, format_string, ...) - category LOGC_ARCH
256* log_board(level, format_string, ...) - category LOGC_BOARD
257* log_core(level, format_string, ...) - category LOGC_CORE
258* log_dt(level, format_string, ...) - category LOGC_DT
259
260More logging destinations:
261
262* device - goes to a device (e.g. serial)
263* buffer - recorded in a memory buffer
264
265Convert debug() statements in the code to log() statements
266
267Support making printf() emit log statements at L_INFO level
268
269Convert error() statements in the code to log() statements
270
271Figure out what to do with BUG(), BUG_ON() and warn_non_spl()
272
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200273Add a way to browse log records
274
275Add a way to record log records for browsing using an external tool
276
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200277Add commands to add and remove log devices
278
279Allow sharing of printf format strings in log records to reduce storage size
280for large numbers of log records
281
Heinrich Schuchardta7813912020-05-31 10:46:12 +0200282Consider making log() calls emit an automatic newline, perhaps with a logn()
283function to avoid that
284
285Passing log records through to linux (e.g. via device tree /chosen)
286
287Provide a command to access the number of log records generated, and the
288number dropped due to them being generated before the log system was ready.
289
290Add a printf() format string pragma so that log statements are checked properly
291
Sean Anderson8ba0f892020-10-27 19:55:41 -0400292Add a command to delete existing log records.
Sean Anderson00ebb7f2020-10-27 19:55:40 -0400293
294Logging API
295-----------
296.. kernel-doc:: include/log.h
297 :internal: