xref: /openbmc/phosphor-logging/README.md (revision 99c2b4059e708a7cba6740a0e832ef5f480a9f12)
17aafb12eSNagaraju Goruganti# phosphor-logging
27aafb12eSNagaraju Gorugantiphosphor logging provides mechanism for common event and logging creation based
37aafb12eSNagaraju Gorugantion information from the journal log.
47aafb12eSNagaraju Goruganti
57aafb12eSNagaraju Goruganti## To Build
67aafb12eSNagaraju Goruganti```
77aafb12eSNagaraju GorugantiTo build this package, do the following steps:
87aafb12eSNagaraju Goruganti
97aafb12eSNagaraju Goruganti    1. ./bootstrap.sh
107aafb12eSNagaraju Goruganti    2. ./configure ${CONFIGURE_FLAGS}
117aafb12eSNagaraju Goruganti    3. make
127aafb12eSNagaraju Goruganti
137aafb12eSNagaraju GorugantiTo clean the repository run `./bootstrap.sh clean`.
147aafb12eSNagaraju Goruganti```
159067c077SDeepak Kodihalli
16c4966192SDeepak Kodihalli## Remote Logging via Rsyslog
17c4966192SDeepak KodihalliThe BMC has the ability to stream out local logs (that go to the systemd journal)
18c4966192SDeepak Kodihallivia rsyslog (https://www.rsyslog.com/).
19c4966192SDeepak Kodihalli
20c4966192SDeepak KodihalliThe BMC will send everything. Any kind of filtering and appropriate storage
21c4966192SDeepak Kodihalliwill have to be managed on the rsyslog server. Various examples are available
22c4966192SDeepak Kodihallion the internet. Here are few pointers :
23c4966192SDeepak Kodihallihttps://www.rsyslog.com/storing-and-forwarding-remote-messages/
24c4966192SDeepak Kodihallihttps://www.rsyslog.com/doc/rsyslog%255Fconf%255Ffilter.html
25c4966192SDeepak Kodihallihttps://www.thegeekdiary.com/understanding-rsyslog-filter-options/
26c4966192SDeepak Kodihalli
27c4966192SDeepak Kodihalli#### Configuring rsyslog server for remote logging
28c4966192SDeepak KodihalliThe BMC is an rsyslog client. To stream out logs, it needs to talk to an rsyslog
29c4966192SDeepak Kodihalliserver, to which there's connectivity over a network. REST API can be used to
30c4966192SDeepak Kodihalliset the remote server's IP address and port number.
31c4966192SDeepak Kodihalli
32c4966192SDeepak KodihalliThe following presumes a user has logged on to the BMC (see
33c4966192SDeepak Kodihallihttps://github.com/openbmc/docs/blob/master/rest-api.md).
34c4966192SDeepak Kodihalli
35c4966192SDeepak KodihalliSet the IP:
36c4966192SDeepak Kodihalli```
37c4966192SDeepak Kodihallicurl -b cjar -k -H "Content-Type: application/json" -X PUT \
38c4966192SDeepak Kodihalli    -d '{"data": <IP address>}' \
39c4966192SDeepak Kodihalli    https://<BMC IP address>/xyz/openbmc_project/logging/config/remote/attr/Address
40c4966192SDeepak Kodihalli```
41c4966192SDeepak Kodihalli
42c4966192SDeepak KodihalliSet the port:
43c4966192SDeepak Kodihalli```
44c4966192SDeepak Kodihallicurl -b cjar -k -H "Content-Type: application/json" -X PUT \
45c4966192SDeepak Kodihalli    -d '{"data": <port number>}' \
46c4966192SDeepak Kodihalli    https://<BMC IP address>/xyz/openbmc_project/logging/config/remote/attr/Port
47c4966192SDeepak Kodihalli```
48c4966192SDeepak Kodihalli
49c4966192SDeepak Kodihalli#### Querying the current configuration
50c4966192SDeepak Kodihalli```
51c4966192SDeepak Kodihallicurl -b cjar -k \
52c4966192SDeepak Kodihalli    https://<BMC IP address>/xyz/openbmc_project/logging/config/remote
53c4966192SDeepak Kodihalli```
54c4966192SDeepak Kodihalli
55c4966192SDeepak Kodihalli#### Setting the hostname
56c4966192SDeepak KodihalliRsyslog can store logs separately for each host. For this reason, it's useful to
57c4966192SDeepak Kodihalliprovide a unique hostname to each managed BMC. Here's how that can be done via a
58c4966192SDeepak KodihalliREST API :
59c4966192SDeepak Kodihalli```
60c4966192SDeepak Kodihallicurl -b cjar -k -H "Content-Type: application/json" -X PUT \
61c4966192SDeepak Kodihalli    -d '{"data": "myHostName"}' \
62c4966192SDeepak Kodihalli    https://<BMC IP address>//xyz/openbmc_project/network/config/attr/HostName
63c4966192SDeepak Kodihalli```
64c4966192SDeepak Kodihalli
650febd26bSDeepak Kodihalli#### Disabling remote logging
660febd26bSDeepak KodihalliRemote logging can be disabled by writing 0 to the port, or an empty string("")
670febd26bSDeepak Kodihallito the IP.
680febd26bSDeepak Kodihalli
69c4966192SDeepak Kodihalli#### Changing the rsyslog server
70c4966192SDeepak KodihalliWhen switching to a new server from an existing one (i.e the address, or port,
71c4966192SDeepak Kodihallior both change), it is recommended to disable the existing configuration first.
72c4966192SDeepak Kodihalli
730febd26bSDeepak Kodihalli
749067c077SDeepak Kodihalli## Adding application specific error YAML
754e5f521aSMarri Devender Rao* This document captures steps for adding application specific error YAML files
764e5f521aSMarri Devender Rao  and generating local elog-errors.hpp header file for application use.
774e5f521aSMarri Devender Rao* Should cater for continuous integration (CI) build, bitbake image build, and
784e5f521aSMarri Devender Rao  local repository build.
797aafb12eSNagaraju Goruganti
809067c077SDeepak Kodihalli#### Continuous Integration (CI) build
814e5f521aSMarri Devender Rao * Make is called on the repository that is modified.
824e5f521aSMarri Devender Rao * Dependent packages are pulled based on the dependency list specified in the
834e5f521aSMarri Devender Rao   configure.ac script.
847aafb12eSNagaraju Goruganti
859067c077SDeepak Kodihalli#### Recipe build
864e5f521aSMarri Devender Rao * Native recipes copy error YAML files to shared location.
874e5f521aSMarri Devender Rao * phosphor-logging builds elog-errors.hpp by parsing the error YAML files from
884e5f521aSMarri Devender Rao   the shared location.
897aafb12eSNagaraju Goruganti
909067c077SDeepak Kodihalli#### Local repository build
914e5f521aSMarri Devender Rao * Copies local error YAML files to the shared location in SDK
924e5f521aSMarri Devender Rao * Make generates elog-errors.hpp by parsing the error YAML files from the
934e5f521aSMarri Devender Rao   shared location.
947aafb12eSNagaraju Goruganti
959067c077SDeepak Kodihalli#### Makefile changes
964e5f521aSMarri Devender Rao**Reference**
974e5f521aSMarri Devender Rao * https://github.com/openbmc/openpower-debug-collector/blob/master/Makefile.am
989067c077SDeepak Kodihalli
999067c077SDeepak Kodihalli###### Export error YAML to shared location
1004e5f521aSMarri Devender Rao*Modify Makefile.am to export newly added error YAML to shared location*
1014e5f521aSMarri Devender Rao```
1024e5f521aSMarri Devender Raoyamldir = ${datadir}/phosphor-dbus-yaml/yaml
1034e5f521aSMarri Devender Raonobase_yaml_DATA = \
1044e5f521aSMarri Devender Rao    org/open_power/Host.errors.yaml
1054e5f521aSMarri Devender Rao```
1069067c077SDeepak Kodihalli
1079067c077SDeepak Kodihalli###### Generate elog-errors.hpp using elog parser from SDK location
1084e5f521aSMarri Devender Rao * Add a conditional check "GEN_ERRORS"
1094e5f521aSMarri Devender Rao * Disable the check for recipe bitbake image build
1104e5f521aSMarri Devender Rao * Enable it for local repository build
1114e5f521aSMarri Devender Rao * If "GEN_ERRORS" is enabled, build generates elog-errors.hpp header file.
1124e5f521aSMarri Devender Rao```
1134e5f521aSMarri Devender Rao  # Generate phosphor-logging/elog-errors.hpp
1144e5f521aSMarri Devender Rao  if GEN_ERRORS
1154e5f521aSMarri Devender Rao  ELOG_MAKO ?= elog-gen-template.mako.hpp
1164e5f521aSMarri Devender Rao  ELOG_DIR ?= ${OECORE_NATIVE_SYSROOT}${datadir}/phosphor-logging/elog
1174e5f521aSMarri Devender Rao  ELOG_GEN_DIR ?= ${ELOG_DIR}/tools/
1184e5f521aSMarri Devender Rao  ELOG_MAKO_DIR ?= ${ELOG_DIR}/tools/phosphor-logging/templates/
1194e5f521aSMarri Devender Rao  YAML_DIR ?= ${OECORE_NATIVE_SYSROOT}${datadir}/phosphor-dbus-yaml/yaml
1204e5f521aSMarri Devender Rao  phosphor-logging/elog-errors.hpp:
1214e5f521aSMarri Devender Rao      @mkdir -p ${YAML_DIR}/org/open_power/
1224e5f521aSMarri Devender Rao      @cp ${top_srcdir}/org/open_power/Host.errors.yaml \
1234e5f521aSMarri Devender Rao        ${YAML_DIR}/org/open_power/Host.errors.yaml
1244e5f521aSMarri Devender Rao      @mkdir -p `dirname $@`
1254e5f521aSMarri Devender Rao      @chmod 777 $(ELOG_GEN_DIR)/elog-gen.py
1264e5f521aSMarri Devender Rao      $(AM_V_at)$(PYTHON) $(ELOG_GEN_DIR)/elog-gen.py -y ${YAML_DIR} \
1274e5f521aSMarri Devender Rao        -t ${ELOG_MAKO_DIR} -m ${ELOG_MAKO} -o $@
1284e5f521aSMarri Devender Rao  endif
1294e5f521aSMarri Devender Rao```
1307aafb12eSNagaraju Goruganti
1319067c077SDeepak Kodihalli###### Update BUILT_SOURCES
1324e5f521aSMarri Devender Rao * Append elog-errors.hpp to BUILT_SOURCES list and put it in conditional check
1334e5f521aSMarri Devender Rao   GEN_ERRORS so that the elog-errors.hpp is generated only during local
1344e5f521aSMarri Devender Rao   repository build.
1354e5f521aSMarri Devender Rao```
1364e5f521aSMarri Devender Rao    if GEN_ERRORS
1374e5f521aSMarri Devender Rao    nobase_nodist_include_HEADERS += \
1384e5f521aSMarri Devender Rao                phosphor-logging/elog-errors.hpp
1394e5f521aSMarri Devender Rao    endif
1404e5f521aSMarri Devender Rao    if GEN_ERRORS
1414e5f521aSMarri Devender Rao    BUILT_SOURCES += phosphor-logging/elog-errors.hpp
1424e5f521aSMarri Devender Rao    endif
1434e5f521aSMarri Devender Rao```
1449067c077SDeepak Kodihalli
1459067c077SDeepak Kodihalli###### Conditional check for native build
1464e5f521aSMarri Devender Rao * As the same Makefile is used both for recipe image build and native recipe
1474e5f521aSMarri Devender Rao   build, add a conditional to ensure that only installation of error yaml files
1484e5f521aSMarri Devender Rao   happens during native build. It is not required to build repository during
1494e5f521aSMarri Devender Rao   native build.
1504e5f521aSMarri Devender Rao```
1514e5f521aSMarri Devender Rao   if !INSTALL_ERROR_YAML
1524e5f521aSMarri Devender Rao   endif
1534e5f521aSMarri Devender Rao```
1549067c077SDeepak Kodihalli
1559067c077SDeepak Kodihalli#### Autotools changes
1564e5f521aSMarri Devender Rao**Reference**
1574e5f521aSMarri Devender Rao * https://github.com/openbmc/openpower-debug-collector/blob/master/configure.ac
1587aafb12eSNagaraju Goruganti
1599067c077SDeepak Kodihalli###### Add option(argument) to enable/disable installing error yaml file
1604e5f521aSMarri Devender Rao * Install error yaml option(argument) is enabled for native recipe build
1614e5f521aSMarri Devender Rao   and disabled for bitbake build.
1624e5f521aSMarri Devender Rao
1634e5f521aSMarri Devender Rao * When install error yaml option is disabled do not check for target specific
1644e5f521aSMarri Devender Rao   packages in autotools configure script.
1654e5f521aSMarri Devender Rao
1669067c077SDeepak Kodihalli###### Add option(argument) to install error yaml files
1674e5f521aSMarri Devender Rao```
1684e5f521aSMarri Devender RaoAC_ARG_ENABLE([install_error_yaml],
1694e5f521aSMarri Devender Rao    AS_HELP_STRING([--enable-install_error_yaml],
1704e5f521aSMarri Devender Rao    [Enable installing error yaml file]),[], [install_error_yaml=no])
1714e5f521aSMarri Devender RaoAM_CONDITIONAL([INSTALL_ERROR_YAML],
1724e5f521aSMarri Devender Rao    [test "x$enable_install_error_yaml" = "xyes"])
1734e5f521aSMarri Devender RaoAS_IF([test "x$enable_install_error_yaml" != "xyes"], [
1744e5f521aSMarri Devender Rao..
1754e5f521aSMarri Devender Rao..
1764e5f521aSMarri Devender Rao])
1774e5f521aSMarri Devender Rao```
1789067c077SDeepak Kodihalli
1799067c077SDeepak Kodihalli###### Add option(argument) to enable/disable generating elog-errors header file
1804e5f521aSMarri Devender Rao```
1814e5f521aSMarri Devender RaoAC_ARG_ENABLE([gen_errors],
1824e5f521aSMarri Devender Rao    AS_HELP_STRING([--enable-gen_errors], [Enable elog-errors.hpp generation ]),
1834e5f521aSMarri Devender Rao    [],[gen_errors=yes])
1844e5f521aSMarri Devender RaoAM_CONDITIONAL([GEN_ERRORS], [test "x$enable_gen_errors" != "xno"])
1854e5f521aSMarri Devender Rao```
1864e5f521aSMarri Devender Rao
1879067c077SDeepak Kodihalli#### Recipe changes
1884e5f521aSMarri Devender Rao**Reference**
1894e5f521aSMarri Devender Rao* https://github.com/openbmc/openbmc/blob/master/meta-openbmc-machines\
1904e5f521aSMarri Devender Rao/meta-openpower/common/recipes-phosphor/debug/openpower-debug-collector.bb
1914e5f521aSMarri Devender Rao
1929067c077SDeepak Kodihalli###### Extend recipe for native and nativesdk
1934e5f521aSMarri Devender Rao* Extend the recipe for native and native SDK builds
1944e5f521aSMarri Devender Rao```
1954e5f521aSMarri Devender RaoBBCLASSEXTEND += "native nativesdk"
1964e5f521aSMarri Devender Rao```
1979067c077SDeepak Kodihalli###### Remove dependencies for native and native SDK build
1984e5f521aSMarri Devender Rao* Native recipe caters only for copying error yaml files to shared location.
1994e5f521aSMarri Devender Rao* For native and native SDK build remove dependency on packages that recipe
2004e5f521aSMarri Devender Rao  build depends
2014e5f521aSMarri Devender Rao
2029067c077SDeepak Kodihalli###### Remove dependency on phosphor-logging for native build
2034e5f521aSMarri Devender Rao```
2044e5f521aSMarri Devender RaoDEPENDS_remove_class-native = "phosphor-logging"
2054e5f521aSMarri Devender Rao```
2069067c077SDeepak Kodihalli
2079067c077SDeepak Kodihalli###### Remove dependency on phosphor-logging for native SDK build
2084e5f521aSMarri Devender Rao```
2094e5f521aSMarri Devender RaoDEPENDS_remove_class-nativesdk = "phosphor-logging"
2104e5f521aSMarri Devender Rao```
2119067c077SDeepak Kodihalli
2129067c077SDeepak Kodihalli###### Add install_error_yaml argument during native build
2134e5f521aSMarri Devender Rao* Add package config to enable/disable install_error_yaml feature.
2149067c077SDeepak Kodihalli
2159067c077SDeepak Kodihalli###### Add package config to enable/disable install_error_yaml feature
2164e5f521aSMarri Devender Rao```
2174e5f521aSMarri Devender RaoPACKAGECONFIG ??= "install_error_yaml"
2184e5f521aSMarri Devender RaoPACKAGECONFIG[install_error_yaml] = " \
2194e5f521aSMarri Devender Rao        --enable-install_error_yaml, \
2204e5f521aSMarri Devender Rao        --disable-install_error_yaml, ,\
2214e5f521aSMarri Devender Rao        "
2224e5f521aSMarri Devender Rao```
2239067c077SDeepak Kodihalli###### Enable install_error_yaml check for native build
2244e5f521aSMarri Devender Rao```
2254e5f521aSMarri Devender RaoPACKAGECONFIG_add_class-native = "install_error_yaml"
2264e5f521aSMarri Devender RaoPACKAGECONFIG_add_class-nativesdk = "install_error_yaml"
2274e5f521aSMarri Devender Rao```
2289067c077SDeepak Kodihalli###### Disable install_error_yaml during target build
2294e5f521aSMarri Devender Rao```
2304e5f521aSMarri Devender RaoPACKAGECONFIG_remove_class-target = "install_error_yaml"
2314e5f521aSMarri Devender Rao```
2324e5f521aSMarri Devender Rao
2339067c077SDeepak Kodihalli###### Disable generating elog-errors.hpp for bitbake build
2344e5f521aSMarri Devender Rao* Disable gen_errors argument for bitbake image build as the application uses
2354e5f521aSMarri Devender Rao  the elog-errors.hpp generated by phosphor-logging
2364e5f521aSMarri Devender Rao* Argument is enabled by default for local repository build in the configure
2374e5f521aSMarri Devender Rao  script of the local repository.
2384e5f521aSMarri Devender Rao```
2394e5f521aSMarri Devender Rao XTRA_OECONF += "--disable-gen_errors"
2404e5f521aSMarri Devender Rao```
2414e5f521aSMarri Devender Rao
2429067c077SDeepak Kodihalli#### Local build
2434e5f521aSMarri Devender Rao* During local build use --prefix=/usr for the configure script.
2444e5f521aSMarri Devender Rao
245*99c2b405SMatt Spinler## Event Log Extensions
246*99c2b405SMatt Spinler
247*99c2b405SMatt SpinlerThe extension concept is a way to allow code that creates other formats of
248*99c2b405SMatt Spinlererror logs besides phosphor-logging's event logs to still reside in the
249*99c2b405SMatt Spinlerphosphor-log-manager application.
250*99c2b405SMatt Spinler
251*99c2b405SMatt SpinlerThe extension code lives in the `extensions/<extension>` subdirectories,
252*99c2b405SMatt Spinlerand is enabled with a `--enable-<extension>` configure flag.  The
253*99c2b405SMatt Spinlerextension code won't compile unless enabled with this flag.
254*99c2b405SMatt Spinler
255*99c2b405SMatt SpinlerExtensions can register themselves to have functions called at the following
256*99c2b405SMatt Spinlerpoints using the REGISTER_EXTENSION_FUNCTION macro.
257*99c2b405SMatt Spinler* On startup
258*99c2b405SMatt Spinler   * Function type void(internal::Manager&)
259*99c2b405SMatt Spinler* After an event log is created
260*99c2b405SMatt Spinler   * Function type void(args)
261*99c2b405SMatt Spinler   * The args are:
262*99c2b405SMatt Spinler     * const std::string& - The Message property
263*99c2b405SMatt Spinler     * uin32_t - The event log ID
264*99c2b405SMatt Spinler     * uint64_t - The event log timestamp
265*99c2b405SMatt Spinler     * Level - The event level
266*99c2b405SMatt Spinler     * const AdditionalDataArg& - the additional data
267*99c2b405SMatt Spinler     * const AssociationEndpointsArg& - Association endpoints (callouts)
268*99c2b405SMatt Spinler* Before an event log is deleted, to check if it is allowed.
269*99c2b405SMatt Spinler   * Function type void(std::uint32_t, bool&) that takes the event ID
270*99c2b405SMatt Spinler* After an event log is deleted
271*99c2b405SMatt Spinler   * Function type void(std::uint32_t) that takes the event ID
272*99c2b405SMatt Spinler
273*99c2b405SMatt SpinlerUsing these callback points, they can create their own event log for each
274*99c2b405SMatt SpinlerOpenBMC event log that is created, and delete these logs when the corresponding
275*99c2b405SMatt SpinlerOpenBMC event log is deleted.
276*99c2b405SMatt Spinler
277*99c2b405SMatt SpinlerIn addition, an extension has the option of disabling phosphor-logging's
278*99c2b405SMatt Spinlerdefault error log capping policy so that it can use its own.  The macro
279*99c2b405SMatt SpinlerDISABLE_LOG_ENTRY_CAPS() is used for that.
280*99c2b405SMatt Spinler
281*99c2b405SMatt Spinler### Motivation
282*99c2b405SMatt Spinler
283*99c2b405SMatt SpinlerThe reason for adding support for extensions inside the phosphor-log-manager
284*99c2b405SMatt Spinlerdaemon as opposed to just creating new daemons that listen for D-Bus signals is
285*99c2b405SMatt Spinlerto allow interactions that would be complicated or expensive if just done over
286*99c2b405SMatt SpinlerD-Bus, such as:
287*99c2b405SMatt Spinler* Allowing for custom old log retention algorithms.
288*99c2b405SMatt Spinler* Prohibiting manual deleting of certain logs based on an extension's
289*99c2b405SMatt Spinler  requirements.
290*99c2b405SMatt Spinler
291*99c2b405SMatt Spinler### Creating extensions
292*99c2b405SMatt Spinler
293*99c2b405SMatt Spinler1. Add a new flag to configure.ac to enable the extension:
294*99c2b405SMatt Spinler```
295*99c2b405SMatt SpinlerAC_ARG_ENABLE([foo-extension],
296*99c2b405SMatt Spinler              AS_HELP_STRING([--enable-foo-extension],
297*99c2b405SMatt Spinler                             [Create Foo logs]))
298*99c2b405SMatt SpinlerAM_CONDITIONAL([ENABLE_FOO_EXTENSION],
299*99c2b405SMatt Spinler               [test "x$enable_foo_extension" == "xyes"])
300*99c2b405SMatt Spinler```
301*99c2b405SMatt Spinler2. Add the code in `extensions/<extension>/`.
302*99c2b405SMatt Spinler3. Create a makefile include to add the new code to phosphor-log-manager:
303*99c2b405SMatt Spinler```
304*99c2b405SMatt Spinlerphosphor_log_manager_SOURCES += \
305*99c2b405SMatt Spinler        extensions/foo/foo.cpp
306*99c2b405SMatt Spinler```
307*99c2b405SMatt Spinler3. In `extensions/extensions.mk`, add the makefile include:
308*99c2b405SMatt Spinler```
309*99c2b405SMatt Spinlerif ENABLE_FOO_EXTENSION
310*99c2b405SMatt Spinlerinclude extensions/foo/foo.mk
311*99c2b405SMatt Spinlerendif
312*99c2b405SMatt Spinler```
313*99c2b405SMatt Spinler4. In the extension code, register the functions to call and optionally disable
314*99c2b405SMatt Spinler   log capping using the provided macros:
315*99c2b405SMatt Spinler```
316*99c2b405SMatt SpinlerDISABLE_LOG_ENTRY_CAPS();
317*99c2b405SMatt Spinler
318*99c2b405SMatt Spinlervoid fooStartup(internal::Manager& manager)
319*99c2b405SMatt Spinler{
320*99c2b405SMatt Spinler    // Initialize
321*99c2b405SMatt Spinler}
322*99c2b405SMatt Spinler
323*99c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooStartup);
324*99c2b405SMatt Spinler
325*99c2b405SMatt Spinlervoid fooCreate(const std::string& message, uint32_t id, uint64_t timestamp,
326*99c2b405SMatt Spinler               Entry::Level severity, const AdditionalDataArg& additionalData,
327*99c2b405SMatt Spinler               const AssociationEndpointsArg& assocs)
328*99c2b405SMatt Spinler{
329*99c2b405SMatt Spinler    // Create a different type of error log based on 'entry'.
330*99c2b405SMatt Spinler}
331*99c2b405SMatt Spinler
332*99c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooCreate);
333*99c2b405SMatt Spinler
334*99c2b405SMatt Spinlervoid fooRemove(uint32_t id)
335*99c2b405SMatt Spinler{
336*99c2b405SMatt Spinler    // Delete the extension error log that corresponds to 'id'.
337*99c2b405SMatt Spinler}
338*99c2b405SMatt Spinler
339*99c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooRemove);
340*99c2b405SMatt Spinler```
341*99c2b405SMatt Spinler
3424e5f521aSMarri Devender Rao**Reference**
3434e5f521aSMarri Devender Rao* https://github.com/openbmc/openpower-debug-collector/blob/master/README.md
344