17aafb12eSNagaraju Goruganti# phosphor-logging 226919f07SPatrick Williams 3c41693c6SMatt SpinlerThe phosphor logging repository provides mechanisms for event and journal 4c41693c6SMatt Spinlerlogging. 5c41693c6SMatt Spinler 6c41693c6SMatt Spinler## Table Of Contents 726919f07SPatrick Williams 826919f07SPatrick Williams- [Building](#to-build) 926919f07SPatrick Williams- [Structured Logging](#structured-logging) 1026919f07SPatrick Williams- [Event Logs](#event-logs) 1126919f07SPatrick Williams- [Application Specific Error YAML](#adding-application-specific-error-yaml) 1226919f07SPatrick Williams- [Event Log Extensions](#event-log-extensions) 1326919f07SPatrick Williams- [Remote Logging](#remote-logging-via-rsyslog) 1426919f07SPatrick Williams- [Boot Fail on Hardware Errors](#boot-fail-on-hardware-errors) 157aafb12eSNagaraju Goruganti 167aafb12eSNagaraju Goruganti## To Build 1726919f07SPatrick Williams 187aafb12eSNagaraju GorugantiTo build this package, do the following steps: 197aafb12eSNagaraju Goruganti 207bc39084SPatrick Williams1. meson builddir 217bc39084SPatrick Williams2. ninja -c builddir 229067c077SDeepak Kodihalli 2387896d58SPatrick Williams## Structured Logging 2487896d58SPatrick Williams 2526919f07SPatrick Williamsphosphor-logging provides APIs to add program logging information to the 2626919f07SPatrick Williamssystemd-journal and it is preferred that this logging data is formatted in a 2726919f07SPatrick Williamsstructured manner (using the facilities provided by the APIs). 2826919f07SPatrick Williams 2926919f07SPatrick WilliamsSee [Structured Logging](./docs/structured-logging.md) for more details on this 3026919f07SPatrick WilliamsAPI. 3187896d58SPatrick Williams 320a2c1a23SMatt Spinler## Event Logs 3326919f07SPatrick Williams 340a2c1a23SMatt SpinlerOpenBMC event logs are a collection of D-Bus interfaces owned by 350a2c1a23SMatt Spinlerphosphor-log-manager that reside at `/xyz/openbmc_project/logging/entry/X`, 360a2c1a23SMatt Spinlerwhere X starts at 1 and is incremented for each new log. 370a2c1a23SMatt Spinler 380a2c1a23SMatt SpinlerThe interfaces are: 390a2c1a23SMatt Spinler 4026919f07SPatrick Williams- [xyz.openbmc_project.Logging.Entry] 4126919f07SPatrick Williams - The main event log interface. 4226919f07SPatrick Williams- [xyz.openbmc_project.Association.Definitions] 4326919f07SPatrick Williams - Used for specifying inventory items as the cause of the event. 4426919f07SPatrick Williams - For more information on associations, see [here][associations-doc]. 4526919f07SPatrick Williams- [xyz.openbmc_project.Object.Delete] 4626919f07SPatrick Williams - Provides a Delete method to delete the event. 4726919f07SPatrick Williams- [xyz.openbmc_project.Software.Version] 4826919f07SPatrick Williams - Stores the code version that the error occurred on. 4926919f07SPatrick Williams 5026919f07SPatrick WilliamsOn platforms that make use of these event logs, the intent is that they are the 5126919f07SPatrick Williamscommon event log representation that other types of event logs can be created 5226919f07SPatrick Williamsfrom. For example, there is code to convert these into both Redfish and IPMI 5326919f07SPatrick Williamsevent logs, in addition to the event log extensions mentioned 540a2c1a23SMatt Spinler[below](#event-log-extensions). 550a2c1a23SMatt Spinler 5626919f07SPatrick WilliamsThe logging daemon has the ability to add `callout` associations to an event log 5726919f07SPatrick Williamsbased on text in the AdditionalData property. A callout is a link to the 580a2c1a23SMatt Spinlerinventory item(s) that were the cause of the event log. See [here][callout-doc] 590a2c1a23SMatt Spinlerfor details. 600a2c1a23SMatt Spinler 610a2c1a23SMatt Spinler### Creating Event Logs In Code 6226919f07SPatrick Williams 6326919f07SPatrick WilliamsThere are two approaches to creating event logs in OpenBMC code. The first makes 6426919f07SPatrick Williamsuse of the systemd journal to store metadata needed for the log, and the second 6526919f07SPatrick Williamsis a plain D-Bus method call. 660a2c1a23SMatt Spinler 670a2c1a23SMatt Spinler#### Journal Based Event Log Creation 6826919f07SPatrick Williams 690a2c1a23SMatt SpinlerEvent logs can be created by using phosphor-logging APIs to commit sdbusplus 7026919f07SPatrick Williamsexceptions. These APIs write to the journal, and then call a `Commit` D-Bus 7126919f07SPatrick Williamsmethod on the logging daemon to create the event log using the information it 7226919f07SPatrick Williamsput in the journal. 730a2c1a23SMatt Spinler 740a2c1a23SMatt SpinlerThe APIs are found in `<phosphor-logging/elog.hpp>`: 7526919f07SPatrick Williams 7626919f07SPatrick Williams- `elog()`: Throw an sdbusplus error. 7726919f07SPatrick Williams- `commit()`: Catch an error thrown by elog(), and commit it to create the event 7826919f07SPatrick Williams log. 7926919f07SPatrick Williams- `report()`: Create an event log from an sdbusplus error without throwing the 800a2c1a23SMatt Spinler exception first. 810a2c1a23SMatt Spinler 8226919f07SPatrick WilliamsAny errors passed into these APIs must be known to phosphor-logging, usually by 8326919f07SPatrick Williamsbeing defined in `<phosphor-logging/elog-errors.hpp>`. The errors must also be 8426919f07SPatrick Williamsknown by sdbusplus, and be defined in their corresponding error.hpp. See below 8526919f07SPatrick Williamsfor details on how get errors into these headers. 860a2c1a23SMatt Spinler 870a2c1a23SMatt SpinlerExample: 8826919f07SPatrick Williams 89*140d496eSJagpal Singh Gill```cpp 900a2c1a23SMatt Spinler#include <phosphor-logging/elog-errors.hpp> 910a2c1a23SMatt Spinler#include <phosphor-logging/elog.hpp> 920a2c1a23SMatt Spinler#include <xyz/openbmc_project/Common/error.hpp> 930a2c1a23SMatt Spinler... 940a2c1a23SMatt Spinlerusing InternalFailure = 950a2c1a23SMatt Spinler sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; 960a2c1a23SMatt Spinler... 970a2c1a23SMatt Spinlerif (somethingBadHappened) 980a2c1a23SMatt Spinler{ 990a2c1a23SMatt Spinler phosphor::logging::report<InternalFailure>(); 1000a2c1a23SMatt Spinler} 1010a2c1a23SMatt Spinler 1020a2c1a23SMatt Spinler``` 10326919f07SPatrick Williams 1040a2c1a23SMatt SpinlerAlternatively, to throw, catch, and then commit the error: 10526919f07SPatrick Williams 106*140d496eSJagpal Singh Gill```cpp 1070a2c1a23SMatt Spinlertry 1080a2c1a23SMatt Spinler{ 1090a2c1a23SMatt Spinler phosphor::logging::elog<InternalFailure>(); 1100a2c1a23SMatt Spinler} 1110a2c1a23SMatt Spinlercatch (InternalFailure& e) 1120a2c1a23SMatt Spinler{ 1130a2c1a23SMatt Spinler phosphor::logging::commit<InternalFailure>(); 1140a2c1a23SMatt Spinler} 1150a2c1a23SMatt Spinler``` 1160a2c1a23SMatt Spinler 1170a2c1a23SMatt SpinlerMetadata can be added to event logs to add debug data captured at the time of 1180a2c1a23SMatt Spinlerthe event. It shows up in the AdditionalData property in the 1190a2c1a23SMatt Spinler`xyz.openbmc_project.Logging.Entry` interface. Metadata is passed in via the 1200a2c1a23SMatt Spinler`elog()` or `report()` functions, which write it to the journal. The metadata 1210a2c1a23SMatt Spinlermust be predefined for the error in the [metadata YAML](#event-log-definition) 12226919f07SPatrick Williamsso that the daemon knows to look for it in the journal when it creates the event 12326919f07SPatrick Williamslog. 1240a2c1a23SMatt Spinler 1250a2c1a23SMatt SpinlerExample: 12626919f07SPatrick Williams 127*140d496eSJagpal Singh Gill```cpp 1280a2c1a23SMatt Spinler#include <phosphor-logging/elog-errors.hpp> 1290a2c1a23SMatt Spinler#include <phosphor-logging/elog.hpp> 1300a2c1a23SMatt Spinler#include <xyz/openbmc_project/Control/Device/error.hpp> 1310a2c1a23SMatt Spinler... 1320a2c1a23SMatt Spinlerusing WriteFailure = 1330a2c1a23SMatt Spinler sdbusplus::xyz::openbmc_project::Control::Device::Error::WriteFailure; 1340a2c1a23SMatt Spinlerusing metadata = 1350a2c1a23SMatt Spinler xyz::openbmc_project::Control::Device::WriteFailure; 1360a2c1a23SMatt Spinler... 1370a2c1a23SMatt Spinlerif (somethingBadHappened) 1380a2c1a23SMatt Spinler{ 1390a2c1a23SMatt Spinler phosphor::logging::report<WriteFailure>(metadata::CALLOUT_ERRNO(5), 1400a2c1a23SMatt Spinler metadata::CALLOUT_DEVICE_PATH("some path")); 1410a2c1a23SMatt Spinler} 1420a2c1a23SMatt Spinler``` 14326919f07SPatrick Williams 1440a2c1a23SMatt SpinlerIn the above example, the AdditionalData property would look like: 14526919f07SPatrick Williams 146*140d496eSJagpal Singh Gill```cpp 1470a2c1a23SMatt Spinler["CALLOUT_ERRNO=5", "CALLOUT_DEVICE_PATH=some path"] 1480a2c1a23SMatt Spinler``` 14926919f07SPatrick Williams 1500a2c1a23SMatt SpinlerNote that the metadata fields must be all uppercase. 1510a2c1a23SMatt Spinler 1520a2c1a23SMatt Spinler##### Event Log Definition 15326919f07SPatrick Williams 1540a2c1a23SMatt SpinlerAs mentioned above, both sdbusplus and phosphor-logging must know about the 1550a2c1a23SMatt Spinlerevent logs in their header files, or the code that uses them will not even 1560a2c1a23SMatt Spinlercompile. The standard way to do this to define the event in the appropriate 1570a2c1a23SMatt Spinler`<error-category>.errors.yaml` file, and define any metadata in the 1580a2c1a23SMatt Spinler`<error-category>.metadata.yaml` file in the appropriate `*-dbus-interfaces` 1590a2c1a23SMatt Spinlerrepository. During the build, phosphor-logging generates the elog-errors.hpp 1600a2c1a23SMatt Spinlerfile for use by the calling code. 1610a2c1a23SMatt Spinler 1620a2c1a23SMatt SpinlerIn much the same way, sdbusplus uses the event log definitions to generate an 1630a2c1a23SMatt Spinlererror.hpp file that contains the specific exception. The path of the error.hpp 1640a2c1a23SMatt Spinlermatches the path of the YAML file. 1650a2c1a23SMatt Spinler 1660a2c1a23SMatt SpinlerFor example, if in phosphor-dbus-interfaces there is 16726919f07SPatrick Williams`xyz/openbmc_project/Control/Device.errors.yaml`, the errors that come from that 16826919f07SPatrick Williamsfile will be in the include: `xyz/openbmc_project/Control/Device/error.hpp`. 1690a2c1a23SMatt Spinler 1700a2c1a23SMatt SpinlerIn rare cases, one may want one to define their errors in the same repository 1710a2c1a23SMatt Spinlerthat uses them. To do that, one must: 1720a2c1a23SMatt Spinler 1730a2c1a23SMatt Spinler1. Add the error and metadata YAML files to the repository. 1740a2c1a23SMatt Spinler2. Run the sdbus++ script within the makefile to create the error.hpp and .cpp 1750a2c1a23SMatt Spinler files from the local YAML, and include the error.cpp file in the application 1760a2c1a23SMatt Spinler that uses it. See [openpower-occ-control] for an example. 1770a2c1a23SMatt Spinler3. Tell phosphor-logging about the error. This is done by either: 17826919f07SPatrick Williams - Following the [directions](#adding-application-specific-error-yaml) defined 17926919f07SPatrick Williams in this README, or 18026919f07SPatrick Williams - Running the script yourself: 18126919f07SPatrick Williams 1. Run phosphor-logging\'s `elog-gen.py` script on the local yaml to generate 18226919f07SPatrick Williams an elog-errors.hpp file that just contains the local errors, and check 18326919f07SPatrick Williams that into the repository and include it where the errors are needed. 1840a2c1a23SMatt Spinler 2. Create a recipe that copies the local YAML files to a place that 18526919f07SPatrick Williams phosphor-logging can find it during the build. See [here][led-link] for an 18626919f07SPatrick Williams example. 1870a2c1a23SMatt Spinler 1880a2c1a23SMatt Spinler#### D-Bus Event Log Creation 18926919f07SPatrick Williams 19072575f51SMatt SpinlerThere is also a [D-Bus method][log-create-link] to create event logs: 19126919f07SPatrick Williams 19226919f07SPatrick Williams- Service: xyz.openbmc_project.Logging 19326919f07SPatrick Williams- Object Path: /xyz/openbmc_project/logging 19426919f07SPatrick Williams- Interface: xyz.openbmc_project.Logging.Create 19526919f07SPatrick Williams- Method: Create 19626919f07SPatrick Williams - Method Arguments: 19726919f07SPatrick Williams - Message: The `Message` string property for the 19872575f51SMatt Spinler `xyz.openbmc_project.Logging.Entry` interface. 19926919f07SPatrick Williams - Severity: The `severity` property for the 20026919f07SPatrick Williams `xyz.openbmc_project.Logging.Entry` interface. An 20126919f07SPatrick Williams `xyz.openbmc_project.Logging.Entry.Level` enum value. 20226919f07SPatrick Williams - AdditionalData: The `AdditionalData` property for the 20326919f07SPatrick Williams `xyz.openbmc_project.Logging.Entry` interface, but in a map instead of in 20426919f07SPatrick Williams a vector of "KEY=VALUE" strings. Example: 20526919f07SPatrick Williams 206*140d496eSJagpal Singh Gill```cpp 20772575f51SMatt Spinler std::map<std::string, std::string> additionalData; 20872575f51SMatt Spinler additionalData["KEY"] = "VALUE"; 20972575f51SMatt Spinler``` 21072575f51SMatt Spinler 21126919f07SPatrick WilliamsUnlike the previous APIs where errors could also act as exceptions that could be 21226919f07SPatrick Williamsthrown across D-Bus, this API does not require that the error be defined in the 21326919f07SPatrick Williamserror YAML in the D-Bus interfaces repository so that sdbusplus knows about it. 21426919f07SPatrick WilliamsAdditionally, as this method passes in everything needed to create the event 21526919f07SPatrick Williamslog, the logging daemon doesn't have to know about it ahead of time either. 21672575f51SMatt Spinler 21772575f51SMatt SpinlerThat being said, it is recommended that users of this API still follow some 21826919f07SPatrick Williamsguidelines for the message field, which is normally generated from a combination 21926919f07SPatrick Williamsof the path to the error YAML file and the error name itself. For example, the 22026919f07SPatrick Williams`Timeout` error in `xyz/openbmc_project/Common.errors.yaml` will have a Message 22126919f07SPatrick Williamsproperty of `xyz.openbmc_project.Common.Error.Timeout`. 22272575f51SMatt Spinler 22372575f51SMatt SpinlerThe guidelines are: 22426919f07SPatrick Williams 22572575f51SMatt Spinler1. When it makes sense, one can still use an existing error that has already 22672575f51SMatt Spinler been defined in an error YAML file, and use the same severity and metadata 22772575f51SMatt Spinler (AdditionalData) as in the corresponding metadata YAML file. 22872575f51SMatt Spinler 22972575f51SMatt Spinler2. If creating a new error, use the same naming scheme as other errors, which 23072575f51SMatt Spinler starts with the domain, `xyz.openbmc_project`, `org.open_power`, etc, 23126919f07SPatrick Williams followed by the capitalized category values, followed by `Error`, followed by 23226919f07SPatrick Williams the capitalized error name itself, with everything separated by "."s. For 23326919f07SPatrick Williams example: `xyz.openbmc_project.Some.Category.Error.Name`. 23472575f51SMatt Spinler 23572575f51SMatt Spinler3. If creating a new common error, still add it to the appropriate error and 23672575f51SMatt Spinler metadata YAML files in the appropriate D-Bus interfaces repository so that 23726919f07SPatrick Williams others can know about it and use it in the future. This can be done after the 23826919f07SPatrick Williams fact. 2390a2c1a23SMatt Spinler 24026919f07SPatrick Williams[xyz.openbmc_project.logging.entry]: 24126919f07SPatrick Williams https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Logging/Entry.interface.yaml 24226919f07SPatrick Williams[xyz.openbmc_project.association.definitions]: 24326919f07SPatrick Williams https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Association/Definitions.interface.yaml 24426919f07SPatrick Williams[associations-doc]: 24526919f07SPatrick Williams https://github.com/openbmc/docs/blob/master/architecture/object-mapper.md#associations 24626919f07SPatrick Williams[callout-doc]: 24726919f07SPatrick Williams https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Common/Callout/README.md 24826919f07SPatrick Williams[xyz.openbmc_project.object.delete]: 24926919f07SPatrick Williams https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Object/Delete.interface.yaml 25026919f07SPatrick Williams[xyz.openbmc_project.software.version]: 25126919f07SPatrick Williams https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Software/Version.errors.yaml 2520a2c1a23SMatt Spinler[openpower-occ-control]: https://github.com/openbmc/openpower-occ-control 25326919f07SPatrick Williams[led-link]: 25426919f07SPatrick Williams https://github.com/openbmc/openbmc/tree/master/meta-phosphor/recipes-phosphor/leds 25526919f07SPatrick Williams[log-create-link]: 25626919f07SPatrick Williams https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/yaml/xyz/openbmc_project/Logging/Create.interface.yaml 2570febd26bSDeepak Kodihalli 2589067c077SDeepak Kodihalli## Adding application specific error YAML 25926919f07SPatrick Williams 26026919f07SPatrick Williams- This document captures steps for adding application specific error YAML files 2614e5f521aSMarri Devender Rao and generating local elog-errors.hpp header file for application use. 26226919f07SPatrick Williams- Should cater for continuous integration (CI) build, bitbake image build, and 2634e5f521aSMarri Devender Rao local repository build. 2647aafb12eSNagaraju Goruganti 265*140d496eSJagpal Singh Gill### Continuous Integration (CI) build 26626919f07SPatrick Williams 26726919f07SPatrick Williams- Make is called on the repository that is modified. 26826919f07SPatrick Williams- Dependent packages are pulled based on the dependency list specified in the 2694e5f521aSMarri Devender Rao configure.ac script. 2707aafb12eSNagaraju Goruganti 2719067c077SDeepak Kodihalli#### Recipe build 27226919f07SPatrick Williams 27326919f07SPatrick Williams- Native recipes copy error YAML files to shared location. 27426919f07SPatrick Williams- phosphor-logging builds elog-errors.hpp by parsing the error YAML files from 2754e5f521aSMarri Devender Rao the shared location. 2767aafb12eSNagaraju Goruganti 2779067c077SDeepak Kodihalli#### Local repository build 27826919f07SPatrick Williams 27926919f07SPatrick Williams- Copies local error YAML files to the shared location in SDK 28026919f07SPatrick Williams- Make generates elog-errors.hpp by parsing the error YAML files from the shared 28126919f07SPatrick Williams location. 2827aafb12eSNagaraju Goruganti 2839067c077SDeepak Kodihalli#### Makefile changes 28426919f07SPatrick Williams 285*140d496eSJagpal Singh Gill[Reference](https://github.com/openbmc/openpower-debug-collector/blob/master/Makefile.am) 28626919f07SPatrick Williams 287*140d496eSJagpal Singh Gill##### Export error YAML to shared location 2889067c077SDeepak Kodihalli 289*140d496eSJagpal Singh Gill##### Modify Makefile.am to export newly added error YAML to shared location 29026919f07SPatrick Williams 291*140d496eSJagpal Singh Gill```make 2924e5f521aSMarri Devender Raoyamldir = ${datadir}/phosphor-dbus-yaml/yaml 2934e5f521aSMarri Devender Raonobase_yaml_DATA = \ 2944e5f521aSMarri Devender Rao org/open_power/Host.errors.yaml 2954e5f521aSMarri Devender Rao``` 2969067c077SDeepak Kodihalli 2979067c077SDeepak Kodihalli###### Generate elog-errors.hpp using elog parser from SDK location 29826919f07SPatrick Williams 29926919f07SPatrick Williams- Add a conditional check "GEN_ERRORS" 30026919f07SPatrick Williams- Disable the check for recipe bitbake image build 30126919f07SPatrick Williams- Enable it for local repository build 30226919f07SPatrick Williams- If "GEN_ERRORS" is enabled, build generates elog-errors.hpp header file. 30326919f07SPatrick Williams 304*140d496eSJagpal Singh Gill```make 3054e5f521aSMarri Devender Rao # Generate phosphor-logging/elog-errors.hpp 3064e5f521aSMarri Devender Rao if GEN_ERRORS 3074e5f521aSMarri Devender Rao ELOG_MAKO ?= elog-gen-template.mako.hpp 3084e5f521aSMarri Devender Rao ELOG_DIR ?= ${OECORE_NATIVE_SYSROOT}${datadir}/phosphor-logging/elog 3094e5f521aSMarri Devender Rao ELOG_GEN_DIR ?= ${ELOG_DIR}/tools/ 3104e5f521aSMarri Devender Rao ELOG_MAKO_DIR ?= ${ELOG_DIR}/tools/phosphor-logging/templates/ 3114e5f521aSMarri Devender Rao YAML_DIR ?= ${OECORE_NATIVE_SYSROOT}${datadir}/phosphor-dbus-yaml/yaml 3124e5f521aSMarri Devender Rao phosphor-logging/elog-errors.hpp: 3134e5f521aSMarri Devender Rao @mkdir -p ${YAML_DIR}/org/open_power/ 3144e5f521aSMarri Devender Rao @cp ${top_srcdir}/org/open_power/Host.errors.yaml \ 3154e5f521aSMarri Devender Rao ${YAML_DIR}/org/open_power/Host.errors.yaml 3164e5f521aSMarri Devender Rao @mkdir -p `dirname $@` 3174e5f521aSMarri Devender Rao @chmod 777 $(ELOG_GEN_DIR)/elog-gen.py 3184e5f521aSMarri Devender Rao $(AM_V_at)$(PYTHON) $(ELOG_GEN_DIR)/elog-gen.py -y ${YAML_DIR} \ 3194e5f521aSMarri Devender Rao -t ${ELOG_MAKO_DIR} -m ${ELOG_MAKO} -o $@ 3204e5f521aSMarri Devender Rao endif 3214e5f521aSMarri Devender Rao``` 3227aafb12eSNagaraju Goruganti 3239067c077SDeepak Kodihalli###### Update BUILT_SOURCES 32426919f07SPatrick Williams 32526919f07SPatrick Williams- Append elog-errors.hpp to BUILT_SOURCES list and put it in conditional check 3264e5f521aSMarri Devender Rao GEN_ERRORS so that the elog-errors.hpp is generated only during local 3274e5f521aSMarri Devender Rao repository build. 32826919f07SPatrick Williams 329*140d496eSJagpal Singh Gill```make 3304e5f521aSMarri Devender Rao if GEN_ERRORS 3314e5f521aSMarri Devender Rao nobase_nodist_include_HEADERS += \ 3324e5f521aSMarri Devender Rao phosphor-logging/elog-errors.hpp 3334e5f521aSMarri Devender Rao endif 3344e5f521aSMarri Devender Rao if GEN_ERRORS 3354e5f521aSMarri Devender Rao BUILT_SOURCES += phosphor-logging/elog-errors.hpp 3364e5f521aSMarri Devender Rao endif 3374e5f521aSMarri Devender Rao``` 3389067c077SDeepak Kodihalli 3399067c077SDeepak Kodihalli###### Conditional check for native build 34026919f07SPatrick Williams 34126919f07SPatrick Williams- As the same Makefile is used both for recipe image build and native recipe 3424e5f521aSMarri Devender Rao build, add a conditional to ensure that only installation of error yaml files 3434e5f521aSMarri Devender Rao happens during native build. It is not required to build repository during 3444e5f521aSMarri Devender Rao native build. 34526919f07SPatrick Williams 346*140d496eSJagpal Singh Gill```make 3474e5f521aSMarri Devender Rao if !INSTALL_ERROR_YAML 3484e5f521aSMarri Devender Rao endif 3494e5f521aSMarri Devender Rao``` 3509067c077SDeepak Kodihalli 3519067c077SDeepak Kodihalli#### Autotools changes 35226919f07SPatrick Williams 353*140d496eSJagpal Singh Gill[Reference](https://github.com/openbmc/openpower-debug-collector/blob/master/configure.ac) 35426919f07SPatrick Williams 355*140d496eSJagpal Singh Gill##### Add option(argument) to enable/disable installing error yaml file 3564e5f521aSMarri Devender Rao 35726919f07SPatrick Williams- Install error yaml option(argument) is enabled for native recipe build and 35826919f07SPatrick Williams disabled for bitbake build. 35926919f07SPatrick Williams 36026919f07SPatrick Williams- When install error yaml option is disabled do not check for target specific 3614e5f521aSMarri Devender Rao packages in autotools configure script. 3624e5f521aSMarri Devender Rao 3639067c077SDeepak Kodihalli###### Add option(argument) to install error yaml files 36426919f07SPatrick Williams 365*140d496eSJagpal Singh Gill```autoconf 3664e5f521aSMarri Devender RaoAC_ARG_ENABLE([install_error_yaml], 3674e5f521aSMarri Devender Rao AS_HELP_STRING([--enable-install_error_yaml], 3684e5f521aSMarri Devender Rao [Enable installing error yaml file]),[], [install_error_yaml=no]) 3694e5f521aSMarri Devender RaoAM_CONDITIONAL([INSTALL_ERROR_YAML], 3704e5f521aSMarri Devender Rao [test "x$enable_install_error_yaml" = "xyes"]) 3714e5f521aSMarri Devender RaoAS_IF([test "x$enable_install_error_yaml" != "xyes"], [ 3724e5f521aSMarri Devender Rao.. 3734e5f521aSMarri Devender Rao.. 3744e5f521aSMarri Devender Rao]) 3754e5f521aSMarri Devender Rao``` 3769067c077SDeepak Kodihalli 3779067c077SDeepak Kodihalli###### Add option(argument) to enable/disable generating elog-errors header file 37826919f07SPatrick Williams 379*140d496eSJagpal Singh Gill```autoconf 3804e5f521aSMarri Devender RaoAC_ARG_ENABLE([gen_errors], 3814e5f521aSMarri Devender Rao AS_HELP_STRING([--enable-gen_errors], [Enable elog-errors.hpp generation ]), 3824e5f521aSMarri Devender Rao [],[gen_errors=yes]) 3834e5f521aSMarri Devender RaoAM_CONDITIONAL([GEN_ERRORS], [test "x$enable_gen_errors" != "xno"]) 3844e5f521aSMarri Devender Rao``` 3854e5f521aSMarri Devender Rao 3869067c077SDeepak Kodihalli#### Recipe changes 38726919f07SPatrick Williams 388*140d496eSJagpal Singh Gill[Reference](https://github.com/openbmc/openbmc/blob/master/meta-openbmc-machines/meta-openpower/common/recipes-phosphor/debug/openpower-debug-collector.bb) 38926919f07SPatrick Williams 390*140d496eSJagpal Singh Gill##### Extend recipe for native and nativesdk 39126919f07SPatrick Williams 39226919f07SPatrick Williams- Extend the recipe for native and native SDK builds 39326919f07SPatrick Williams 394*140d496eSJagpal Singh Gill```BitBake 3954e5f521aSMarri Devender RaoBBCLASSEXTEND += "native nativesdk" 3964e5f521aSMarri Devender Rao``` 39726919f07SPatrick Williams 3989067c077SDeepak Kodihalli###### Remove dependencies for native and native SDK build 39926919f07SPatrick Williams 40026919f07SPatrick Williams- Native recipe caters only for copying error yaml files to shared location. 40126919f07SPatrick Williams- For native and native SDK build remove dependency on packages that recipe 4024e5f521aSMarri Devender Rao build depends 4034e5f521aSMarri Devender Rao 4049067c077SDeepak Kodihalli###### Remove dependency on phosphor-logging for native build 40526919f07SPatrick Williams 406*140d496eSJagpal Singh Gill```BitBake 4074e5f521aSMarri Devender RaoDEPENDS_remove_class-native = "phosphor-logging" 4084e5f521aSMarri Devender Rao``` 4099067c077SDeepak Kodihalli 4109067c077SDeepak Kodihalli###### Remove dependency on phosphor-logging for native SDK build 41126919f07SPatrick Williams 412*140d496eSJagpal Singh Gill```BitBake 4134e5f521aSMarri Devender RaoDEPENDS_remove_class-nativesdk = "phosphor-logging" 4144e5f521aSMarri Devender Rao``` 4159067c077SDeepak Kodihalli 4169067c077SDeepak Kodihalli###### Add install_error_yaml argument during native build 41726919f07SPatrick Williams 41826919f07SPatrick Williams- Add package config to enable/disable install_error_yaml feature. 4199067c077SDeepak Kodihalli 4209067c077SDeepak Kodihalli###### Add package config to enable/disable install_error_yaml feature 42126919f07SPatrick Williams 422*140d496eSJagpal Singh Gill```BitBake 4234e5f521aSMarri Devender RaoPACKAGECONFIG ??= "install_error_yaml" 4244e5f521aSMarri Devender RaoPACKAGECONFIG[install_error_yaml] = " \ 4254e5f521aSMarri Devender Rao --enable-install_error_yaml, \ 4264e5f521aSMarri Devender Rao --disable-install_error_yaml, ,\ 4274e5f521aSMarri Devender Rao " 4284e5f521aSMarri Devender Rao``` 42926919f07SPatrick Williams 4309067c077SDeepak Kodihalli###### Enable install_error_yaml check for native build 43126919f07SPatrick Williams 432*140d496eSJagpal Singh Gill```BitBake 4334e5f521aSMarri Devender RaoPACKAGECONFIG_add_class-native = "install_error_yaml" 4344e5f521aSMarri Devender RaoPACKAGECONFIG_add_class-nativesdk = "install_error_yaml" 4354e5f521aSMarri Devender Rao``` 43626919f07SPatrick Williams 4379067c077SDeepak Kodihalli###### Disable install_error_yaml during target build 43826919f07SPatrick Williams 439*140d496eSJagpal Singh Gill```BitBake 4404e5f521aSMarri Devender RaoPACKAGECONFIG_remove_class-target = "install_error_yaml" 4414e5f521aSMarri Devender Rao``` 4424e5f521aSMarri Devender Rao 4439067c077SDeepak Kodihalli###### Disable generating elog-errors.hpp for bitbake build 44426919f07SPatrick Williams 44526919f07SPatrick Williams- Disable gen_errors argument for bitbake image build as the application uses 4464e5f521aSMarri Devender Rao the elog-errors.hpp generated by phosphor-logging 44726919f07SPatrick Williams- Argument is enabled by default for local repository build in the configure 4484e5f521aSMarri Devender Rao script of the local repository. 44926919f07SPatrick Williams 450*140d496eSJagpal Singh Gill```BitBake 4514e5f521aSMarri Devender Rao XTRA_OECONF += "--disable-gen_errors" 4524e5f521aSMarri Devender Rao``` 4534e5f521aSMarri Devender Rao 4549067c077SDeepak Kodihalli#### Local build 45526919f07SPatrick Williams 45626919f07SPatrick Williams- During local build use --prefix=/usr for the configure script. 4574e5f521aSMarri Devender Rao 458*140d496eSJagpal Singh Gill[Reference](https://github.com/openbmc/openpower-debug-collector/blob/master/README.md) 4593210a9f3SMatt Spinler 46099c2b405SMatt Spinler## Event Log Extensions 46199c2b405SMatt Spinler 46226919f07SPatrick WilliamsThe extension concept is a way to allow code that creates other formats of error 46326919f07SPatrick Williamslogs besides phosphor-logging's event logs to still reside in the 46499c2b405SMatt Spinlerphosphor-log-manager application. 46599c2b405SMatt Spinler 46626919f07SPatrick WilliamsThe extension code lives in the `extensions/<extension>` subdirectories, and is 46726919f07SPatrick Williamsenabled with a `--enable-<extension>` configure flag. The extension code won't 46826919f07SPatrick Williamscompile unless enabled with this flag. 46999c2b405SMatt Spinler 47099c2b405SMatt SpinlerExtensions can register themselves to have functions called at the following 47199c2b405SMatt Spinlerpoints using the REGISTER_EXTENSION_FUNCTION macro. 47226919f07SPatrick Williams 47326919f07SPatrick Williams- On startup 47426919f07SPatrick Williams - Function type void(internal::Manager&) 47526919f07SPatrick Williams- After an event log is created 47626919f07SPatrick Williams - Function type void(args) 47726919f07SPatrick Williams - The args are: 47826919f07SPatrick Williams - const std::string& - The Message property 47926919f07SPatrick Williams - uin32_t - The event log ID 48026919f07SPatrick Williams - uint64_t - The event log timestamp 48126919f07SPatrick Williams - Level - The event level 48226919f07SPatrick Williams - const AdditionalDataArg& - the additional data 48326919f07SPatrick Williams - const AssociationEndpointsArg& - Association endpoints (callouts) 48426919f07SPatrick Williams- Before an event log is deleted, to check if it is allowed. 48526919f07SPatrick Williams - Function type void(std::uint32_t, bool&) that takes the event ID 48626919f07SPatrick Williams- After an event log is deleted 48726919f07SPatrick Williams - Function type void(std::uint32_t) that takes the event ID 48899c2b405SMatt Spinler 48999c2b405SMatt SpinlerUsing these callback points, they can create their own event log for each 49099c2b405SMatt SpinlerOpenBMC event log that is created, and delete these logs when the corresponding 49199c2b405SMatt SpinlerOpenBMC event log is deleted. 49299c2b405SMatt Spinler 49326919f07SPatrick WilliamsIn addition, an extension has the option of disabling phosphor-logging's default 49426919f07SPatrick Williamserror log capping policy so that it can use its own. The macro 49599c2b405SMatt SpinlerDISABLE_LOG_ENTRY_CAPS() is used for that. 49699c2b405SMatt Spinler 49799c2b405SMatt Spinler### Motivation 49899c2b405SMatt Spinler 49999c2b405SMatt SpinlerThe reason for adding support for extensions inside the phosphor-log-manager 50099c2b405SMatt Spinlerdaemon as opposed to just creating new daemons that listen for D-Bus signals is 50199c2b405SMatt Spinlerto allow interactions that would be complicated or expensive if just done over 50299c2b405SMatt SpinlerD-Bus, such as: 50326919f07SPatrick Williams 50426919f07SPatrick Williams- Allowing for custom old log retention algorithms. 50526919f07SPatrick Williams- Prohibiting manual deleting of certain logs based on an extension's 50699c2b405SMatt Spinler requirements. 50799c2b405SMatt Spinler 50899c2b405SMatt Spinler### Creating extensions 50999c2b405SMatt Spinler 51099c2b405SMatt Spinler1. Add a new flag to configure.ac to enable the extension: 51126919f07SPatrick Williams 512*140d496eSJagpal Singh Gill ```autoconf 51399c2b405SMatt Spinler AC_ARG_ENABLE([foo-extension], 51499c2b405SMatt Spinler AS_HELP_STRING([--enable-foo-extension], 51599c2b405SMatt Spinler [Create Foo logs])) 51699c2b405SMatt Spinler AM_CONDITIONAL([ENABLE_FOO_EXTENSION], 51799c2b405SMatt Spinler [test "x$enable_foo_extension" == "xyes"]) 51899c2b405SMatt Spinler ``` 51926919f07SPatrick Williams 52099c2b405SMatt Spinler2. Add the code in `extensions/<extension>/`. 52199c2b405SMatt Spinler3. Create a makefile include to add the new code to phosphor-log-manager: 52226919f07SPatrick Williams 523*140d496eSJagpal Singh Gill ```make 52499c2b405SMatt Spinler phosphor_log_manager_SOURCES += \ 52599c2b405SMatt Spinler extensions/foo/foo.cpp 52699c2b405SMatt Spinler ``` 52726919f07SPatrick Williams 5285cabd090SAndrew Geissler4. In `extensions/extensions.mk`, add the makefile include: 52926919f07SPatrick Williams 530*140d496eSJagpal Singh Gill ```make 53199c2b405SMatt Spinler if ENABLE_FOO_EXTENSION 53299c2b405SMatt Spinler include extensions/foo/foo.mk 53399c2b405SMatt Spinler endif 53499c2b405SMatt Spinler ``` 53526919f07SPatrick Williams 5365cabd090SAndrew Geissler5. In the extension code, register the functions to call and optionally disable 53799c2b405SMatt Spinler log capping using the provided macros: 53826919f07SPatrick Williams 539*140d496eSJagpal Singh Gill ```cpp 54099c2b405SMatt Spinler DISABLE_LOG_ENTRY_CAPS(); 54199c2b405SMatt Spinler 54299c2b405SMatt Spinler void fooStartup(internal::Manager& manager) 54399c2b405SMatt Spinler { 54499c2b405SMatt Spinler // Initialize 54599c2b405SMatt Spinler } 54699c2b405SMatt Spinler 54799c2b405SMatt Spinler REGISTER_EXTENSION_FUNCTION(fooStartup); 54899c2b405SMatt Spinler 54999c2b405SMatt Spinler void fooCreate(const std::string& message, uint32_t id, uint64_t timestamp, 55099c2b405SMatt Spinler Entry::Level severity, const AdditionalDataArg& additionalData, 55199c2b405SMatt Spinler const AssociationEndpointsArg& assocs) 55299c2b405SMatt Spinler { 55399c2b405SMatt Spinler // Create a different type of error log based on 'entry'. 55499c2b405SMatt Spinler } 55599c2b405SMatt Spinler 55699c2b405SMatt Spinler REGISTER_EXTENSION_FUNCTION(fooCreate); 55799c2b405SMatt Spinler 55899c2b405SMatt Spinler void fooRemove(uint32_t id) 55999c2b405SMatt Spinler { 56099c2b405SMatt Spinler // Delete the extension error log that corresponds to 'id'. 56199c2b405SMatt Spinler } 56299c2b405SMatt Spinler 56399c2b405SMatt Spinler REGISTER_EXTENSION_FUNCTION(fooRemove); 56499c2b405SMatt Spinler ``` 56526919f07SPatrick Williams 5663210a9f3SMatt Spinler### Extension List 56799c2b405SMatt Spinler 5683210a9f3SMatt SpinlerThe supported extensions are: 5693210a9f3SMatt Spinler 57026919f07SPatrick Williams- OpenPower PELs 57126919f07SPatrick Williams - Enabled with --enable-openpower-pel-extension 57226919f07SPatrick Williams - Detailed information can be found 5733210a9f3SMatt Spinler [here](extensions/openpower-pels/README.md) 5740649b985SAndrew Geissler 57524eb160fSJeremy Kerr## Remote Logging via Rsyslog 57624eb160fSJeremy Kerr 57726919f07SPatrick WilliamsThe BMC has the ability to stream out local logs (that go to the systemd 578*140d496eSJagpal Singh Gilljournal) via rsyslog (<https://www.rsyslog.com/>). 57926919f07SPatrick Williams 58026919f07SPatrick WilliamsThe BMC will send everything. Any kind of filtering and appropriate storage will 58126919f07SPatrick Williamshave to be managed on the rsyslog server. Various examples are available on the 58226919f07SPatrick Williamsinternet. Here are few pointers : 583*140d496eSJagpal Singh Gill<https://www.rsyslog.com/storing-and-forwarding-remote-messages/> 584*140d496eSJagpal Singh Gill<https://www.rsyslog.com/doc/rsyslog%255Fconf%255Ffilter.html> 585*140d496eSJagpal Singh Gill<https://www.thegeekdiary.com/understanding-rsyslog-filter-options/> 58624eb160fSJeremy Kerr 587*140d496eSJagpal Singh Gill### Configuring rsyslog server for remote logging 58826919f07SPatrick Williams 58924eb160fSJeremy KerrThe BMC is an rsyslog client. To stream out logs, it needs to talk to an rsyslog 59024eb160fSJeremy Kerrserver, to which there's connectivity over a network. REST API can be used to 59124eb160fSJeremy Kerrset the remote server's IP address and port number. 59224eb160fSJeremy Kerr 59324eb160fSJeremy KerrThe following presumes a user has logged on to the BMC (see 594*140d496eSJagpal Singh Gill<https://github.com/openbmc/docs/blob/master/rest-api.md>). 59524eb160fSJeremy Kerr 59624eb160fSJeremy KerrSet the IP: 59726919f07SPatrick Williams 598*140d496eSJagpal Singh Gill```sh 59924eb160fSJeremy Kerrcurl -b cjar -k -H "Content-Type: application/json" -X PUT \ 60024eb160fSJeremy Kerr -d '{"data": <IP address>}' \ 60124eb160fSJeremy Kerr https://<BMC IP address>/xyz/openbmc_project/logging/config/remote/attr/Address 60224eb160fSJeremy Kerr``` 60324eb160fSJeremy Kerr 60424eb160fSJeremy KerrSet the port: 60526919f07SPatrick Williams 606*140d496eSJagpal Singh Gill```sh 60724eb160fSJeremy Kerrcurl -b cjar -k -H "Content-Type: application/json" -X PUT \ 60824eb160fSJeremy Kerr -d '{"data": <port number>}' \ 60924eb160fSJeremy Kerr https://<BMC IP address>/xyz/openbmc_project/logging/config/remote/attr/Port 61024eb160fSJeremy Kerr``` 61124eb160fSJeremy Kerr 61224eb160fSJeremy Kerr#### Querying the current configuration 61326919f07SPatrick Williams 614*140d496eSJagpal Singh Gill```sh 61524eb160fSJeremy Kerrcurl -b cjar -k \ 61624eb160fSJeremy Kerr https://<BMC IP address>/xyz/openbmc_project/logging/config/remote 61724eb160fSJeremy Kerr``` 61824eb160fSJeremy Kerr 61924eb160fSJeremy Kerr#### Setting the hostname 62026919f07SPatrick Williams 62124eb160fSJeremy KerrRsyslog can store logs separately for each host. For this reason, it's useful to 62224eb160fSJeremy Kerrprovide a unique hostname to each managed BMC. Here's how that can be done via a 62324eb160fSJeremy KerrREST API : 62426919f07SPatrick Williams 625*140d496eSJagpal Singh Gill```sh 62624eb160fSJeremy Kerrcurl -b cjar -k -H "Content-Type: application/json" -X PUT \ 62724eb160fSJeremy Kerr -d '{"data": "myHostName"}' \ 62824eb160fSJeremy Kerr https://<BMC IP address>//xyz/openbmc_project/network/config/attr/HostName 62924eb160fSJeremy Kerr``` 63024eb160fSJeremy Kerr 63124eb160fSJeremy Kerr#### Disabling remote logging 63226919f07SPatrick Williams 63324eb160fSJeremy KerrRemote logging can be disabled by writing 0 to the port, or an empty string("") 63424eb160fSJeremy Kerrto the IP. 63524eb160fSJeremy Kerr 63624eb160fSJeremy Kerr#### Changing the rsyslog server 63726919f07SPatrick Williams 63824eb160fSJeremy KerrWhen switching to a new server from an existing one (i.e the address, or port, 63924eb160fSJeremy Kerror both change), it is recommended to disable the existing configuration first. 64024eb160fSJeremy Kerr 6410649b985SAndrew Geissler## Boot Fail on Hardware Errors 6420649b985SAndrew Geissler 64326919f07SPatrick Williamsphosphor-logging supports a setting, which when set, will result in the software 64426919f07SPatrick Williamslooking at new phosphor-logging entries being created, and if a CALLOUT\* is 64526919f07SPatrick Williamsfound within the entry, ensuring the system will not power on. Entries with 64626919f07SPatrick Williamsseverities of Informational or Debug will not block boots, even if they have 64726919f07SPatrick Williamscallouts. 6480649b985SAndrew Geissler 6490649b985SAndrew GeisslerThe full design for this can be found 6500649b985SAndrew Geissler[here](https://github.com/openbmc/docs/blob/master/designs/fail-boot-on-hw-error.md) 6510649b985SAndrew Geissler 6520649b985SAndrew GeisslerTo enable this function: 6530649b985SAndrew Geissler 654*140d496eSJagpal Singh Gill```sh 6550649b985SAndrew Geisslerbusctl set-property xyz.openbmc_project.Settings /xyz/openbmc_project/logging/settings xyz.openbmc_project.Logging.Settings QuiesceOnHwError b true 6560649b985SAndrew Geissler``` 6570649b985SAndrew Geissler 6580649b985SAndrew GeisslerTo check if an entry is blocking the boot: 65926919f07SPatrick Williams 660*140d496eSJagpal Singh Gill```sh 6610649b985SAndrew Geisslerobmcutil listbootblock 6620649b985SAndrew Geissler``` 6630649b985SAndrew Geissler 6640649b985SAndrew GeisslerResolve or clear the corresponding entry to allow the system to boot. 665