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) 70a2c1a23SMatt Spinler* [Event Logs](#event-logs) 8c41693c6SMatt Spinler* [Application Specific Error YAML](#adding-application-specific-error-yaml) 9c41693c6SMatt Spinler* [Event Log Extensions](#event-log-extensions) 1024eb160fSJeremy Kerr* [Remote Logging](#remote-logging-via-rsyslog) 110649b985SAndrew Geissler* [Boot Fail on Hardware Errors](#boot-fail-on-hardware-errors) 127aafb12eSNagaraju Goruganti 137aafb12eSNagaraju Goruganti## To Build 147aafb12eSNagaraju GorugantiTo build this package, do the following steps: 157aafb12eSNagaraju Goruganti 16*7bc39084SPatrick Williams1. meson builddir 17*7bc39084SPatrick Williams2. ninja -c builddir 189067c077SDeepak Kodihalli 190a2c1a23SMatt Spinler## Event Logs 200a2c1a23SMatt SpinlerOpenBMC event logs are a collection of D-Bus interfaces owned by 210a2c1a23SMatt Spinlerphosphor-log-manager that reside at `/xyz/openbmc_project/logging/entry/X`, 220a2c1a23SMatt Spinlerwhere X starts at 1 and is incremented for each new log. 230a2c1a23SMatt Spinler 240a2c1a23SMatt SpinlerThe interfaces are: 250a2c1a23SMatt Spinler* [xyz.openbmc_project.Logging.Entry] 260a2c1a23SMatt Spinler * The main event log interface. 2727d82814SJohn Wang* [xyz.openbmc_project.Association.Definitions] 280a2c1a23SMatt Spinler * Used for specifying inventory items as the cause of the event. 290a2c1a23SMatt Spinler * For more information on associations, see [here][associations-doc]. 300a2c1a23SMatt Spinler* [xyz.openbmc_project.Object.Delete] 310a2c1a23SMatt Spinler * Provides a Delete method to delete the event. 320a2c1a23SMatt Spinler* [xyz.openbmc_project.Software.Version] 330a2c1a23SMatt Spinler * Stores the code version that the error occurred on. 340a2c1a23SMatt Spinler 350a2c1a23SMatt SpinlerOn platforms that make use of these event logs, the intent is that they are 360a2c1a23SMatt Spinlerthe common event log representation that other types of event logs can be 370a2c1a23SMatt Spinlercreated from. For example, there is code to convert these into both Redfish 380a2c1a23SMatt Spinlerand IPMI event logs, in addition to the event log extensions mentioned 390a2c1a23SMatt Spinler[below](#event-log-extensions). 400a2c1a23SMatt Spinler 410a2c1a23SMatt SpinlerThe logging daemon has the ability to add `callout` associations to an event 420a2c1a23SMatt Spinlerlog based on text in the AdditionalData property. A callout is a link to the 430a2c1a23SMatt Spinlerinventory item(s) that were the cause of the event log. See [here][callout-doc] 440a2c1a23SMatt Spinlerfor details. 450a2c1a23SMatt Spinler 460a2c1a23SMatt Spinler### Creating Event Logs In Code 470a2c1a23SMatt SpinlerThere are two approaches to creating event logs in OpenBMC code. The first 480a2c1a23SMatt Spinlermakes use of the systemd journal to store metadata needed for the log, and the 490a2c1a23SMatt Spinlersecond is a plain D-Bus method call. 500a2c1a23SMatt Spinler 510a2c1a23SMatt Spinler#### Journal Based Event Log Creation 520a2c1a23SMatt SpinlerEvent logs can be created by using phosphor-logging APIs to commit sdbusplus 530a2c1a23SMatt Spinlerexceptions. These APIs write to the journal, and then call a `Commit` 540a2c1a23SMatt SpinlerD-Bus method on the logging daemon to create the event log using the information 550a2c1a23SMatt Spinlerit put in the journal. 560a2c1a23SMatt Spinler 570a2c1a23SMatt SpinlerThe APIs are found in `<phosphor-logging/elog.hpp>`: 580a2c1a23SMatt Spinler* `elog()`: Throw an sdbusplus error. 590a2c1a23SMatt Spinler* `commit()`: Catch an error thrown by elog(), and commit it to create the 600a2c1a23SMatt Spinler event log. 610a2c1a23SMatt Spinler* `report()`: Create an event log from an sdbusplus error without throwing the 620a2c1a23SMatt Spinler exception first. 630a2c1a23SMatt Spinler 640a2c1a23SMatt SpinlerAny errors passed into these APIs must be known to phosphor-logging, usually 650a2c1a23SMatt Spinlerby being defined in `<phosphor-logging/elog-errors.hpp>`. The errors must 660a2c1a23SMatt Spinleralso be known by sdbusplus, and be defined in their corresponding error.hpp. 670a2c1a23SMatt SpinlerSee below for details on how get errors into these headers. 680a2c1a23SMatt Spinler 690a2c1a23SMatt SpinlerExample: 700a2c1a23SMatt Spinler``` 710a2c1a23SMatt Spinler#include <phosphor-logging/elog-errors.hpp> 720a2c1a23SMatt Spinler#include <phosphor-logging/elog.hpp> 730a2c1a23SMatt Spinler#include <xyz/openbmc_project/Common/error.hpp> 740a2c1a23SMatt Spinler... 750a2c1a23SMatt Spinlerusing InternalFailure = 760a2c1a23SMatt Spinler sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure; 770a2c1a23SMatt Spinler... 780a2c1a23SMatt Spinlerif (somethingBadHappened) 790a2c1a23SMatt Spinler{ 800a2c1a23SMatt Spinler phosphor::logging::report<InternalFailure>(); 810a2c1a23SMatt Spinler} 820a2c1a23SMatt Spinler 830a2c1a23SMatt Spinler``` 840a2c1a23SMatt SpinlerAlternatively, to throw, catch, and then commit the error: 850a2c1a23SMatt Spinler``` 860a2c1a23SMatt Spinlertry 870a2c1a23SMatt Spinler{ 880a2c1a23SMatt Spinler phosphor::logging::elog<InternalFailure>(); 890a2c1a23SMatt Spinler} 900a2c1a23SMatt Spinlercatch (InternalFailure& e) 910a2c1a23SMatt Spinler{ 920a2c1a23SMatt Spinler phosphor::logging::commit<InternalFailure>(); 930a2c1a23SMatt Spinler} 940a2c1a23SMatt Spinler``` 950a2c1a23SMatt Spinler 960a2c1a23SMatt SpinlerMetadata can be added to event logs to add debug data captured at the time of 970a2c1a23SMatt Spinlerthe event. It shows up in the AdditionalData property in the 980a2c1a23SMatt Spinler`xyz.openbmc_project.Logging.Entry` interface. Metadata is passed in via the 990a2c1a23SMatt Spinler`elog()` or `report()` functions, which write it to the journal. The metadata 1000a2c1a23SMatt Spinlermust be predefined for the error in the [metadata YAML](#event-log-definition) 1010a2c1a23SMatt Spinlerso that the daemon knows to look for it in the journal when it creates the 1020a2c1a23SMatt Spinlerevent log. 1030a2c1a23SMatt Spinler 1040a2c1a23SMatt SpinlerExample: 1050a2c1a23SMatt Spinler``` 1060a2c1a23SMatt Spinler#include <phosphor-logging/elog-errors.hpp> 1070a2c1a23SMatt Spinler#include <phosphor-logging/elog.hpp> 1080a2c1a23SMatt Spinler#include <xyz/openbmc_project/Control/Device/error.hpp> 1090a2c1a23SMatt Spinler... 1100a2c1a23SMatt Spinlerusing WriteFailure = 1110a2c1a23SMatt Spinler sdbusplus::xyz::openbmc_project::Control::Device::Error::WriteFailure; 1120a2c1a23SMatt Spinlerusing metadata = 1130a2c1a23SMatt Spinler xyz::openbmc_project::Control::Device::WriteFailure; 1140a2c1a23SMatt Spinler... 1150a2c1a23SMatt Spinlerif (somethingBadHappened) 1160a2c1a23SMatt Spinler{ 1170a2c1a23SMatt Spinler phosphor::logging::report<WriteFailure>(metadata::CALLOUT_ERRNO(5), 1180a2c1a23SMatt Spinler metadata::CALLOUT_DEVICE_PATH("some path")); 1190a2c1a23SMatt Spinler} 1200a2c1a23SMatt Spinler``` 1210a2c1a23SMatt SpinlerIn the above example, the AdditionalData property would look like: 1220a2c1a23SMatt Spinler``` 1230a2c1a23SMatt Spinler["CALLOUT_ERRNO=5", "CALLOUT_DEVICE_PATH=some path"] 1240a2c1a23SMatt Spinler``` 1250a2c1a23SMatt SpinlerNote that the metadata fields must be all uppercase. 1260a2c1a23SMatt Spinler 1270a2c1a23SMatt Spinler##### Event Log Definition 1280a2c1a23SMatt SpinlerAs mentioned above, both sdbusplus and phosphor-logging must know about the 1290a2c1a23SMatt Spinlerevent logs in their header files, or the code that uses them will not even 1300a2c1a23SMatt Spinlercompile. The standard way to do this to define the event in the appropriate 1310a2c1a23SMatt Spinler`<error-category>.errors.yaml` file, and define any metadata in the 1320a2c1a23SMatt Spinler`<error-category>.metadata.yaml` file in the appropriate `*-dbus-interfaces` 1330a2c1a23SMatt Spinlerrepository. During the build, phosphor-logging generates the elog-errors.hpp 1340a2c1a23SMatt Spinlerfile for use by the calling code. 1350a2c1a23SMatt Spinler 1360a2c1a23SMatt SpinlerIn much the same way, sdbusplus uses the event log definitions to generate an 1370a2c1a23SMatt Spinlererror.hpp file that contains the specific exception. The path of the error.hpp 1380a2c1a23SMatt Spinlermatches the path of the YAML file. 1390a2c1a23SMatt Spinler 1400a2c1a23SMatt SpinlerFor example, if in phosphor-dbus-interfaces there is 1410a2c1a23SMatt Spinler`xyz/openbmc_project/Control/Device.errors.yaml`, the errors that come from 1420a2c1a23SMatt Spinlerthat file will be in the include: 1430a2c1a23SMatt Spinler`xyz/openbmc_project/Control/Device/error.hpp`. 1440a2c1a23SMatt Spinler 1450a2c1a23SMatt SpinlerIn rare cases, one may want one to define their errors in the same repository 1460a2c1a23SMatt Spinlerthat uses them. To do that, one must: 1470a2c1a23SMatt Spinler 1480a2c1a23SMatt Spinler1. Add the error and metadata YAML files to the repository. 1490a2c1a23SMatt Spinler2. Run the sdbus++ script within the makefile to create the error.hpp and .cpp 1500a2c1a23SMatt Spinler files from the local YAML, and include the error.cpp file in the application 1510a2c1a23SMatt Spinler that uses it. See [openpower-occ-control] for an example. 1520a2c1a23SMatt Spinler3. Tell phosphor-logging about the error. This is done by either: 1530a2c1a23SMatt Spinler * Following the [directions](#adding-application-specific-error-yaml) 1540a2c1a23SMatt Spinler defined in this README, or 1550a2c1a23SMatt Spinler * Running the script yourself: 1560a2c1a23SMatt Spinler 1. Run phosphor-logging\'s `elog-gen.py` script on the local yaml to 1570a2c1a23SMatt Spinler generate an elog-errors.hpp file that just contains the local errors, 1580a2c1a23SMatt Spinler and check that into the repository and include it where the errors are 1590a2c1a23SMatt Spinler needed. 1600a2c1a23SMatt Spinler 2. Create a recipe that copies the local YAML files to a place that 1610a2c1a23SMatt Spinler phosphor-logging can find it during the build. See [here][led-link] 1620a2c1a23SMatt Spinler for an example. 1630a2c1a23SMatt Spinler 1640a2c1a23SMatt Spinler#### D-Bus Event Log Creation 16572575f51SMatt SpinlerThere is also a [D-Bus method][log-create-link] to create event logs: 16672575f51SMatt Spinler* Service: xyz.openbmc_project.Logging 16772575f51SMatt Spinler* Object Path: /xyz/openbmc_project/logging 16872575f51SMatt Spinler* Interface: xyz.openbmc_project.Logging.Create 16972575f51SMatt Spinler* Method: Create 17072575f51SMatt Spinler * Method Arguments: 17172575f51SMatt Spinler * Message: The `Message` string property for the 17272575f51SMatt Spinler `xyz.openbmc_project.Logging.Entry` interface. 17372575f51SMatt Spinler * Severity: The `severity` property for the 17472575f51SMatt Spinler `xyz.openbmc_project.Logging.Entry` interface. 17572575f51SMatt Spinler An `xyz.openbmc_project.Logging.Entry.Level` enum value. 17672575f51SMatt Spinler * AdditionalData: The `AdditionalData` property for the 17772575f51SMatt Spinler `xyz.openbmc_project.Logging.Entry` interface, but in a map 17872575f51SMatt Spinler instead of in a vector of "KEY=VALUE" strings. 17972575f51SMatt Spinler Example: 18072575f51SMatt Spinler``` 18172575f51SMatt Spinler std::map<std::string, std::string> additionalData; 18272575f51SMatt Spinler additionalData["KEY"] = "VALUE"; 18372575f51SMatt Spinler``` 18472575f51SMatt Spinler 18572575f51SMatt Spinler 18672575f51SMatt SpinlerUnlike the previous APIs where errors could also act as exceptions that could 18772575f51SMatt Spinlerbe thrown across D-Bus, this API does not require that the error be defined in 18872575f51SMatt Spinlerthe error YAML in the D-Bus interfaces repository so that sdbusplus knows about 18972575f51SMatt Spinlerit. Additionally, as this method passes in everything needed to create the 19072575f51SMatt Spinlerevent log, the logging daemon doesn't have to know about it ahead of time 19172575f51SMatt Spinlereither. 19272575f51SMatt Spinler 19372575f51SMatt SpinlerThat being said, it is recommended that users of this API still follow some 19472575f51SMatt Spinlerguidelines for the message field, which is normally generated from a 19572575f51SMatt Spinlercombination of the path to the error YAML file and the error name itself. For 19672575f51SMatt Spinlerexample, the `Timeout` error in `xyz/openbmc_project/Common.errors.yaml` will 19772575f51SMatt Spinlerhave a Message property of `xyz.openbmc_project.Common.Error.Timeout`. 19872575f51SMatt Spinler 19972575f51SMatt SpinlerThe guidelines are: 20072575f51SMatt Spinler1. When it makes sense, one can still use an existing error that has already 20172575f51SMatt Spinler been defined in an error YAML file, and use the same severity and metadata 20272575f51SMatt Spinler (AdditionalData) as in the corresponding metadata YAML file. 20372575f51SMatt Spinler 20472575f51SMatt Spinler2. If creating a new error, use the same naming scheme as other errors, which 20572575f51SMatt Spinler starts with the domain, `xyz.openbmc_project`, `org.open_power`, etc, 20672575f51SMatt Spinler followed by the capitalized category values, followed by `Error`, followed 20772575f51SMatt Spinler by the capitalized error name itself, with everything separated by "."s. 20872575f51SMatt Spinler For example: `xyz.openbmc_project.Some.Category.Error.Name`. 20972575f51SMatt Spinler 21072575f51SMatt Spinler3. If creating a new common error, still add it to the appropriate error and 21172575f51SMatt Spinler metadata YAML files in the appropriate D-Bus interfaces repository so that 21272575f51SMatt Spinler others can know about it and use it in the future. This can be done after 21372575f51SMatt Spinler the fact. 2140a2c1a23SMatt Spinler 2150a2c1a23SMatt Spinler[xyz.openbmc_project.Logging.Entry]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Logging/Entry.interface.yaml 21627d82814SJohn Wang[xyz.openbmc_project.Association.Definitions]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Association/Definitions.interface.yaml 217828c4835SGunnar Mills[associations-doc]: https://github.com/openbmc/docs/blob/master/architecture/object-mapper.md#associations 2180a2c1a23SMatt Spinler[callout-doc]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Common/Callout/README.md 2190a2c1a23SMatt Spinler[xyz.openbmc_project.Object.Delete]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Object/Delete.interface.yaml 2200a2c1a23SMatt Spinler[xyz.openbmc_project.Software.Version]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Software/Version.errors.yaml 2210a2c1a23SMatt Spinler[elog-errors.hpp]: https://github.com/openbmc/phosphor-logging/blob/master/phosphor-logging/elog.hpp 2220a2c1a23SMatt Spinler[openpower-occ-control]: https://github.com/openbmc/openpower-occ-control 2230a2c1a23SMatt Spinler[led-link]: https://github.com/openbmc/openbmc/tree/master/meta-phosphor/recipes-phosphor/leds 22472575f51SMatt Spinler[log-create-link]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Logging/Create.interface.yaml 2250febd26bSDeepak Kodihalli 2269067c077SDeepak Kodihalli## Adding application specific error YAML 2274e5f521aSMarri Devender Rao* This document captures steps for adding application specific error YAML files 2284e5f521aSMarri Devender Rao and generating local elog-errors.hpp header file for application use. 2294e5f521aSMarri Devender Rao* Should cater for continuous integration (CI) build, bitbake image build, and 2304e5f521aSMarri Devender Rao local repository build. 2317aafb12eSNagaraju Goruganti 2329067c077SDeepak Kodihalli#### Continuous Integration (CI) build 2334e5f521aSMarri Devender Rao * Make is called on the repository that is modified. 2344e5f521aSMarri Devender Rao * Dependent packages are pulled based on the dependency list specified in the 2354e5f521aSMarri Devender Rao configure.ac script. 2367aafb12eSNagaraju Goruganti 2379067c077SDeepak Kodihalli#### Recipe build 2384e5f521aSMarri Devender Rao * Native recipes copy error YAML files to shared location. 2394e5f521aSMarri Devender Rao * phosphor-logging builds elog-errors.hpp by parsing the error YAML files from 2404e5f521aSMarri Devender Rao the shared location. 2417aafb12eSNagaraju Goruganti 2429067c077SDeepak Kodihalli#### Local repository build 2434e5f521aSMarri Devender Rao * Copies local error YAML files to the shared location in SDK 2444e5f521aSMarri Devender Rao * Make generates elog-errors.hpp by parsing the error YAML files from the 2454e5f521aSMarri Devender Rao shared location. 2467aafb12eSNagaraju Goruganti 2479067c077SDeepak Kodihalli#### Makefile changes 2484e5f521aSMarri Devender Rao**Reference** 2494e5f521aSMarri Devender Rao * https://github.com/openbmc/openpower-debug-collector/blob/master/Makefile.am 2509067c077SDeepak Kodihalli 2519067c077SDeepak Kodihalli###### Export error YAML to shared location 2524e5f521aSMarri Devender Rao*Modify Makefile.am to export newly added error YAML to shared location* 2534e5f521aSMarri Devender Rao``` 2544e5f521aSMarri Devender Raoyamldir = ${datadir}/phosphor-dbus-yaml/yaml 2554e5f521aSMarri Devender Raonobase_yaml_DATA = \ 2564e5f521aSMarri Devender Rao org/open_power/Host.errors.yaml 2574e5f521aSMarri Devender Rao``` 2589067c077SDeepak Kodihalli 2599067c077SDeepak Kodihalli###### Generate elog-errors.hpp using elog parser from SDK location 2604e5f521aSMarri Devender Rao * Add a conditional check "GEN_ERRORS" 2614e5f521aSMarri Devender Rao * Disable the check for recipe bitbake image build 2624e5f521aSMarri Devender Rao * Enable it for local repository build 2634e5f521aSMarri Devender Rao * If "GEN_ERRORS" is enabled, build generates elog-errors.hpp header file. 2644e5f521aSMarri Devender Rao``` 2654e5f521aSMarri Devender Rao # Generate phosphor-logging/elog-errors.hpp 2664e5f521aSMarri Devender Rao if GEN_ERRORS 2674e5f521aSMarri Devender Rao ELOG_MAKO ?= elog-gen-template.mako.hpp 2684e5f521aSMarri Devender Rao ELOG_DIR ?= ${OECORE_NATIVE_SYSROOT}${datadir}/phosphor-logging/elog 2694e5f521aSMarri Devender Rao ELOG_GEN_DIR ?= ${ELOG_DIR}/tools/ 2704e5f521aSMarri Devender Rao ELOG_MAKO_DIR ?= ${ELOG_DIR}/tools/phosphor-logging/templates/ 2714e5f521aSMarri Devender Rao YAML_DIR ?= ${OECORE_NATIVE_SYSROOT}${datadir}/phosphor-dbus-yaml/yaml 2724e5f521aSMarri Devender Rao phosphor-logging/elog-errors.hpp: 2734e5f521aSMarri Devender Rao @mkdir -p ${YAML_DIR}/org/open_power/ 2744e5f521aSMarri Devender Rao @cp ${top_srcdir}/org/open_power/Host.errors.yaml \ 2754e5f521aSMarri Devender Rao ${YAML_DIR}/org/open_power/Host.errors.yaml 2764e5f521aSMarri Devender Rao @mkdir -p `dirname $@` 2774e5f521aSMarri Devender Rao @chmod 777 $(ELOG_GEN_DIR)/elog-gen.py 2784e5f521aSMarri Devender Rao $(AM_V_at)$(PYTHON) $(ELOG_GEN_DIR)/elog-gen.py -y ${YAML_DIR} \ 2794e5f521aSMarri Devender Rao -t ${ELOG_MAKO_DIR} -m ${ELOG_MAKO} -o $@ 2804e5f521aSMarri Devender Rao endif 2814e5f521aSMarri Devender Rao``` 2827aafb12eSNagaraju Goruganti 2839067c077SDeepak Kodihalli###### Update BUILT_SOURCES 2844e5f521aSMarri Devender Rao * Append elog-errors.hpp to BUILT_SOURCES list and put it in conditional check 2854e5f521aSMarri Devender Rao GEN_ERRORS so that the elog-errors.hpp is generated only during local 2864e5f521aSMarri Devender Rao repository build. 2874e5f521aSMarri Devender Rao``` 2884e5f521aSMarri Devender Rao if GEN_ERRORS 2894e5f521aSMarri Devender Rao nobase_nodist_include_HEADERS += \ 2904e5f521aSMarri Devender Rao phosphor-logging/elog-errors.hpp 2914e5f521aSMarri Devender Rao endif 2924e5f521aSMarri Devender Rao if GEN_ERRORS 2934e5f521aSMarri Devender Rao BUILT_SOURCES += phosphor-logging/elog-errors.hpp 2944e5f521aSMarri Devender Rao endif 2954e5f521aSMarri Devender Rao``` 2969067c077SDeepak Kodihalli 2979067c077SDeepak Kodihalli###### Conditional check for native build 2984e5f521aSMarri Devender Rao * As the same Makefile is used both for recipe image build and native recipe 2994e5f521aSMarri Devender Rao build, add a conditional to ensure that only installation of error yaml files 3004e5f521aSMarri Devender Rao happens during native build. It is not required to build repository during 3014e5f521aSMarri Devender Rao native build. 3024e5f521aSMarri Devender Rao``` 3034e5f521aSMarri Devender Rao if !INSTALL_ERROR_YAML 3044e5f521aSMarri Devender Rao endif 3054e5f521aSMarri Devender Rao``` 3069067c077SDeepak Kodihalli 3079067c077SDeepak Kodihalli#### Autotools changes 3084e5f521aSMarri Devender Rao**Reference** 3094e5f521aSMarri Devender Rao * https://github.com/openbmc/openpower-debug-collector/blob/master/configure.ac 3107aafb12eSNagaraju Goruganti 3119067c077SDeepak Kodihalli###### Add option(argument) to enable/disable installing error yaml file 3124e5f521aSMarri Devender Rao * Install error yaml option(argument) is enabled for native recipe build 3134e5f521aSMarri Devender Rao and disabled for bitbake build. 3144e5f521aSMarri Devender Rao 3154e5f521aSMarri Devender Rao * When install error yaml option is disabled do not check for target specific 3164e5f521aSMarri Devender Rao packages in autotools configure script. 3174e5f521aSMarri Devender Rao 3189067c077SDeepak Kodihalli###### Add option(argument) to install error yaml files 3194e5f521aSMarri Devender Rao``` 3204e5f521aSMarri Devender RaoAC_ARG_ENABLE([install_error_yaml], 3214e5f521aSMarri Devender Rao AS_HELP_STRING([--enable-install_error_yaml], 3224e5f521aSMarri Devender Rao [Enable installing error yaml file]),[], [install_error_yaml=no]) 3234e5f521aSMarri Devender RaoAM_CONDITIONAL([INSTALL_ERROR_YAML], 3244e5f521aSMarri Devender Rao [test "x$enable_install_error_yaml" = "xyes"]) 3254e5f521aSMarri Devender RaoAS_IF([test "x$enable_install_error_yaml" != "xyes"], [ 3264e5f521aSMarri Devender Rao.. 3274e5f521aSMarri Devender Rao.. 3284e5f521aSMarri Devender Rao]) 3294e5f521aSMarri Devender Rao``` 3309067c077SDeepak Kodihalli 3319067c077SDeepak Kodihalli###### Add option(argument) to enable/disable generating elog-errors header file 3324e5f521aSMarri Devender Rao``` 3334e5f521aSMarri Devender RaoAC_ARG_ENABLE([gen_errors], 3344e5f521aSMarri Devender Rao AS_HELP_STRING([--enable-gen_errors], [Enable elog-errors.hpp generation ]), 3354e5f521aSMarri Devender Rao [],[gen_errors=yes]) 3364e5f521aSMarri Devender RaoAM_CONDITIONAL([GEN_ERRORS], [test "x$enable_gen_errors" != "xno"]) 3374e5f521aSMarri Devender Rao``` 3384e5f521aSMarri Devender Rao 3399067c077SDeepak Kodihalli#### Recipe changes 3404e5f521aSMarri Devender Rao**Reference** 3414e5f521aSMarri Devender Rao* https://github.com/openbmc/openbmc/blob/master/meta-openbmc-machines\ 3424e5f521aSMarri Devender Rao/meta-openpower/common/recipes-phosphor/debug/openpower-debug-collector.bb 3434e5f521aSMarri Devender Rao 3449067c077SDeepak Kodihalli###### Extend recipe for native and nativesdk 3454e5f521aSMarri Devender Rao* Extend the recipe for native and native SDK builds 3464e5f521aSMarri Devender Rao``` 3474e5f521aSMarri Devender RaoBBCLASSEXTEND += "native nativesdk" 3484e5f521aSMarri Devender Rao``` 3499067c077SDeepak Kodihalli###### Remove dependencies for native and native SDK build 3504e5f521aSMarri Devender Rao* Native recipe caters only for copying error yaml files to shared location. 3514e5f521aSMarri Devender Rao* For native and native SDK build remove dependency on packages that recipe 3524e5f521aSMarri Devender Rao build depends 3534e5f521aSMarri Devender Rao 3549067c077SDeepak Kodihalli###### Remove dependency on phosphor-logging for native build 3554e5f521aSMarri Devender Rao``` 3564e5f521aSMarri Devender RaoDEPENDS_remove_class-native = "phosphor-logging" 3574e5f521aSMarri Devender Rao``` 3589067c077SDeepak Kodihalli 3599067c077SDeepak Kodihalli###### Remove dependency on phosphor-logging for native SDK build 3604e5f521aSMarri Devender Rao``` 3614e5f521aSMarri Devender RaoDEPENDS_remove_class-nativesdk = "phosphor-logging" 3624e5f521aSMarri Devender Rao``` 3639067c077SDeepak Kodihalli 3649067c077SDeepak Kodihalli###### Add install_error_yaml argument during native build 3654e5f521aSMarri Devender Rao* Add package config to enable/disable install_error_yaml feature. 3669067c077SDeepak Kodihalli 3679067c077SDeepak Kodihalli###### Add package config to enable/disable install_error_yaml feature 3684e5f521aSMarri Devender Rao``` 3694e5f521aSMarri Devender RaoPACKAGECONFIG ??= "install_error_yaml" 3704e5f521aSMarri Devender RaoPACKAGECONFIG[install_error_yaml] = " \ 3714e5f521aSMarri Devender Rao --enable-install_error_yaml, \ 3724e5f521aSMarri Devender Rao --disable-install_error_yaml, ,\ 3734e5f521aSMarri Devender Rao " 3744e5f521aSMarri Devender Rao``` 3759067c077SDeepak Kodihalli###### Enable install_error_yaml check for native build 3764e5f521aSMarri Devender Rao``` 3774e5f521aSMarri Devender RaoPACKAGECONFIG_add_class-native = "install_error_yaml" 3784e5f521aSMarri Devender RaoPACKAGECONFIG_add_class-nativesdk = "install_error_yaml" 3794e5f521aSMarri Devender Rao``` 3809067c077SDeepak Kodihalli###### Disable install_error_yaml during target build 3814e5f521aSMarri Devender Rao``` 3824e5f521aSMarri Devender RaoPACKAGECONFIG_remove_class-target = "install_error_yaml" 3834e5f521aSMarri Devender Rao``` 3844e5f521aSMarri Devender Rao 3859067c077SDeepak Kodihalli###### Disable generating elog-errors.hpp for bitbake build 3864e5f521aSMarri Devender Rao* Disable gen_errors argument for bitbake image build as the application uses 3874e5f521aSMarri Devender Rao the elog-errors.hpp generated by phosphor-logging 3884e5f521aSMarri Devender Rao* Argument is enabled by default for local repository build in the configure 3894e5f521aSMarri Devender Rao script of the local repository. 3904e5f521aSMarri Devender Rao``` 3914e5f521aSMarri Devender Rao XTRA_OECONF += "--disable-gen_errors" 3924e5f521aSMarri Devender Rao``` 3934e5f521aSMarri Devender Rao 3949067c077SDeepak Kodihalli#### Local build 3954e5f521aSMarri Devender Rao* During local build use --prefix=/usr for the configure script. 3964e5f521aSMarri Devender Rao 3973210a9f3SMatt Spinler**Reference** 3983210a9f3SMatt Spinler* https://github.com/openbmc/openpower-debug-collector/blob/master/README.md 3993210a9f3SMatt Spinler 40099c2b405SMatt Spinler## Event Log Extensions 40199c2b405SMatt Spinler 40299c2b405SMatt SpinlerThe extension concept is a way to allow code that creates other formats of 40399c2b405SMatt Spinlererror logs besides phosphor-logging's event logs to still reside in the 40499c2b405SMatt Spinlerphosphor-log-manager application. 40599c2b405SMatt Spinler 40699c2b405SMatt SpinlerThe extension code lives in the `extensions/<extension>` subdirectories, 40799c2b405SMatt Spinlerand is enabled with a `--enable-<extension>` configure flag. The 40899c2b405SMatt Spinlerextension code won't compile unless enabled with this flag. 40999c2b405SMatt Spinler 41099c2b405SMatt SpinlerExtensions can register themselves to have functions called at the following 41199c2b405SMatt Spinlerpoints using the REGISTER_EXTENSION_FUNCTION macro. 41299c2b405SMatt Spinler* On startup 41399c2b405SMatt Spinler * Function type void(internal::Manager&) 41499c2b405SMatt Spinler* After an event log is created 41599c2b405SMatt Spinler * Function type void(args) 41699c2b405SMatt Spinler * The args are: 41799c2b405SMatt Spinler * const std::string& - The Message property 41899c2b405SMatt Spinler * uin32_t - The event log ID 41999c2b405SMatt Spinler * uint64_t - The event log timestamp 42099c2b405SMatt Spinler * Level - The event level 42199c2b405SMatt Spinler * const AdditionalDataArg& - the additional data 42299c2b405SMatt Spinler * const AssociationEndpointsArg& - Association endpoints (callouts) 42399c2b405SMatt Spinler* Before an event log is deleted, to check if it is allowed. 42499c2b405SMatt Spinler * Function type void(std::uint32_t, bool&) that takes the event ID 42599c2b405SMatt Spinler* After an event log is deleted 42699c2b405SMatt Spinler * Function type void(std::uint32_t) that takes the event ID 42799c2b405SMatt Spinler 42899c2b405SMatt SpinlerUsing these callback points, they can create their own event log for each 42999c2b405SMatt SpinlerOpenBMC event log that is created, and delete these logs when the corresponding 43099c2b405SMatt SpinlerOpenBMC event log is deleted. 43199c2b405SMatt Spinler 43299c2b405SMatt SpinlerIn addition, an extension has the option of disabling phosphor-logging's 43399c2b405SMatt Spinlerdefault error log capping policy so that it can use its own. The macro 43499c2b405SMatt SpinlerDISABLE_LOG_ENTRY_CAPS() is used for that. 43599c2b405SMatt Spinler 43699c2b405SMatt Spinler### Motivation 43799c2b405SMatt Spinler 43899c2b405SMatt SpinlerThe reason for adding support for extensions inside the phosphor-log-manager 43999c2b405SMatt Spinlerdaemon as opposed to just creating new daemons that listen for D-Bus signals is 44099c2b405SMatt Spinlerto allow interactions that would be complicated or expensive if just done over 44199c2b405SMatt SpinlerD-Bus, such as: 44299c2b405SMatt Spinler* Allowing for custom old log retention algorithms. 44399c2b405SMatt Spinler* Prohibiting manual deleting of certain logs based on an extension's 44499c2b405SMatt Spinler requirements. 44599c2b405SMatt Spinler 44699c2b405SMatt Spinler### Creating extensions 44799c2b405SMatt Spinler 44899c2b405SMatt Spinler1. Add a new flag to configure.ac to enable the extension: 44999c2b405SMatt Spinler``` 45099c2b405SMatt SpinlerAC_ARG_ENABLE([foo-extension], 45199c2b405SMatt Spinler AS_HELP_STRING([--enable-foo-extension], 45299c2b405SMatt Spinler [Create Foo logs])) 45399c2b405SMatt SpinlerAM_CONDITIONAL([ENABLE_FOO_EXTENSION], 45499c2b405SMatt Spinler [test "x$enable_foo_extension" == "xyes"]) 45599c2b405SMatt Spinler``` 45699c2b405SMatt Spinler2. Add the code in `extensions/<extension>/`. 45799c2b405SMatt Spinler3. Create a makefile include to add the new code to phosphor-log-manager: 45899c2b405SMatt Spinler``` 45999c2b405SMatt Spinlerphosphor_log_manager_SOURCES += \ 46099c2b405SMatt Spinler extensions/foo/foo.cpp 46199c2b405SMatt Spinler``` 4625cabd090SAndrew Geissler4. In `extensions/extensions.mk`, add the makefile include: 46399c2b405SMatt Spinler``` 46499c2b405SMatt Spinlerif ENABLE_FOO_EXTENSION 46599c2b405SMatt Spinlerinclude extensions/foo/foo.mk 46699c2b405SMatt Spinlerendif 46799c2b405SMatt Spinler``` 4685cabd090SAndrew Geissler5. In the extension code, register the functions to call and optionally disable 46999c2b405SMatt Spinler log capping using the provided macros: 47099c2b405SMatt Spinler``` 47199c2b405SMatt SpinlerDISABLE_LOG_ENTRY_CAPS(); 47299c2b405SMatt Spinler 47399c2b405SMatt Spinlervoid fooStartup(internal::Manager& manager) 47499c2b405SMatt Spinler{ 47599c2b405SMatt Spinler // Initialize 47699c2b405SMatt Spinler} 47799c2b405SMatt Spinler 47899c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooStartup); 47999c2b405SMatt Spinler 48099c2b405SMatt Spinlervoid fooCreate(const std::string& message, uint32_t id, uint64_t timestamp, 48199c2b405SMatt Spinler Entry::Level severity, const AdditionalDataArg& additionalData, 48299c2b405SMatt Spinler const AssociationEndpointsArg& assocs) 48399c2b405SMatt Spinler{ 48499c2b405SMatt Spinler // Create a different type of error log based on 'entry'. 48599c2b405SMatt Spinler} 48699c2b405SMatt Spinler 48799c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooCreate); 48899c2b405SMatt Spinler 48999c2b405SMatt Spinlervoid fooRemove(uint32_t id) 49099c2b405SMatt Spinler{ 49199c2b405SMatt Spinler // Delete the extension error log that corresponds to 'id'. 49299c2b405SMatt Spinler} 49399c2b405SMatt Spinler 49499c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooRemove); 49599c2b405SMatt Spinler``` 4963210a9f3SMatt Spinler### Extension List 49799c2b405SMatt Spinler 4983210a9f3SMatt SpinlerThe supported extensions are: 4993210a9f3SMatt Spinler 5003210a9f3SMatt Spinler* OpenPower PELs 5013210a9f3SMatt Spinler * Enabled with --enable-openpower-pel-extension 5023210a9f3SMatt Spinler * Detailed information can be found 5033210a9f3SMatt Spinler [here](extensions/openpower-pels/README.md) 5040649b985SAndrew Geissler 50524eb160fSJeremy Kerr## Remote Logging via Rsyslog 50624eb160fSJeremy KerrThe BMC has the ability to stream out local logs (that go to the systemd journal) 50724eb160fSJeremy Kerrvia rsyslog (https://www.rsyslog.com/). 50824eb160fSJeremy Kerr 50924eb160fSJeremy KerrThe BMC will send everything. Any kind of filtering and appropriate storage 51024eb160fSJeremy Kerrwill have to be managed on the rsyslog server. Various examples are available 51124eb160fSJeremy Kerron the internet. Here are few pointers : 51224eb160fSJeremy Kerrhttps://www.rsyslog.com/storing-and-forwarding-remote-messages/ 51324eb160fSJeremy Kerrhttps://www.rsyslog.com/doc/rsyslog%255Fconf%255Ffilter.html 51424eb160fSJeremy Kerrhttps://www.thegeekdiary.com/understanding-rsyslog-filter-options/ 51524eb160fSJeremy Kerr 51624eb160fSJeremy Kerr#### Configuring rsyslog server for remote logging 51724eb160fSJeremy KerrThe BMC is an rsyslog client. To stream out logs, it needs to talk to an rsyslog 51824eb160fSJeremy Kerrserver, to which there's connectivity over a network. REST API can be used to 51924eb160fSJeremy Kerrset the remote server's IP address and port number. 52024eb160fSJeremy Kerr 52124eb160fSJeremy KerrThe following presumes a user has logged on to the BMC (see 52224eb160fSJeremy Kerrhttps://github.com/openbmc/docs/blob/master/rest-api.md). 52324eb160fSJeremy Kerr 52424eb160fSJeremy KerrSet the IP: 52524eb160fSJeremy Kerr``` 52624eb160fSJeremy Kerrcurl -b cjar -k -H "Content-Type: application/json" -X PUT \ 52724eb160fSJeremy Kerr -d '{"data": <IP address>}' \ 52824eb160fSJeremy Kerr https://<BMC IP address>/xyz/openbmc_project/logging/config/remote/attr/Address 52924eb160fSJeremy Kerr``` 53024eb160fSJeremy Kerr 53124eb160fSJeremy KerrSet the port: 53224eb160fSJeremy Kerr``` 53324eb160fSJeremy Kerrcurl -b cjar -k -H "Content-Type: application/json" -X PUT \ 53424eb160fSJeremy Kerr -d '{"data": <port number>}' \ 53524eb160fSJeremy Kerr https://<BMC IP address>/xyz/openbmc_project/logging/config/remote/attr/Port 53624eb160fSJeremy Kerr``` 53724eb160fSJeremy Kerr 53824eb160fSJeremy Kerr#### Querying the current configuration 53924eb160fSJeremy Kerr``` 54024eb160fSJeremy Kerrcurl -b cjar -k \ 54124eb160fSJeremy Kerr https://<BMC IP address>/xyz/openbmc_project/logging/config/remote 54224eb160fSJeremy Kerr``` 54324eb160fSJeremy Kerr 54424eb160fSJeremy Kerr#### Setting the hostname 54524eb160fSJeremy KerrRsyslog can store logs separately for each host. For this reason, it's useful to 54624eb160fSJeremy Kerrprovide a unique hostname to each managed BMC. Here's how that can be done via a 54724eb160fSJeremy KerrREST API : 54824eb160fSJeremy Kerr``` 54924eb160fSJeremy Kerrcurl -b cjar -k -H "Content-Type: application/json" -X PUT \ 55024eb160fSJeremy Kerr -d '{"data": "myHostName"}' \ 55124eb160fSJeremy Kerr https://<BMC IP address>//xyz/openbmc_project/network/config/attr/HostName 55224eb160fSJeremy Kerr``` 55324eb160fSJeremy Kerr 55424eb160fSJeremy Kerr#### Disabling remote logging 55524eb160fSJeremy KerrRemote logging can be disabled by writing 0 to the port, or an empty string("") 55624eb160fSJeremy Kerrto the IP. 55724eb160fSJeremy Kerr 55824eb160fSJeremy Kerr#### Changing the rsyslog server 55924eb160fSJeremy KerrWhen switching to a new server from an existing one (i.e the address, or port, 56024eb160fSJeremy Kerror both change), it is recommended to disable the existing configuration first. 56124eb160fSJeremy Kerr 5620649b985SAndrew Geissler## Boot Fail on Hardware Errors 5630649b985SAndrew Geissler 5640649b985SAndrew Geisslerphosphor-logging supports a setting, which when set, will result in the 5650649b985SAndrew Geisslersoftware looking at new phosphor-logging entries being created, and if a 5660649b985SAndrew GeisslerCALLOUT* is found within the entry, ensuring the system will not power 5670649b985SAndrew Geissleron. 5680649b985SAndrew Geissler 5690649b985SAndrew GeisslerThe full design for this can be found 5700649b985SAndrew Geissler[here](https://github.com/openbmc/docs/blob/master/designs/fail-boot-on-hw-error.md) 5710649b985SAndrew Geissler 5720649b985SAndrew GeisslerTo enable this function: 5730649b985SAndrew Geissler 5740649b985SAndrew Geissler``` 5750649b985SAndrew Geisslerbusctl set-property xyz.openbmc_project.Settings /xyz/openbmc_project/logging/settings xyz.openbmc_project.Logging.Settings QuiesceOnHwError b true 5760649b985SAndrew Geissler``` 5770649b985SAndrew Geissler 5780649b985SAndrew GeisslerTo check if an entry is blocking the boot: 5790649b985SAndrew Geissler``` 5800649b985SAndrew Geisslerobmcutil listbootblock 5810649b985SAndrew Geissler``` 5820649b985SAndrew Geissler 5830649b985SAndrew GeisslerResolve or clear the corresponding entry to allow the system to boot. 584