17aafb12eSNagaraju Goruganti# phosphor-logging 2c41693c6SMatt SpinlerThe phosphor logging repository provides mechanisms for event and journal 3c41693c6SMatt Spinlerlogging. 4c41693c6SMatt Spinler 5c41693c6SMatt Spinler## Table Of Contents 6c41693c6SMatt Spinler* [Building](#to-build) 7c41693c6SMatt Spinler* [Remote Logging](#remote-logging-via-rsyslog) 8*0a2c1a23SMatt Spinler* [Event Logs](#event-logs) 9c41693c6SMatt Spinler* [Application Specific Error YAML](#adding-application-specific-error-yaml) 10c41693c6SMatt Spinler* [Event Log Extensions](#event-log-extensions) 117aafb12eSNagaraju Goruganti 127aafb12eSNagaraju Goruganti## To Build 137aafb12eSNagaraju Goruganti``` 147aafb12eSNagaraju GorugantiTo build this package, do the following steps: 157aafb12eSNagaraju Goruganti 167aafb12eSNagaraju Goruganti 1. ./bootstrap.sh 177aafb12eSNagaraju Goruganti 2. ./configure ${CONFIGURE_FLAGS} 187aafb12eSNagaraju Goruganti 3. make 197aafb12eSNagaraju Goruganti 207aafb12eSNagaraju GorugantiTo clean the repository run `./bootstrap.sh clean`. 217aafb12eSNagaraju Goruganti``` 229067c077SDeepak Kodihalli 23c4966192SDeepak Kodihalli## Remote Logging via Rsyslog 24c4966192SDeepak KodihalliThe BMC has the ability to stream out local logs (that go to the systemd journal) 25c4966192SDeepak Kodihallivia rsyslog (https://www.rsyslog.com/). 26c4966192SDeepak Kodihalli 27c4966192SDeepak KodihalliThe BMC will send everything. Any kind of filtering and appropriate storage 28c4966192SDeepak Kodihalliwill have to be managed on the rsyslog server. Various examples are available 29c4966192SDeepak Kodihallion the internet. Here are few pointers : 30c4966192SDeepak Kodihallihttps://www.rsyslog.com/storing-and-forwarding-remote-messages/ 31c4966192SDeepak Kodihallihttps://www.rsyslog.com/doc/rsyslog%255Fconf%255Ffilter.html 32c4966192SDeepak Kodihallihttps://www.thegeekdiary.com/understanding-rsyslog-filter-options/ 33c4966192SDeepak Kodihalli 34c4966192SDeepak Kodihalli#### Configuring rsyslog server for remote logging 35c4966192SDeepak KodihalliThe BMC is an rsyslog client. To stream out logs, it needs to talk to an rsyslog 36c4966192SDeepak Kodihalliserver, to which there's connectivity over a network. REST API can be used to 37c4966192SDeepak Kodihalliset the remote server's IP address and port number. 38c4966192SDeepak Kodihalli 39c4966192SDeepak KodihalliThe following presumes a user has logged on to the BMC (see 40c4966192SDeepak Kodihallihttps://github.com/openbmc/docs/blob/master/rest-api.md). 41c4966192SDeepak Kodihalli 42c4966192SDeepak KodihalliSet the IP: 43c4966192SDeepak Kodihalli``` 44c4966192SDeepak Kodihallicurl -b cjar -k -H "Content-Type: application/json" -X PUT \ 45c4966192SDeepak Kodihalli -d '{"data": <IP address>}' \ 46c4966192SDeepak Kodihalli https://<BMC IP address>/xyz/openbmc_project/logging/config/remote/attr/Address 47c4966192SDeepak Kodihalli``` 48c4966192SDeepak Kodihalli 49c4966192SDeepak KodihalliSet the port: 50c4966192SDeepak Kodihalli``` 51c4966192SDeepak Kodihallicurl -b cjar -k -H "Content-Type: application/json" -X PUT \ 52c4966192SDeepak Kodihalli -d '{"data": <port number>}' \ 53c4966192SDeepak Kodihalli https://<BMC IP address>/xyz/openbmc_project/logging/config/remote/attr/Port 54c4966192SDeepak Kodihalli``` 55c4966192SDeepak Kodihalli 56c4966192SDeepak Kodihalli#### Querying the current configuration 57c4966192SDeepak Kodihalli``` 58c4966192SDeepak Kodihallicurl -b cjar -k \ 59c4966192SDeepak Kodihalli https://<BMC IP address>/xyz/openbmc_project/logging/config/remote 60c4966192SDeepak Kodihalli``` 61c4966192SDeepak Kodihalli 62c4966192SDeepak Kodihalli#### Setting the hostname 63c4966192SDeepak KodihalliRsyslog can store logs separately for each host. For this reason, it's useful to 64c4966192SDeepak Kodihalliprovide a unique hostname to each managed BMC. Here's how that can be done via a 65c4966192SDeepak KodihalliREST API : 66c4966192SDeepak Kodihalli``` 67c4966192SDeepak Kodihallicurl -b cjar -k -H "Content-Type: application/json" -X PUT \ 68c4966192SDeepak Kodihalli -d '{"data": "myHostName"}' \ 69c4966192SDeepak Kodihalli https://<BMC IP address>//xyz/openbmc_project/network/config/attr/HostName 70c4966192SDeepak Kodihalli``` 71c4966192SDeepak Kodihalli 720febd26bSDeepak Kodihalli#### Disabling remote logging 730febd26bSDeepak KodihalliRemote logging can be disabled by writing 0 to the port, or an empty string("") 740febd26bSDeepak Kodihallito the IP. 750febd26bSDeepak Kodihalli 76c4966192SDeepak Kodihalli#### Changing the rsyslog server 77c4966192SDeepak KodihalliWhen switching to a new server from an existing one (i.e the address, or port, 78c4966192SDeepak Kodihallior both change), it is recommended to disable the existing configuration first. 79c4966192SDeepak Kodihalli 80*0a2c1a23SMatt Spinler## Event Logs 81*0a2c1a23SMatt SpinlerOpenBMC event logs are a collection of D-Bus interfaces owned by 82*0a2c1a23SMatt Spinlerphosphor-log-manager that reside at `/xyz/openbmc_project/logging/entry/X`, 83*0a2c1a23SMatt Spinlerwhere X starts at 1 and is incremented for each new log. 84*0a2c1a23SMatt Spinler 85*0a2c1a23SMatt SpinlerThe interfaces are: 86*0a2c1a23SMatt Spinler* [xyz.openbmc_project.Logging.Entry] 87*0a2c1a23SMatt Spinler * The main event log interface. 88*0a2c1a23SMatt Spinler* [org.openbmc.Associations] 89*0a2c1a23SMatt Spinler * Used for specifying inventory items as the cause of the event. 90*0a2c1a23SMatt Spinler * For more information on associations, see [here][associations-doc]. 91*0a2c1a23SMatt Spinler* [xyz.openbmc_project.Object.Delete] 92*0a2c1a23SMatt Spinler * Provides a Delete method to delete the event. 93*0a2c1a23SMatt Spinler* [xyz.openbmc_project.Software.Version] 94*0a2c1a23SMatt Spinler * Stores the code version that the error occurred on. 95*0a2c1a23SMatt Spinler 96*0a2c1a23SMatt SpinlerOn platforms that make use of these event logs, the intent is that they are 97*0a2c1a23SMatt Spinlerthe common event log representation that other types of event logs can be 98*0a2c1a23SMatt Spinlercreated from. For example, there is code to convert these into both Redfish 99*0a2c1a23SMatt Spinlerand IPMI event logs, in addition to the event log extensions mentioned 100*0a2c1a23SMatt Spinler[below](#event-log-extensions). 101*0a2c1a23SMatt Spinler 102*0a2c1a23SMatt SpinlerThe logging daemon has the ability to add `callout` associations to an event 103*0a2c1a23SMatt Spinlerlog based on text in the AdditionalData property. A callout is a link to the 104*0a2c1a23SMatt Spinlerinventory item(s) that were the cause of the event log. See [here][callout-doc] 105*0a2c1a23SMatt Spinlerfor details. 106*0a2c1a23SMatt Spinler 107*0a2c1a23SMatt Spinler### Creating Event Logs In Code 108*0a2c1a23SMatt SpinlerThere are two approaches to creating event logs in OpenBMC code. The first 109*0a2c1a23SMatt Spinlermakes use of the systemd journal to store metadata needed for the log, and the 110*0a2c1a23SMatt Spinlersecond is a plain D-Bus method call. 111*0a2c1a23SMatt Spinler 112*0a2c1a23SMatt Spinler#### Journal Based Event Log Creation 113*0a2c1a23SMatt SpinlerEvent logs can be created by using phosphor-logging APIs to commit sdbusplus 114*0a2c1a23SMatt Spinlerexceptions. These APIs write to the journal, and then call a `Commit` 115*0a2c1a23SMatt SpinlerD-Bus method on the logging daemon to create the event log using the information 116*0a2c1a23SMatt Spinlerit put in the journal. 117*0a2c1a23SMatt Spinler 118*0a2c1a23SMatt SpinlerThe APIs are found in `<phosphor-logging/elog.hpp>`: 119*0a2c1a23SMatt Spinler* `elog()`: Throw an sdbusplus error. 120*0a2c1a23SMatt Spinler* `commit()`: Catch an error thrown by elog(), and commit it to create the 121*0a2c1a23SMatt Spinler event log. 122*0a2c1a23SMatt Spinler* `report()`: Create an event log from an sdbusplus error without throwing the 123*0a2c1a23SMatt Spinler exception first. 124*0a2c1a23SMatt Spinler 125*0a2c1a23SMatt SpinlerAny errors passed into these APIs must be known to phosphor-logging, usually 126*0a2c1a23SMatt Spinlerby being defined in `<phosphor-logging/elog-errors.hpp>`. The errors must 127*0a2c1a23SMatt Spinleralso be known by sdbusplus, and be defined in their corresponding error.hpp. 128*0a2c1a23SMatt SpinlerSee below for details on how get errors into these headers. 129*0a2c1a23SMatt Spinler 130*0a2c1a23SMatt SpinlerExample: 131*0a2c1a23SMatt Spinler``` 132*0a2c1a23SMatt Spinler#include <phosphor-logging/elog-errors.hpp> 133*0a2c1a23SMatt Spinler#include <phosphor-logging/elog.hpp> 134*0a2c1a23SMatt Spinler#include <xyz/openbmc_project/Common/error.hpp> 135*0a2c1a23SMatt Spinler... 136*0a2c1a23SMatt Spinlerusing InternalFailure = 137*0a2c1a23SMatt Spinler sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; 138*0a2c1a23SMatt Spinler... 139*0a2c1a23SMatt Spinlerif (somethingBadHappened) 140*0a2c1a23SMatt Spinler{ 141*0a2c1a23SMatt Spinler phosphor::logging::report<InternalFailure>(); 142*0a2c1a23SMatt Spinler} 143*0a2c1a23SMatt Spinler 144*0a2c1a23SMatt Spinler``` 145*0a2c1a23SMatt SpinlerAlternatively, to throw, catch, and then commit the error: 146*0a2c1a23SMatt Spinler``` 147*0a2c1a23SMatt Spinlertry 148*0a2c1a23SMatt Spinler{ 149*0a2c1a23SMatt Spinler phosphor::logging::elog<InternalFailure>(); 150*0a2c1a23SMatt Spinler} 151*0a2c1a23SMatt Spinlercatch (InternalFailure& e) 152*0a2c1a23SMatt Spinler{ 153*0a2c1a23SMatt Spinler phosphor::logging::commit<InternalFailure>(); 154*0a2c1a23SMatt Spinler} 155*0a2c1a23SMatt Spinler``` 156*0a2c1a23SMatt Spinler 157*0a2c1a23SMatt SpinlerMetadata can be added to event logs to add debug data captured at the time of 158*0a2c1a23SMatt Spinlerthe event. It shows up in the AdditionalData property in the 159*0a2c1a23SMatt Spinler`xyz.openbmc_project.Logging.Entry` interface. Metadata is passed in via the 160*0a2c1a23SMatt Spinler`elog()` or `report()` functions, which write it to the journal. The metadata 161*0a2c1a23SMatt Spinlermust be predefined for the error in the [metadata YAML](#event-log-definition) 162*0a2c1a23SMatt Spinlerso that the daemon knows to look for it in the journal when it creates the 163*0a2c1a23SMatt Spinlerevent log. 164*0a2c1a23SMatt Spinler 165*0a2c1a23SMatt SpinlerExample: 166*0a2c1a23SMatt Spinler``` 167*0a2c1a23SMatt Spinler#include <phosphor-logging/elog-errors.hpp> 168*0a2c1a23SMatt Spinler#include <phosphor-logging/elog.hpp> 169*0a2c1a23SMatt Spinler#include <xyz/openbmc_project/Control/Device/error.hpp> 170*0a2c1a23SMatt Spinler... 171*0a2c1a23SMatt Spinlerusing WriteFailure = 172*0a2c1a23SMatt Spinler sdbusplus::xyz::openbmc_project::Control::Device::Error::WriteFailure; 173*0a2c1a23SMatt Spinlerusing metadata = 174*0a2c1a23SMatt Spinler xyz::openbmc_project::Control::Device::WriteFailure; 175*0a2c1a23SMatt Spinler... 176*0a2c1a23SMatt Spinlerif (somethingBadHappened) 177*0a2c1a23SMatt Spinler{ 178*0a2c1a23SMatt Spinler phosphor::logging::report<WriteFailure>(metadata::CALLOUT_ERRNO(5), 179*0a2c1a23SMatt Spinler metadata::CALLOUT_DEVICE_PATH("some path")); 180*0a2c1a23SMatt Spinler} 181*0a2c1a23SMatt Spinler``` 182*0a2c1a23SMatt SpinlerIn the above example, the AdditionalData property would look like: 183*0a2c1a23SMatt Spinler``` 184*0a2c1a23SMatt Spinler["CALLOUT_ERRNO=5", "CALLOUT_DEVICE_PATH=some path"] 185*0a2c1a23SMatt Spinler``` 186*0a2c1a23SMatt SpinlerNote that the metadata fields must be all uppercase. 187*0a2c1a23SMatt Spinler 188*0a2c1a23SMatt Spinler##### Event Log Definition 189*0a2c1a23SMatt SpinlerAs mentioned above, both sdbusplus and phosphor-logging must know about the 190*0a2c1a23SMatt Spinlerevent logs in their header files, or the code that uses them will not even 191*0a2c1a23SMatt Spinlercompile. The standard way to do this to define the event in the appropriate 192*0a2c1a23SMatt Spinler`<error-category>.errors.yaml` file, and define any metadata in the 193*0a2c1a23SMatt Spinler`<error-category>.metadata.yaml` file in the appropriate `*-dbus-interfaces` 194*0a2c1a23SMatt Spinlerrepository. During the build, phosphor-logging generates the elog-errors.hpp 195*0a2c1a23SMatt Spinlerfile for use by the calling code. 196*0a2c1a23SMatt Spinler 197*0a2c1a23SMatt SpinlerIn much the same way, sdbusplus uses the event log definitions to generate an 198*0a2c1a23SMatt Spinlererror.hpp file that contains the specific exception. The path of the error.hpp 199*0a2c1a23SMatt Spinlermatches the path of the YAML file. 200*0a2c1a23SMatt Spinler 201*0a2c1a23SMatt SpinlerFor example, if in phosphor-dbus-interfaces there is 202*0a2c1a23SMatt Spinler`xyz/openbmc_project/Control/Device.errors.yaml`, the errors that come from 203*0a2c1a23SMatt Spinlerthat file will be in the include: 204*0a2c1a23SMatt Spinler`xyz/openbmc_project/Control/Device/error.hpp`. 205*0a2c1a23SMatt Spinler 206*0a2c1a23SMatt SpinlerIn rare cases, one may want one to define their errors in the same repository 207*0a2c1a23SMatt Spinlerthat uses them. To do that, one must: 208*0a2c1a23SMatt Spinler 209*0a2c1a23SMatt Spinler1. Add the error and metadata YAML files to the repository. 210*0a2c1a23SMatt Spinler2. Run the sdbus++ script within the makefile to create the error.hpp and .cpp 211*0a2c1a23SMatt Spinler files from the local YAML, and include the error.cpp file in the application 212*0a2c1a23SMatt Spinler that uses it. See [openpower-occ-control] for an example. 213*0a2c1a23SMatt Spinler3. Tell phosphor-logging about the error. This is done by either: 214*0a2c1a23SMatt Spinler * Following the [directions](#adding-application-specific-error-yaml) 215*0a2c1a23SMatt Spinler defined in this README, or 216*0a2c1a23SMatt Spinler * Running the script yourself: 217*0a2c1a23SMatt Spinler 1. Run phosphor-logging\'s `elog-gen.py` script on the local yaml to 218*0a2c1a23SMatt Spinler generate an elog-errors.hpp file that just contains the local errors, 219*0a2c1a23SMatt Spinler and check that into the repository and include it where the errors are 220*0a2c1a23SMatt Spinler needed. 221*0a2c1a23SMatt Spinler 2. Create a recipe that copies the local YAML files to a place that 222*0a2c1a23SMatt Spinler phosphor-logging can find it during the build. See [here][led-link] 223*0a2c1a23SMatt Spinler for an example. 224*0a2c1a23SMatt Spinler 225*0a2c1a23SMatt Spinler#### D-Bus Event Log Creation 226*0a2c1a23SMatt Spinler**TODO** 227*0a2c1a23SMatt Spinler 228*0a2c1a23SMatt Spinler[xyz.openbmc_project.Logging.Entry]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Logging/Entry.interface.yaml 229*0a2c1a23SMatt Spinler[org.openbmc.Associations]: https://github.com/openbmc/phosphor-logging/blob/master/org/openbmc/Associations.interface.yaml 230*0a2c1a23SMatt Spinler[associations-doc]: https://github.com/openbmc/docs/blob/master/object-mapper.md#associations 231*0a2c1a23SMatt Spinler[callout-doc]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Common/Callout/README.md 232*0a2c1a23SMatt Spinler[xyz.openbmc_project.Object.Delete]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Object/Delete.interface.yaml 233*0a2c1a23SMatt Spinler[xyz.openbmc_project.Software.Version]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Software/Version.errors.yaml 234*0a2c1a23SMatt Spinler[elog-errors.hpp]: https://github.com/openbmc/phosphor-logging/blob/master/phosphor-logging/elog.hpp 235*0a2c1a23SMatt Spinler[openpower-occ-control]: https://github.com/openbmc/openpower-occ-control 236*0a2c1a23SMatt Spinler[led-link]: https://github.com/openbmc/openbmc/tree/master/meta-phosphor/recipes-phosphor/leds 2370febd26bSDeepak Kodihalli 2389067c077SDeepak Kodihalli## Adding application specific error YAML 2394e5f521aSMarri Devender Rao* This document captures steps for adding application specific error YAML files 2404e5f521aSMarri Devender Rao and generating local elog-errors.hpp header file for application use. 2414e5f521aSMarri Devender Rao* Should cater for continuous integration (CI) build, bitbake image build, and 2424e5f521aSMarri Devender Rao local repository build. 2437aafb12eSNagaraju Goruganti 2449067c077SDeepak Kodihalli#### Continuous Integration (CI) build 2454e5f521aSMarri Devender Rao * Make is called on the repository that is modified. 2464e5f521aSMarri Devender Rao * Dependent packages are pulled based on the dependency list specified in the 2474e5f521aSMarri Devender Rao configure.ac script. 2487aafb12eSNagaraju Goruganti 2499067c077SDeepak Kodihalli#### Recipe build 2504e5f521aSMarri Devender Rao * Native recipes copy error YAML files to shared location. 2514e5f521aSMarri Devender Rao * phosphor-logging builds elog-errors.hpp by parsing the error YAML files from 2524e5f521aSMarri Devender Rao the shared location. 2537aafb12eSNagaraju Goruganti 2549067c077SDeepak Kodihalli#### Local repository build 2554e5f521aSMarri Devender Rao * Copies local error YAML files to the shared location in SDK 2564e5f521aSMarri Devender Rao * Make generates elog-errors.hpp by parsing the error YAML files from the 2574e5f521aSMarri Devender Rao shared location. 2587aafb12eSNagaraju Goruganti 2599067c077SDeepak Kodihalli#### Makefile changes 2604e5f521aSMarri Devender Rao**Reference** 2614e5f521aSMarri Devender Rao * https://github.com/openbmc/openpower-debug-collector/blob/master/Makefile.am 2629067c077SDeepak Kodihalli 2639067c077SDeepak Kodihalli###### Export error YAML to shared location 2644e5f521aSMarri Devender Rao*Modify Makefile.am to export newly added error YAML to shared location* 2654e5f521aSMarri Devender Rao``` 2664e5f521aSMarri Devender Raoyamldir = ${datadir}/phosphor-dbus-yaml/yaml 2674e5f521aSMarri Devender Raonobase_yaml_DATA = \ 2684e5f521aSMarri Devender Rao org/open_power/Host.errors.yaml 2694e5f521aSMarri Devender Rao``` 2709067c077SDeepak Kodihalli 2719067c077SDeepak Kodihalli###### Generate elog-errors.hpp using elog parser from SDK location 2724e5f521aSMarri Devender Rao * Add a conditional check "GEN_ERRORS" 2734e5f521aSMarri Devender Rao * Disable the check for recipe bitbake image build 2744e5f521aSMarri Devender Rao * Enable it for local repository build 2754e5f521aSMarri Devender Rao * If "GEN_ERRORS" is enabled, build generates elog-errors.hpp header file. 2764e5f521aSMarri Devender Rao``` 2774e5f521aSMarri Devender Rao # Generate phosphor-logging/elog-errors.hpp 2784e5f521aSMarri Devender Rao if GEN_ERRORS 2794e5f521aSMarri Devender Rao ELOG_MAKO ?= elog-gen-template.mako.hpp 2804e5f521aSMarri Devender Rao ELOG_DIR ?= ${OECORE_NATIVE_SYSROOT}${datadir}/phosphor-logging/elog 2814e5f521aSMarri Devender Rao ELOG_GEN_DIR ?= ${ELOG_DIR}/tools/ 2824e5f521aSMarri Devender Rao ELOG_MAKO_DIR ?= ${ELOG_DIR}/tools/phosphor-logging/templates/ 2834e5f521aSMarri Devender Rao YAML_DIR ?= ${OECORE_NATIVE_SYSROOT}${datadir}/phosphor-dbus-yaml/yaml 2844e5f521aSMarri Devender Rao phosphor-logging/elog-errors.hpp: 2854e5f521aSMarri Devender Rao @mkdir -p ${YAML_DIR}/org/open_power/ 2864e5f521aSMarri Devender Rao @cp ${top_srcdir}/org/open_power/Host.errors.yaml \ 2874e5f521aSMarri Devender Rao ${YAML_DIR}/org/open_power/Host.errors.yaml 2884e5f521aSMarri Devender Rao @mkdir -p `dirname $@` 2894e5f521aSMarri Devender Rao @chmod 777 $(ELOG_GEN_DIR)/elog-gen.py 2904e5f521aSMarri Devender Rao $(AM_V_at)$(PYTHON) $(ELOG_GEN_DIR)/elog-gen.py -y ${YAML_DIR} \ 2914e5f521aSMarri Devender Rao -t ${ELOG_MAKO_DIR} -m ${ELOG_MAKO} -o $@ 2924e5f521aSMarri Devender Rao endif 2934e5f521aSMarri Devender Rao``` 2947aafb12eSNagaraju Goruganti 2959067c077SDeepak Kodihalli###### Update BUILT_SOURCES 2964e5f521aSMarri Devender Rao * Append elog-errors.hpp to BUILT_SOURCES list and put it in conditional check 2974e5f521aSMarri Devender Rao GEN_ERRORS so that the elog-errors.hpp is generated only during local 2984e5f521aSMarri Devender Rao repository build. 2994e5f521aSMarri Devender Rao``` 3004e5f521aSMarri Devender Rao if GEN_ERRORS 3014e5f521aSMarri Devender Rao nobase_nodist_include_HEADERS += \ 3024e5f521aSMarri Devender Rao phosphor-logging/elog-errors.hpp 3034e5f521aSMarri Devender Rao endif 3044e5f521aSMarri Devender Rao if GEN_ERRORS 3054e5f521aSMarri Devender Rao BUILT_SOURCES += phosphor-logging/elog-errors.hpp 3064e5f521aSMarri Devender Rao endif 3074e5f521aSMarri Devender Rao``` 3089067c077SDeepak Kodihalli 3099067c077SDeepak Kodihalli###### Conditional check for native build 3104e5f521aSMarri Devender Rao * As the same Makefile is used both for recipe image build and native recipe 3114e5f521aSMarri Devender Rao build, add a conditional to ensure that only installation of error yaml files 3124e5f521aSMarri Devender Rao happens during native build. It is not required to build repository during 3134e5f521aSMarri Devender Rao native build. 3144e5f521aSMarri Devender Rao``` 3154e5f521aSMarri Devender Rao if !INSTALL_ERROR_YAML 3164e5f521aSMarri Devender Rao endif 3174e5f521aSMarri Devender Rao``` 3189067c077SDeepak Kodihalli 3199067c077SDeepak Kodihalli#### Autotools changes 3204e5f521aSMarri Devender Rao**Reference** 3214e5f521aSMarri Devender Rao * https://github.com/openbmc/openpower-debug-collector/blob/master/configure.ac 3227aafb12eSNagaraju Goruganti 3239067c077SDeepak Kodihalli###### Add option(argument) to enable/disable installing error yaml file 3244e5f521aSMarri Devender Rao * Install error yaml option(argument) is enabled for native recipe build 3254e5f521aSMarri Devender Rao and disabled for bitbake build. 3264e5f521aSMarri Devender Rao 3274e5f521aSMarri Devender Rao * When install error yaml option is disabled do not check for target specific 3284e5f521aSMarri Devender Rao packages in autotools configure script. 3294e5f521aSMarri Devender Rao 3309067c077SDeepak Kodihalli###### Add option(argument) to install error yaml files 3314e5f521aSMarri Devender Rao``` 3324e5f521aSMarri Devender RaoAC_ARG_ENABLE([install_error_yaml], 3334e5f521aSMarri Devender Rao AS_HELP_STRING([--enable-install_error_yaml], 3344e5f521aSMarri Devender Rao [Enable installing error yaml file]),[], [install_error_yaml=no]) 3354e5f521aSMarri Devender RaoAM_CONDITIONAL([INSTALL_ERROR_YAML], 3364e5f521aSMarri Devender Rao [test "x$enable_install_error_yaml" = "xyes"]) 3374e5f521aSMarri Devender RaoAS_IF([test "x$enable_install_error_yaml" != "xyes"], [ 3384e5f521aSMarri Devender Rao.. 3394e5f521aSMarri Devender Rao.. 3404e5f521aSMarri Devender Rao]) 3414e5f521aSMarri Devender Rao``` 3429067c077SDeepak Kodihalli 3439067c077SDeepak Kodihalli###### Add option(argument) to enable/disable generating elog-errors header file 3444e5f521aSMarri Devender Rao``` 3454e5f521aSMarri Devender RaoAC_ARG_ENABLE([gen_errors], 3464e5f521aSMarri Devender Rao AS_HELP_STRING([--enable-gen_errors], [Enable elog-errors.hpp generation ]), 3474e5f521aSMarri Devender Rao [],[gen_errors=yes]) 3484e5f521aSMarri Devender RaoAM_CONDITIONAL([GEN_ERRORS], [test "x$enable_gen_errors" != "xno"]) 3494e5f521aSMarri Devender Rao``` 3504e5f521aSMarri Devender Rao 3519067c077SDeepak Kodihalli#### Recipe changes 3524e5f521aSMarri Devender Rao**Reference** 3534e5f521aSMarri Devender Rao* https://github.com/openbmc/openbmc/blob/master/meta-openbmc-machines\ 3544e5f521aSMarri Devender Rao/meta-openpower/common/recipes-phosphor/debug/openpower-debug-collector.bb 3554e5f521aSMarri Devender Rao 3569067c077SDeepak Kodihalli###### Extend recipe for native and nativesdk 3574e5f521aSMarri Devender Rao* Extend the recipe for native and native SDK builds 3584e5f521aSMarri Devender Rao``` 3594e5f521aSMarri Devender RaoBBCLASSEXTEND += "native nativesdk" 3604e5f521aSMarri Devender Rao``` 3619067c077SDeepak Kodihalli###### Remove dependencies for native and native SDK build 3624e5f521aSMarri Devender Rao* Native recipe caters only for copying error yaml files to shared location. 3634e5f521aSMarri Devender Rao* For native and native SDK build remove dependency on packages that recipe 3644e5f521aSMarri Devender Rao build depends 3654e5f521aSMarri Devender Rao 3669067c077SDeepak Kodihalli###### Remove dependency on phosphor-logging for native build 3674e5f521aSMarri Devender Rao``` 3684e5f521aSMarri Devender RaoDEPENDS_remove_class-native = "phosphor-logging" 3694e5f521aSMarri Devender Rao``` 3709067c077SDeepak Kodihalli 3719067c077SDeepak Kodihalli###### Remove dependency on phosphor-logging for native SDK build 3724e5f521aSMarri Devender Rao``` 3734e5f521aSMarri Devender RaoDEPENDS_remove_class-nativesdk = "phosphor-logging" 3744e5f521aSMarri Devender Rao``` 3759067c077SDeepak Kodihalli 3769067c077SDeepak Kodihalli###### Add install_error_yaml argument during native build 3774e5f521aSMarri Devender Rao* Add package config to enable/disable install_error_yaml feature. 3789067c077SDeepak Kodihalli 3799067c077SDeepak Kodihalli###### Add package config to enable/disable install_error_yaml feature 3804e5f521aSMarri Devender Rao``` 3814e5f521aSMarri Devender RaoPACKAGECONFIG ??= "install_error_yaml" 3824e5f521aSMarri Devender RaoPACKAGECONFIG[install_error_yaml] = " \ 3834e5f521aSMarri Devender Rao --enable-install_error_yaml, \ 3844e5f521aSMarri Devender Rao --disable-install_error_yaml, ,\ 3854e5f521aSMarri Devender Rao " 3864e5f521aSMarri Devender Rao``` 3879067c077SDeepak Kodihalli###### Enable install_error_yaml check for native build 3884e5f521aSMarri Devender Rao``` 3894e5f521aSMarri Devender RaoPACKAGECONFIG_add_class-native = "install_error_yaml" 3904e5f521aSMarri Devender RaoPACKAGECONFIG_add_class-nativesdk = "install_error_yaml" 3914e5f521aSMarri Devender Rao``` 3929067c077SDeepak Kodihalli###### Disable install_error_yaml during target build 3934e5f521aSMarri Devender Rao``` 3944e5f521aSMarri Devender RaoPACKAGECONFIG_remove_class-target = "install_error_yaml" 3954e5f521aSMarri Devender Rao``` 3964e5f521aSMarri Devender Rao 3979067c077SDeepak Kodihalli###### Disable generating elog-errors.hpp for bitbake build 3984e5f521aSMarri Devender Rao* Disable gen_errors argument for bitbake image build as the application uses 3994e5f521aSMarri Devender Rao the elog-errors.hpp generated by phosphor-logging 4004e5f521aSMarri Devender Rao* Argument is enabled by default for local repository build in the configure 4014e5f521aSMarri Devender Rao script of the local repository. 4024e5f521aSMarri Devender Rao``` 4034e5f521aSMarri Devender Rao XTRA_OECONF += "--disable-gen_errors" 4044e5f521aSMarri Devender Rao``` 4054e5f521aSMarri Devender Rao 4069067c077SDeepak Kodihalli#### Local build 4074e5f521aSMarri Devender Rao* During local build use --prefix=/usr for the configure script. 4084e5f521aSMarri Devender Rao 4093210a9f3SMatt Spinler**Reference** 4103210a9f3SMatt Spinler* https://github.com/openbmc/openpower-debug-collector/blob/master/README.md 4113210a9f3SMatt Spinler 41299c2b405SMatt Spinler## Event Log Extensions 41399c2b405SMatt Spinler 41499c2b405SMatt SpinlerThe extension concept is a way to allow code that creates other formats of 41599c2b405SMatt Spinlererror logs besides phosphor-logging's event logs to still reside in the 41699c2b405SMatt Spinlerphosphor-log-manager application. 41799c2b405SMatt Spinler 41899c2b405SMatt SpinlerThe extension code lives in the `extensions/<extension>` subdirectories, 41999c2b405SMatt Spinlerand is enabled with a `--enable-<extension>` configure flag. The 42099c2b405SMatt Spinlerextension code won't compile unless enabled with this flag. 42199c2b405SMatt Spinler 42299c2b405SMatt SpinlerExtensions can register themselves to have functions called at the following 42399c2b405SMatt Spinlerpoints using the REGISTER_EXTENSION_FUNCTION macro. 42499c2b405SMatt Spinler* On startup 42599c2b405SMatt Spinler * Function type void(internal::Manager&) 42699c2b405SMatt Spinler* After an event log is created 42799c2b405SMatt Spinler * Function type void(args) 42899c2b405SMatt Spinler * The args are: 42999c2b405SMatt Spinler * const std::string& - The Message property 43099c2b405SMatt Spinler * uin32_t - The event log ID 43199c2b405SMatt Spinler * uint64_t - The event log timestamp 43299c2b405SMatt Spinler * Level - The event level 43399c2b405SMatt Spinler * const AdditionalDataArg& - the additional data 43499c2b405SMatt Spinler * const AssociationEndpointsArg& - Association endpoints (callouts) 43599c2b405SMatt Spinler* Before an event log is deleted, to check if it is allowed. 43699c2b405SMatt Spinler * Function type void(std::uint32_t, bool&) that takes the event ID 43799c2b405SMatt Spinler* After an event log is deleted 43899c2b405SMatt Spinler * Function type void(std::uint32_t) that takes the event ID 43999c2b405SMatt Spinler 44099c2b405SMatt SpinlerUsing these callback points, they can create their own event log for each 44199c2b405SMatt SpinlerOpenBMC event log that is created, and delete these logs when the corresponding 44299c2b405SMatt SpinlerOpenBMC event log is deleted. 44399c2b405SMatt Spinler 44499c2b405SMatt SpinlerIn addition, an extension has the option of disabling phosphor-logging's 44599c2b405SMatt Spinlerdefault error log capping policy so that it can use its own. The macro 44699c2b405SMatt SpinlerDISABLE_LOG_ENTRY_CAPS() is used for that. 44799c2b405SMatt Spinler 44899c2b405SMatt Spinler### Motivation 44999c2b405SMatt Spinler 45099c2b405SMatt SpinlerThe reason for adding support for extensions inside the phosphor-log-manager 45199c2b405SMatt Spinlerdaemon as opposed to just creating new daemons that listen for D-Bus signals is 45299c2b405SMatt Spinlerto allow interactions that would be complicated or expensive if just done over 45399c2b405SMatt SpinlerD-Bus, such as: 45499c2b405SMatt Spinler* Allowing for custom old log retention algorithms. 45599c2b405SMatt Spinler* Prohibiting manual deleting of certain logs based on an extension's 45699c2b405SMatt Spinler requirements. 45799c2b405SMatt Spinler 45899c2b405SMatt Spinler### Creating extensions 45999c2b405SMatt Spinler 46099c2b405SMatt Spinler1. Add a new flag to configure.ac to enable the extension: 46199c2b405SMatt Spinler``` 46299c2b405SMatt SpinlerAC_ARG_ENABLE([foo-extension], 46399c2b405SMatt Spinler AS_HELP_STRING([--enable-foo-extension], 46499c2b405SMatt Spinler [Create Foo logs])) 46599c2b405SMatt SpinlerAM_CONDITIONAL([ENABLE_FOO_EXTENSION], 46699c2b405SMatt Spinler [test "x$enable_foo_extension" == "xyes"]) 46799c2b405SMatt Spinler``` 46899c2b405SMatt Spinler2. Add the code in `extensions/<extension>/`. 46999c2b405SMatt Spinler3. Create a makefile include to add the new code to phosphor-log-manager: 47099c2b405SMatt Spinler``` 47199c2b405SMatt Spinlerphosphor_log_manager_SOURCES += \ 47299c2b405SMatt Spinler extensions/foo/foo.cpp 47399c2b405SMatt Spinler``` 47499c2b405SMatt Spinler3. In `extensions/extensions.mk`, add the makefile include: 47599c2b405SMatt Spinler``` 47699c2b405SMatt Spinlerif ENABLE_FOO_EXTENSION 47799c2b405SMatt Spinlerinclude extensions/foo/foo.mk 47899c2b405SMatt Spinlerendif 47999c2b405SMatt Spinler``` 48099c2b405SMatt Spinler4. In the extension code, register the functions to call and optionally disable 48199c2b405SMatt Spinler log capping using the provided macros: 48299c2b405SMatt Spinler``` 48399c2b405SMatt SpinlerDISABLE_LOG_ENTRY_CAPS(); 48499c2b405SMatt Spinler 48599c2b405SMatt Spinlervoid fooStartup(internal::Manager& manager) 48699c2b405SMatt Spinler{ 48799c2b405SMatt Spinler // Initialize 48899c2b405SMatt Spinler} 48999c2b405SMatt Spinler 49099c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooStartup); 49199c2b405SMatt Spinler 49299c2b405SMatt Spinlervoid fooCreate(const std::string& message, uint32_t id, uint64_t timestamp, 49399c2b405SMatt Spinler Entry::Level severity, const AdditionalDataArg& additionalData, 49499c2b405SMatt Spinler const AssociationEndpointsArg& assocs) 49599c2b405SMatt Spinler{ 49699c2b405SMatt Spinler // Create a different type of error log based on 'entry'. 49799c2b405SMatt Spinler} 49899c2b405SMatt Spinler 49999c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooCreate); 50099c2b405SMatt Spinler 50199c2b405SMatt Spinlervoid fooRemove(uint32_t id) 50299c2b405SMatt Spinler{ 50399c2b405SMatt Spinler // Delete the extension error log that corresponds to 'id'. 50499c2b405SMatt Spinler} 50599c2b405SMatt Spinler 50699c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooRemove); 50799c2b405SMatt Spinler``` 5083210a9f3SMatt Spinler### Extension List 50999c2b405SMatt Spinler 5103210a9f3SMatt SpinlerThe supported extensions are: 5113210a9f3SMatt Spinler 5123210a9f3SMatt Spinler* OpenPower PELs 5133210a9f3SMatt Spinler * Enabled with --enable-openpower-pel-extension 5143210a9f3SMatt Spinler * Detailed information can be found 5153210a9f3SMatt Spinler [here](extensions/openpower-pels/README.md) 516