xref: /openbmc/phosphor-logging/README.md (revision c41693c6a1688e5aa3a9b41b53d402a3b61b7484)
17aafb12eSNagaraju Goruganti# phosphor-logging
2*c41693c6SMatt SpinlerThe phosphor logging repository provides mechanisms for event and journal
3*c41693c6SMatt Spinlerlogging.
4*c41693c6SMatt Spinler
5*c41693c6SMatt Spinler## Table Of Contents
6*c41693c6SMatt Spinler* [Building](#to-build)
7*c41693c6SMatt Spinler* [Remote Logging](#remote-logging-via-rsyslog)
8*c41693c6SMatt Spinler* [Application Specific Error YAML](#adding-application-specific-error-yaml)
9*c41693c6SMatt Spinler* [Event Log Extensions](#event-log-extensions)
107aafb12eSNagaraju Goruganti
117aafb12eSNagaraju Goruganti## To Build
127aafb12eSNagaraju Goruganti```
137aafb12eSNagaraju GorugantiTo build this package, do the following steps:
147aafb12eSNagaraju Goruganti
157aafb12eSNagaraju Goruganti    1. ./bootstrap.sh
167aafb12eSNagaraju Goruganti    2. ./configure ${CONFIGURE_FLAGS}
177aafb12eSNagaraju Goruganti    3. make
187aafb12eSNagaraju Goruganti
197aafb12eSNagaraju GorugantiTo clean the repository run `./bootstrap.sh clean`.
207aafb12eSNagaraju Goruganti```
219067c077SDeepak Kodihalli
22c4966192SDeepak Kodihalli## Remote Logging via Rsyslog
23c4966192SDeepak KodihalliThe BMC has the ability to stream out local logs (that go to the systemd journal)
24c4966192SDeepak Kodihallivia rsyslog (https://www.rsyslog.com/).
25c4966192SDeepak Kodihalli
26c4966192SDeepak KodihalliThe BMC will send everything. Any kind of filtering and appropriate storage
27c4966192SDeepak Kodihalliwill have to be managed on the rsyslog server. Various examples are available
28c4966192SDeepak Kodihallion the internet. Here are few pointers :
29c4966192SDeepak Kodihallihttps://www.rsyslog.com/storing-and-forwarding-remote-messages/
30c4966192SDeepak Kodihallihttps://www.rsyslog.com/doc/rsyslog%255Fconf%255Ffilter.html
31c4966192SDeepak Kodihallihttps://www.thegeekdiary.com/understanding-rsyslog-filter-options/
32c4966192SDeepak Kodihalli
33c4966192SDeepak Kodihalli#### Configuring rsyslog server for remote logging
34c4966192SDeepak KodihalliThe BMC is an rsyslog client. To stream out logs, it needs to talk to an rsyslog
35c4966192SDeepak Kodihalliserver, to which there's connectivity over a network. REST API can be used to
36c4966192SDeepak Kodihalliset the remote server's IP address and port number.
37c4966192SDeepak Kodihalli
38c4966192SDeepak KodihalliThe following presumes a user has logged on to the BMC (see
39c4966192SDeepak Kodihallihttps://github.com/openbmc/docs/blob/master/rest-api.md).
40c4966192SDeepak Kodihalli
41c4966192SDeepak KodihalliSet the IP:
42c4966192SDeepak Kodihalli```
43c4966192SDeepak Kodihallicurl -b cjar -k -H "Content-Type: application/json" -X PUT \
44c4966192SDeepak Kodihalli    -d '{"data": <IP address>}' \
45c4966192SDeepak Kodihalli    https://<BMC IP address>/xyz/openbmc_project/logging/config/remote/attr/Address
46c4966192SDeepak Kodihalli```
47c4966192SDeepak Kodihalli
48c4966192SDeepak KodihalliSet the port:
49c4966192SDeepak Kodihalli```
50c4966192SDeepak Kodihallicurl -b cjar -k -H "Content-Type: application/json" -X PUT \
51c4966192SDeepak Kodihalli    -d '{"data": <port number>}' \
52c4966192SDeepak Kodihalli    https://<BMC IP address>/xyz/openbmc_project/logging/config/remote/attr/Port
53c4966192SDeepak Kodihalli```
54c4966192SDeepak Kodihalli
55c4966192SDeepak Kodihalli#### Querying the current configuration
56c4966192SDeepak Kodihalli```
57c4966192SDeepak Kodihallicurl -b cjar -k \
58c4966192SDeepak Kodihalli    https://<BMC IP address>/xyz/openbmc_project/logging/config/remote
59c4966192SDeepak Kodihalli```
60c4966192SDeepak Kodihalli
61c4966192SDeepak Kodihalli#### Setting the hostname
62c4966192SDeepak KodihalliRsyslog can store logs separately for each host. For this reason, it's useful to
63c4966192SDeepak Kodihalliprovide a unique hostname to each managed BMC. Here's how that can be done via a
64c4966192SDeepak KodihalliREST API :
65c4966192SDeepak Kodihalli```
66c4966192SDeepak Kodihallicurl -b cjar -k -H "Content-Type: application/json" -X PUT \
67c4966192SDeepak Kodihalli    -d '{"data": "myHostName"}' \
68c4966192SDeepak Kodihalli    https://<BMC IP address>//xyz/openbmc_project/network/config/attr/HostName
69c4966192SDeepak Kodihalli```
70c4966192SDeepak Kodihalli
710febd26bSDeepak Kodihalli#### Disabling remote logging
720febd26bSDeepak KodihalliRemote logging can be disabled by writing 0 to the port, or an empty string("")
730febd26bSDeepak Kodihallito the IP.
740febd26bSDeepak Kodihalli
75c4966192SDeepak Kodihalli#### Changing the rsyslog server
76c4966192SDeepak KodihalliWhen switching to a new server from an existing one (i.e the address, or port,
77c4966192SDeepak Kodihallior both change), it is recommended to disable the existing configuration first.
78c4966192SDeepak Kodihalli
790febd26bSDeepak Kodihalli
809067c077SDeepak Kodihalli## Adding application specific error YAML
814e5f521aSMarri Devender Rao* This document captures steps for adding application specific error YAML files
824e5f521aSMarri Devender Rao  and generating local elog-errors.hpp header file for application use.
834e5f521aSMarri Devender Rao* Should cater for continuous integration (CI) build, bitbake image build, and
844e5f521aSMarri Devender Rao  local repository build.
857aafb12eSNagaraju Goruganti
869067c077SDeepak Kodihalli#### Continuous Integration (CI) build
874e5f521aSMarri Devender Rao * Make is called on the repository that is modified.
884e5f521aSMarri Devender Rao * Dependent packages are pulled based on the dependency list specified in the
894e5f521aSMarri Devender Rao   configure.ac script.
907aafb12eSNagaraju Goruganti
919067c077SDeepak Kodihalli#### Recipe build
924e5f521aSMarri Devender Rao * Native recipes copy error YAML files to shared location.
934e5f521aSMarri Devender Rao * phosphor-logging builds elog-errors.hpp by parsing the error YAML files from
944e5f521aSMarri Devender Rao   the shared location.
957aafb12eSNagaraju Goruganti
969067c077SDeepak Kodihalli#### Local repository build
974e5f521aSMarri Devender Rao * Copies local error YAML files to the shared location in SDK
984e5f521aSMarri Devender Rao * Make generates elog-errors.hpp by parsing the error YAML files from the
994e5f521aSMarri Devender Rao   shared location.
1007aafb12eSNagaraju Goruganti
1019067c077SDeepak Kodihalli#### Makefile changes
1024e5f521aSMarri Devender Rao**Reference**
1034e5f521aSMarri Devender Rao * https://github.com/openbmc/openpower-debug-collector/blob/master/Makefile.am
1049067c077SDeepak Kodihalli
1059067c077SDeepak Kodihalli###### Export error YAML to shared location
1064e5f521aSMarri Devender Rao*Modify Makefile.am to export newly added error YAML to shared location*
1074e5f521aSMarri Devender Rao```
1084e5f521aSMarri Devender Raoyamldir = ${datadir}/phosphor-dbus-yaml/yaml
1094e5f521aSMarri Devender Raonobase_yaml_DATA = \
1104e5f521aSMarri Devender Rao    org/open_power/Host.errors.yaml
1114e5f521aSMarri Devender Rao```
1129067c077SDeepak Kodihalli
1139067c077SDeepak Kodihalli###### Generate elog-errors.hpp using elog parser from SDK location
1144e5f521aSMarri Devender Rao * Add a conditional check "GEN_ERRORS"
1154e5f521aSMarri Devender Rao * Disable the check for recipe bitbake image build
1164e5f521aSMarri Devender Rao * Enable it for local repository build
1174e5f521aSMarri Devender Rao * If "GEN_ERRORS" is enabled, build generates elog-errors.hpp header file.
1184e5f521aSMarri Devender Rao```
1194e5f521aSMarri Devender Rao  # Generate phosphor-logging/elog-errors.hpp
1204e5f521aSMarri Devender Rao  if GEN_ERRORS
1214e5f521aSMarri Devender Rao  ELOG_MAKO ?= elog-gen-template.mako.hpp
1224e5f521aSMarri Devender Rao  ELOG_DIR ?= ${OECORE_NATIVE_SYSROOT}${datadir}/phosphor-logging/elog
1234e5f521aSMarri Devender Rao  ELOG_GEN_DIR ?= ${ELOG_DIR}/tools/
1244e5f521aSMarri Devender Rao  ELOG_MAKO_DIR ?= ${ELOG_DIR}/tools/phosphor-logging/templates/
1254e5f521aSMarri Devender Rao  YAML_DIR ?= ${OECORE_NATIVE_SYSROOT}${datadir}/phosphor-dbus-yaml/yaml
1264e5f521aSMarri Devender Rao  phosphor-logging/elog-errors.hpp:
1274e5f521aSMarri Devender Rao      @mkdir -p ${YAML_DIR}/org/open_power/
1284e5f521aSMarri Devender Rao      @cp ${top_srcdir}/org/open_power/Host.errors.yaml \
1294e5f521aSMarri Devender Rao        ${YAML_DIR}/org/open_power/Host.errors.yaml
1304e5f521aSMarri Devender Rao      @mkdir -p `dirname $@`
1314e5f521aSMarri Devender Rao      @chmod 777 $(ELOG_GEN_DIR)/elog-gen.py
1324e5f521aSMarri Devender Rao      $(AM_V_at)$(PYTHON) $(ELOG_GEN_DIR)/elog-gen.py -y ${YAML_DIR} \
1334e5f521aSMarri Devender Rao        -t ${ELOG_MAKO_DIR} -m ${ELOG_MAKO} -o $@
1344e5f521aSMarri Devender Rao  endif
1354e5f521aSMarri Devender Rao```
1367aafb12eSNagaraju Goruganti
1379067c077SDeepak Kodihalli###### Update BUILT_SOURCES
1384e5f521aSMarri Devender Rao * Append elog-errors.hpp to BUILT_SOURCES list and put it in conditional check
1394e5f521aSMarri Devender Rao   GEN_ERRORS so that the elog-errors.hpp is generated only during local
1404e5f521aSMarri Devender Rao   repository build.
1414e5f521aSMarri Devender Rao```
1424e5f521aSMarri Devender Rao    if GEN_ERRORS
1434e5f521aSMarri Devender Rao    nobase_nodist_include_HEADERS += \
1444e5f521aSMarri Devender Rao                phosphor-logging/elog-errors.hpp
1454e5f521aSMarri Devender Rao    endif
1464e5f521aSMarri Devender Rao    if GEN_ERRORS
1474e5f521aSMarri Devender Rao    BUILT_SOURCES += phosphor-logging/elog-errors.hpp
1484e5f521aSMarri Devender Rao    endif
1494e5f521aSMarri Devender Rao```
1509067c077SDeepak Kodihalli
1519067c077SDeepak Kodihalli###### Conditional check for native build
1524e5f521aSMarri Devender Rao * As the same Makefile is used both for recipe image build and native recipe
1534e5f521aSMarri Devender Rao   build, add a conditional to ensure that only installation of error yaml files
1544e5f521aSMarri Devender Rao   happens during native build. It is not required to build repository during
1554e5f521aSMarri Devender Rao   native build.
1564e5f521aSMarri Devender Rao```
1574e5f521aSMarri Devender Rao   if !INSTALL_ERROR_YAML
1584e5f521aSMarri Devender Rao   endif
1594e5f521aSMarri Devender Rao```
1609067c077SDeepak Kodihalli
1619067c077SDeepak Kodihalli#### Autotools changes
1624e5f521aSMarri Devender Rao**Reference**
1634e5f521aSMarri Devender Rao * https://github.com/openbmc/openpower-debug-collector/blob/master/configure.ac
1647aafb12eSNagaraju Goruganti
1659067c077SDeepak Kodihalli###### Add option(argument) to enable/disable installing error yaml file
1664e5f521aSMarri Devender Rao * Install error yaml option(argument) is enabled for native recipe build
1674e5f521aSMarri Devender Rao   and disabled for bitbake build.
1684e5f521aSMarri Devender Rao
1694e5f521aSMarri Devender Rao * When install error yaml option is disabled do not check for target specific
1704e5f521aSMarri Devender Rao   packages in autotools configure script.
1714e5f521aSMarri Devender Rao
1729067c077SDeepak Kodihalli###### Add option(argument) to install error yaml files
1734e5f521aSMarri Devender Rao```
1744e5f521aSMarri Devender RaoAC_ARG_ENABLE([install_error_yaml],
1754e5f521aSMarri Devender Rao    AS_HELP_STRING([--enable-install_error_yaml],
1764e5f521aSMarri Devender Rao    [Enable installing error yaml file]),[], [install_error_yaml=no])
1774e5f521aSMarri Devender RaoAM_CONDITIONAL([INSTALL_ERROR_YAML],
1784e5f521aSMarri Devender Rao    [test "x$enable_install_error_yaml" = "xyes"])
1794e5f521aSMarri Devender RaoAS_IF([test "x$enable_install_error_yaml" != "xyes"], [
1804e5f521aSMarri Devender Rao..
1814e5f521aSMarri Devender Rao..
1824e5f521aSMarri Devender Rao])
1834e5f521aSMarri Devender Rao```
1849067c077SDeepak Kodihalli
1859067c077SDeepak Kodihalli###### Add option(argument) to enable/disable generating elog-errors header file
1864e5f521aSMarri Devender Rao```
1874e5f521aSMarri Devender RaoAC_ARG_ENABLE([gen_errors],
1884e5f521aSMarri Devender Rao    AS_HELP_STRING([--enable-gen_errors], [Enable elog-errors.hpp generation ]),
1894e5f521aSMarri Devender Rao    [],[gen_errors=yes])
1904e5f521aSMarri Devender RaoAM_CONDITIONAL([GEN_ERRORS], [test "x$enable_gen_errors" != "xno"])
1914e5f521aSMarri Devender Rao```
1924e5f521aSMarri Devender Rao
1939067c077SDeepak Kodihalli#### Recipe changes
1944e5f521aSMarri Devender Rao**Reference**
1954e5f521aSMarri Devender Rao* https://github.com/openbmc/openbmc/blob/master/meta-openbmc-machines\
1964e5f521aSMarri Devender Rao/meta-openpower/common/recipes-phosphor/debug/openpower-debug-collector.bb
1974e5f521aSMarri Devender Rao
1989067c077SDeepak Kodihalli###### Extend recipe for native and nativesdk
1994e5f521aSMarri Devender Rao* Extend the recipe for native and native SDK builds
2004e5f521aSMarri Devender Rao```
2014e5f521aSMarri Devender RaoBBCLASSEXTEND += "native nativesdk"
2024e5f521aSMarri Devender Rao```
2039067c077SDeepak Kodihalli###### Remove dependencies for native and native SDK build
2044e5f521aSMarri Devender Rao* Native recipe caters only for copying error yaml files to shared location.
2054e5f521aSMarri Devender Rao* For native and native SDK build remove dependency on packages that recipe
2064e5f521aSMarri Devender Rao  build depends
2074e5f521aSMarri Devender Rao
2089067c077SDeepak Kodihalli###### Remove dependency on phosphor-logging for native build
2094e5f521aSMarri Devender Rao```
2104e5f521aSMarri Devender RaoDEPENDS_remove_class-native = "phosphor-logging"
2114e5f521aSMarri Devender Rao```
2129067c077SDeepak Kodihalli
2139067c077SDeepak Kodihalli###### Remove dependency on phosphor-logging for native SDK build
2144e5f521aSMarri Devender Rao```
2154e5f521aSMarri Devender RaoDEPENDS_remove_class-nativesdk = "phosphor-logging"
2164e5f521aSMarri Devender Rao```
2179067c077SDeepak Kodihalli
2189067c077SDeepak Kodihalli###### Add install_error_yaml argument during native build
2194e5f521aSMarri Devender Rao* Add package config to enable/disable install_error_yaml feature.
2209067c077SDeepak Kodihalli
2219067c077SDeepak Kodihalli###### Add package config to enable/disable install_error_yaml feature
2224e5f521aSMarri Devender Rao```
2234e5f521aSMarri Devender RaoPACKAGECONFIG ??= "install_error_yaml"
2244e5f521aSMarri Devender RaoPACKAGECONFIG[install_error_yaml] = " \
2254e5f521aSMarri Devender Rao        --enable-install_error_yaml, \
2264e5f521aSMarri Devender Rao        --disable-install_error_yaml, ,\
2274e5f521aSMarri Devender Rao        "
2284e5f521aSMarri Devender Rao```
2299067c077SDeepak Kodihalli###### Enable install_error_yaml check for native build
2304e5f521aSMarri Devender Rao```
2314e5f521aSMarri Devender RaoPACKAGECONFIG_add_class-native = "install_error_yaml"
2324e5f521aSMarri Devender RaoPACKAGECONFIG_add_class-nativesdk = "install_error_yaml"
2334e5f521aSMarri Devender Rao```
2349067c077SDeepak Kodihalli###### Disable install_error_yaml during target build
2354e5f521aSMarri Devender Rao```
2364e5f521aSMarri Devender RaoPACKAGECONFIG_remove_class-target = "install_error_yaml"
2374e5f521aSMarri Devender Rao```
2384e5f521aSMarri Devender Rao
2399067c077SDeepak Kodihalli###### Disable generating elog-errors.hpp for bitbake build
2404e5f521aSMarri Devender Rao* Disable gen_errors argument for bitbake image build as the application uses
2414e5f521aSMarri Devender Rao  the elog-errors.hpp generated by phosphor-logging
2424e5f521aSMarri Devender Rao* Argument is enabled by default for local repository build in the configure
2434e5f521aSMarri Devender Rao  script of the local repository.
2444e5f521aSMarri Devender Rao```
2454e5f521aSMarri Devender Rao XTRA_OECONF += "--disable-gen_errors"
2464e5f521aSMarri Devender Rao```
2474e5f521aSMarri Devender Rao
2489067c077SDeepak Kodihalli#### Local build
2494e5f521aSMarri Devender Rao* During local build use --prefix=/usr for the configure script.
2504e5f521aSMarri Devender Rao
2513210a9f3SMatt Spinler**Reference**
2523210a9f3SMatt Spinler* https://github.com/openbmc/openpower-debug-collector/blob/master/README.md
2533210a9f3SMatt Spinler
25499c2b405SMatt Spinler## Event Log Extensions
25599c2b405SMatt Spinler
25699c2b405SMatt SpinlerThe extension concept is a way to allow code that creates other formats of
25799c2b405SMatt Spinlererror logs besides phosphor-logging's event logs to still reside in the
25899c2b405SMatt Spinlerphosphor-log-manager application.
25999c2b405SMatt Spinler
26099c2b405SMatt SpinlerThe extension code lives in the `extensions/<extension>` subdirectories,
26199c2b405SMatt Spinlerand is enabled with a `--enable-<extension>` configure flag.  The
26299c2b405SMatt Spinlerextension code won't compile unless enabled with this flag.
26399c2b405SMatt Spinler
26499c2b405SMatt SpinlerExtensions can register themselves to have functions called at the following
26599c2b405SMatt Spinlerpoints using the REGISTER_EXTENSION_FUNCTION macro.
26699c2b405SMatt Spinler* On startup
26799c2b405SMatt Spinler   * Function type void(internal::Manager&)
26899c2b405SMatt Spinler* After an event log is created
26999c2b405SMatt Spinler   * Function type void(args)
27099c2b405SMatt Spinler   * The args are:
27199c2b405SMatt Spinler     * const std::string& - The Message property
27299c2b405SMatt Spinler     * uin32_t - The event log ID
27399c2b405SMatt Spinler     * uint64_t - The event log timestamp
27499c2b405SMatt Spinler     * Level - The event level
27599c2b405SMatt Spinler     * const AdditionalDataArg& - the additional data
27699c2b405SMatt Spinler     * const AssociationEndpointsArg& - Association endpoints (callouts)
27799c2b405SMatt Spinler* Before an event log is deleted, to check if it is allowed.
27899c2b405SMatt Spinler   * Function type void(std::uint32_t, bool&) that takes the event ID
27999c2b405SMatt Spinler* After an event log is deleted
28099c2b405SMatt Spinler   * Function type void(std::uint32_t) that takes the event ID
28199c2b405SMatt Spinler
28299c2b405SMatt SpinlerUsing these callback points, they can create their own event log for each
28399c2b405SMatt SpinlerOpenBMC event log that is created, and delete these logs when the corresponding
28499c2b405SMatt SpinlerOpenBMC event log is deleted.
28599c2b405SMatt Spinler
28699c2b405SMatt SpinlerIn addition, an extension has the option of disabling phosphor-logging's
28799c2b405SMatt Spinlerdefault error log capping policy so that it can use its own.  The macro
28899c2b405SMatt SpinlerDISABLE_LOG_ENTRY_CAPS() is used for that.
28999c2b405SMatt Spinler
29099c2b405SMatt Spinler### Motivation
29199c2b405SMatt Spinler
29299c2b405SMatt SpinlerThe reason for adding support for extensions inside the phosphor-log-manager
29399c2b405SMatt Spinlerdaemon as opposed to just creating new daemons that listen for D-Bus signals is
29499c2b405SMatt Spinlerto allow interactions that would be complicated or expensive if just done over
29599c2b405SMatt SpinlerD-Bus, such as:
29699c2b405SMatt Spinler* Allowing for custom old log retention algorithms.
29799c2b405SMatt Spinler* Prohibiting manual deleting of certain logs based on an extension's
29899c2b405SMatt Spinler  requirements.
29999c2b405SMatt Spinler
30099c2b405SMatt Spinler### Creating extensions
30199c2b405SMatt Spinler
30299c2b405SMatt Spinler1. Add a new flag to configure.ac to enable the extension:
30399c2b405SMatt Spinler```
30499c2b405SMatt SpinlerAC_ARG_ENABLE([foo-extension],
30599c2b405SMatt Spinler              AS_HELP_STRING([--enable-foo-extension],
30699c2b405SMatt Spinler                             [Create Foo logs]))
30799c2b405SMatt SpinlerAM_CONDITIONAL([ENABLE_FOO_EXTENSION],
30899c2b405SMatt Spinler               [test "x$enable_foo_extension" == "xyes"])
30999c2b405SMatt Spinler```
31099c2b405SMatt Spinler2. Add the code in `extensions/<extension>/`.
31199c2b405SMatt Spinler3. Create a makefile include to add the new code to phosphor-log-manager:
31299c2b405SMatt Spinler```
31399c2b405SMatt Spinlerphosphor_log_manager_SOURCES += \
31499c2b405SMatt Spinler        extensions/foo/foo.cpp
31599c2b405SMatt Spinler```
31699c2b405SMatt Spinler3. In `extensions/extensions.mk`, add the makefile include:
31799c2b405SMatt Spinler```
31899c2b405SMatt Spinlerif ENABLE_FOO_EXTENSION
31999c2b405SMatt Spinlerinclude extensions/foo/foo.mk
32099c2b405SMatt Spinlerendif
32199c2b405SMatt Spinler```
32299c2b405SMatt Spinler4. In the extension code, register the functions to call and optionally disable
32399c2b405SMatt Spinler   log capping using the provided macros:
32499c2b405SMatt Spinler```
32599c2b405SMatt SpinlerDISABLE_LOG_ENTRY_CAPS();
32699c2b405SMatt Spinler
32799c2b405SMatt Spinlervoid fooStartup(internal::Manager& manager)
32899c2b405SMatt Spinler{
32999c2b405SMatt Spinler    // Initialize
33099c2b405SMatt Spinler}
33199c2b405SMatt Spinler
33299c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooStartup);
33399c2b405SMatt Spinler
33499c2b405SMatt Spinlervoid fooCreate(const std::string& message, uint32_t id, uint64_t timestamp,
33599c2b405SMatt Spinler               Entry::Level severity, const AdditionalDataArg& additionalData,
33699c2b405SMatt Spinler               const AssociationEndpointsArg& assocs)
33799c2b405SMatt Spinler{
33899c2b405SMatt Spinler    // Create a different type of error log based on 'entry'.
33999c2b405SMatt Spinler}
34099c2b405SMatt Spinler
34199c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooCreate);
34299c2b405SMatt Spinler
34399c2b405SMatt Spinlervoid fooRemove(uint32_t id)
34499c2b405SMatt Spinler{
34599c2b405SMatt Spinler    // Delete the extension error log that corresponds to 'id'.
34699c2b405SMatt Spinler}
34799c2b405SMatt Spinler
34899c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooRemove);
34999c2b405SMatt Spinler```
3503210a9f3SMatt Spinler### Extension List
35199c2b405SMatt Spinler
3523210a9f3SMatt SpinlerThe supported extensions are:
3533210a9f3SMatt Spinler
3543210a9f3SMatt Spinler* OpenPower PELs
3553210a9f3SMatt Spinler    * Enabled with --enable-openpower-pel-extension
3563210a9f3SMatt Spinler    * Detailed information can be found
3573210a9f3SMatt Spinler        [here](extensions/openpower-pels/README.md)
358