xref: /openbmc/phosphor-logging/README.md (revision 72575f51ed7b7ead4d55c87b23c186d882ae8345)
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)
80a2c1a23SMatt 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
800a2c1a23SMatt Spinler## Event Logs
810a2c1a23SMatt SpinlerOpenBMC event logs are a collection of D-Bus interfaces owned by
820a2c1a23SMatt Spinlerphosphor-log-manager that reside at `/xyz/openbmc_project/logging/entry/X`,
830a2c1a23SMatt Spinlerwhere X starts at 1 and is incremented for each new log.
840a2c1a23SMatt Spinler
850a2c1a23SMatt SpinlerThe interfaces are:
860a2c1a23SMatt Spinler* [xyz.openbmc_project.Logging.Entry]
870a2c1a23SMatt Spinler  * The main event log interface.
8827d82814SJohn Wang* [xyz.openbmc_project.Association.Definitions]
890a2c1a23SMatt Spinler  * Used for specifying inventory items as the cause of the event.
900a2c1a23SMatt Spinler  * For more information on associations, see [here][associations-doc].
910a2c1a23SMatt Spinler* [xyz.openbmc_project.Object.Delete]
920a2c1a23SMatt Spinler  * Provides a Delete method to delete the event.
930a2c1a23SMatt Spinler* [xyz.openbmc_project.Software.Version]
940a2c1a23SMatt Spinler  * Stores the code version that the error occurred on.
950a2c1a23SMatt Spinler
960a2c1a23SMatt SpinlerOn platforms that make use of these event logs, the intent is that they are
970a2c1a23SMatt Spinlerthe common event log representation that other types of event logs can be
980a2c1a23SMatt Spinlercreated from.  For example, there is code to convert these into both Redfish
990a2c1a23SMatt Spinlerand IPMI event logs, in addition to the event log extensions mentioned
1000a2c1a23SMatt Spinler[below](#event-log-extensions).
1010a2c1a23SMatt Spinler
1020a2c1a23SMatt SpinlerThe logging daemon has the ability to add `callout` associations to an event
1030a2c1a23SMatt Spinlerlog based on text in the AdditionalData property.  A callout is a link to the
1040a2c1a23SMatt Spinlerinventory item(s) that were the cause of the event log. See [here][callout-doc]
1050a2c1a23SMatt Spinlerfor details.
1060a2c1a23SMatt Spinler
1070a2c1a23SMatt Spinler### Creating Event Logs In Code
1080a2c1a23SMatt SpinlerThere are two approaches to creating event logs in OpenBMC code.  The first
1090a2c1a23SMatt Spinlermakes use of the systemd journal to store metadata needed for the log, and the
1100a2c1a23SMatt Spinlersecond is a plain D-Bus method call.
1110a2c1a23SMatt Spinler
1120a2c1a23SMatt Spinler#### Journal Based Event Log Creation
1130a2c1a23SMatt SpinlerEvent logs can be created by using phosphor-logging APIs to commit sdbusplus
1140a2c1a23SMatt Spinlerexceptions.  These APIs write to the journal, and then call a `Commit`
1150a2c1a23SMatt SpinlerD-Bus method on the logging daemon to create the event log using the information
1160a2c1a23SMatt Spinlerit put in the journal.
1170a2c1a23SMatt Spinler
1180a2c1a23SMatt SpinlerThe APIs are found in `<phosphor-logging/elog.hpp>`:
1190a2c1a23SMatt Spinler* `elog()`: Throw an sdbusplus error.
1200a2c1a23SMatt Spinler* `commit()`: Catch an error thrown by elog(), and commit it to create the
1210a2c1a23SMatt Spinler  event log.
1220a2c1a23SMatt Spinler* `report()`: Create an event log from an sdbusplus error without throwing the
1230a2c1a23SMatt Spinler  exception first.
1240a2c1a23SMatt Spinler
1250a2c1a23SMatt SpinlerAny errors passed into these APIs must be known to phosphor-logging, usually
1260a2c1a23SMatt Spinlerby being defined in `<phosphor-logging/elog-errors.hpp>`.  The errors must
1270a2c1a23SMatt Spinleralso be known by sdbusplus, and be defined in their corresponding error.hpp.
1280a2c1a23SMatt SpinlerSee below for details on how get errors into these headers.
1290a2c1a23SMatt Spinler
1300a2c1a23SMatt SpinlerExample:
1310a2c1a23SMatt Spinler```
1320a2c1a23SMatt Spinler#include <phosphor-logging/elog-errors.hpp>
1330a2c1a23SMatt Spinler#include <phosphor-logging/elog.hpp>
1340a2c1a23SMatt Spinler#include <xyz/openbmc_project/Common/error.hpp>
1350a2c1a23SMatt Spinler...
1360a2c1a23SMatt Spinlerusing InternalFailure =
1370a2c1a23SMatt Spinler    sdbusplus::xyz::openbmc_project::Common::Error::InternalFailure;
1380a2c1a23SMatt Spinler...
1390a2c1a23SMatt Spinlerif (somethingBadHappened)
1400a2c1a23SMatt Spinler{
1410a2c1a23SMatt Spinler    phosphor::logging::report<InternalFailure>();
1420a2c1a23SMatt Spinler}
1430a2c1a23SMatt Spinler
1440a2c1a23SMatt Spinler```
1450a2c1a23SMatt SpinlerAlternatively, to throw, catch, and then commit the error:
1460a2c1a23SMatt Spinler```
1470a2c1a23SMatt Spinlertry
1480a2c1a23SMatt Spinler{
1490a2c1a23SMatt Spinler    phosphor::logging::elog<InternalFailure>();
1500a2c1a23SMatt Spinler}
1510a2c1a23SMatt Spinlercatch (InternalFailure& e)
1520a2c1a23SMatt Spinler{
1530a2c1a23SMatt Spinler    phosphor::logging::commit<InternalFailure>();
1540a2c1a23SMatt Spinler}
1550a2c1a23SMatt Spinler```
1560a2c1a23SMatt Spinler
1570a2c1a23SMatt SpinlerMetadata can be added to event logs to add debug data captured at the time of
1580a2c1a23SMatt Spinlerthe event. It shows up in the AdditionalData property in the
1590a2c1a23SMatt Spinler`xyz.openbmc_project.Logging.Entry` interface.  Metadata is passed in via the
1600a2c1a23SMatt Spinler`elog()` or `report()` functions, which write it to the journal. The metadata
1610a2c1a23SMatt Spinlermust be predefined for the error in the [metadata YAML](#event-log-definition)
1620a2c1a23SMatt Spinlerso that the daemon knows to look for it in the journal when it creates the
1630a2c1a23SMatt Spinlerevent log.
1640a2c1a23SMatt Spinler
1650a2c1a23SMatt SpinlerExample:
1660a2c1a23SMatt Spinler```
1670a2c1a23SMatt Spinler#include <phosphor-logging/elog-errors.hpp>
1680a2c1a23SMatt Spinler#include <phosphor-logging/elog.hpp>
1690a2c1a23SMatt Spinler#include <xyz/openbmc_project/Control/Device/error.hpp>
1700a2c1a23SMatt Spinler...
1710a2c1a23SMatt Spinlerusing WriteFailure =
1720a2c1a23SMatt Spinler    sdbusplus::xyz::openbmc_project::Control::Device::Error::WriteFailure;
1730a2c1a23SMatt Spinlerusing metadata =
1740a2c1a23SMatt Spinler    xyz::openbmc_project::Control::Device::WriteFailure;
1750a2c1a23SMatt Spinler...
1760a2c1a23SMatt Spinlerif (somethingBadHappened)
1770a2c1a23SMatt Spinler{
1780a2c1a23SMatt Spinler    phosphor::logging::report<WriteFailure>(metadata::CALLOUT_ERRNO(5),
1790a2c1a23SMatt Spinler                              metadata::CALLOUT_DEVICE_PATH("some path"));
1800a2c1a23SMatt Spinler}
1810a2c1a23SMatt Spinler```
1820a2c1a23SMatt SpinlerIn the above example, the AdditionalData property would look like:
1830a2c1a23SMatt Spinler```
1840a2c1a23SMatt Spinler["CALLOUT_ERRNO=5", "CALLOUT_DEVICE_PATH=some path"]
1850a2c1a23SMatt Spinler```
1860a2c1a23SMatt SpinlerNote that the metadata fields must be all uppercase.
1870a2c1a23SMatt Spinler
1880a2c1a23SMatt Spinler##### Event Log Definition
1890a2c1a23SMatt SpinlerAs mentioned above, both sdbusplus and phosphor-logging must know about the
1900a2c1a23SMatt Spinlerevent logs in their header files, or the code that uses them will not even
1910a2c1a23SMatt Spinlercompile.  The standard way to do this to define the event in the appropriate
1920a2c1a23SMatt Spinler`<error-category>.errors.yaml` file, and define any metadata in the
1930a2c1a23SMatt Spinler`<error-category>.metadata.yaml` file in the appropriate `*-dbus-interfaces`
1940a2c1a23SMatt Spinlerrepository.  During the build, phosphor-logging generates the elog-errors.hpp
1950a2c1a23SMatt Spinlerfile for use by the calling code.
1960a2c1a23SMatt Spinler
1970a2c1a23SMatt SpinlerIn much the same way, sdbusplus uses the event log definitions to generate an
1980a2c1a23SMatt Spinlererror.hpp file that contains the specific exception.  The path of the error.hpp
1990a2c1a23SMatt Spinlermatches the path of the YAML file.
2000a2c1a23SMatt Spinler
2010a2c1a23SMatt SpinlerFor example, if in phosphor-dbus-interfaces there is
2020a2c1a23SMatt Spinler`xyz/openbmc_project/Control/Device.errors.yaml`, the errors that come from
2030a2c1a23SMatt Spinlerthat file will be in the include:
2040a2c1a23SMatt Spinler`xyz/openbmc_project/Control/Device/error.hpp`.
2050a2c1a23SMatt Spinler
2060a2c1a23SMatt SpinlerIn rare cases, one may want one to define their errors in the same repository
2070a2c1a23SMatt Spinlerthat uses them.  To do that, one must:
2080a2c1a23SMatt Spinler
2090a2c1a23SMatt Spinler1. Add the error and metadata YAML files to the repository.
2100a2c1a23SMatt Spinler2. Run the sdbus++ script within the makefile to create the error.hpp and .cpp
2110a2c1a23SMatt Spinler   files from the local YAML, and include the error.cpp file in the application
2120a2c1a23SMatt Spinler   that uses it.  See [openpower-occ-control] for an example.
2130a2c1a23SMatt Spinler3. Tell phosphor-logging about the error.  This is done by either:
2140a2c1a23SMatt Spinler   * Following the [directions](#adding-application-specific-error-yaml)
2150a2c1a23SMatt Spinler     defined in this README, or
2160a2c1a23SMatt Spinler   * Running the script yourself:
2170a2c1a23SMatt Spinler    1. Run phosphor-logging\'s `elog-gen.py` script on the local yaml to
2180a2c1a23SMatt Spinler       generate an elog-errors.hpp file that just contains the local errors,
2190a2c1a23SMatt Spinler       and check that into the repository and include it where the errors are
2200a2c1a23SMatt Spinler       needed.
2210a2c1a23SMatt Spinler    2. Create a recipe that copies the local YAML files to a place that
2220a2c1a23SMatt Spinler       phosphor-logging can find it during the build. See [here][led-link]
2230a2c1a23SMatt Spinler       for an example.
2240a2c1a23SMatt Spinler
2250a2c1a23SMatt Spinler#### D-Bus Event Log Creation
226*72575f51SMatt SpinlerThere is also a [D-Bus method][log-create-link] to create event logs:
227*72575f51SMatt Spinler* Service: xyz.openbmc_project.Logging
228*72575f51SMatt Spinler* Object Path: /xyz/openbmc_project/logging
229*72575f51SMatt Spinler* Interface: xyz.openbmc_project.Logging.Create
230*72575f51SMatt Spinler* Method: Create
231*72575f51SMatt Spinler  * Method Arguments:
232*72575f51SMatt Spinler      * Message: The `Message` string property for the
233*72575f51SMatt Spinler                 `xyz.openbmc_project.Logging.Entry` interface.
234*72575f51SMatt Spinler      * Severity: The `severity` property for the
235*72575f51SMatt Spinler                 `xyz.openbmc_project.Logging.Entry` interface.
236*72575f51SMatt Spinler                 An `xyz.openbmc_project.Logging.Entry.Level` enum value.
237*72575f51SMatt Spinler      * AdditionalData: The `AdditionalData` property for the
238*72575f51SMatt Spinler                 `xyz.openbmc_project.Logging.Entry` interface, but in a map
239*72575f51SMatt Spinler                 instead of in a vector of "KEY=VALUE" strings.
240*72575f51SMatt Spinler                 Example:
241*72575f51SMatt Spinler```
242*72575f51SMatt Spinler                     std::map<std::string, std::string> additionalData;
243*72575f51SMatt Spinler                     additionalData["KEY"] = "VALUE";
244*72575f51SMatt Spinler```
245*72575f51SMatt Spinler
246*72575f51SMatt Spinler
247*72575f51SMatt SpinlerUnlike the previous APIs where errors could also act as exceptions that could
248*72575f51SMatt Spinlerbe thrown across D-Bus, this API does not require that the error be defined in
249*72575f51SMatt Spinlerthe error YAML in the D-Bus interfaces repository so that sdbusplus knows about
250*72575f51SMatt Spinlerit.  Additionally, as this method passes in everything needed to create the
251*72575f51SMatt Spinlerevent log, the logging daemon doesn't have to know about it ahead of time
252*72575f51SMatt Spinlereither.
253*72575f51SMatt Spinler
254*72575f51SMatt SpinlerThat being said, it is recommended that users of this API still follow some
255*72575f51SMatt Spinlerguidelines for the message field, which is normally generated from a
256*72575f51SMatt Spinlercombination of the path to the error YAML file and the error name itself.  For
257*72575f51SMatt Spinlerexample, the `Timeout` error in `xyz/openbmc_project/Common.errors.yaml` will
258*72575f51SMatt Spinlerhave a Message property of `xyz.openbmc_project.Common.Error.Timeout`.
259*72575f51SMatt Spinler
260*72575f51SMatt SpinlerThe guidelines are:
261*72575f51SMatt Spinler1. When it makes sense, one can still use an existing error that has already
262*72575f51SMatt Spinler   been defined in an error YAML file, and use the same severity and metadata
263*72575f51SMatt Spinler   (AdditionalData) as in the corresponding metadata YAML file.
264*72575f51SMatt Spinler
265*72575f51SMatt Spinler2. If creating a new error, use the same naming scheme as other errors, which
266*72575f51SMatt Spinler   starts with the domain, `xyz.openbmc_project`, `org.open_power`, etc,
267*72575f51SMatt Spinler   followed by the capitalized category values, followed by `Error`, followed
268*72575f51SMatt Spinler   by the capitalized error name itself, with everything  separated by "."s.
269*72575f51SMatt Spinler   For example: `xyz.openbmc_project.Some.Category.Error.Name`.
270*72575f51SMatt Spinler
271*72575f51SMatt Spinler3. If creating a new common error, still add it to the appropriate error and
272*72575f51SMatt Spinler   metadata YAML files in the appropriate D-Bus interfaces repository so that
273*72575f51SMatt Spinler   others can know about it and use it in the future.  This can be done after
274*72575f51SMatt Spinler   the fact.
2750a2c1a23SMatt Spinler
2760a2c1a23SMatt Spinler[xyz.openbmc_project.Logging.Entry]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Logging/Entry.interface.yaml
27727d82814SJohn Wang[xyz.openbmc_project.Association.Definitions]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Association/Definitions.interface.yaml
2780a2c1a23SMatt Spinler[associations-doc]: https://github.com/openbmc/docs/blob/master/object-mapper.md#associations
2790a2c1a23SMatt Spinler[callout-doc]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Common/Callout/README.md
2800a2c1a23SMatt Spinler[xyz.openbmc_project.Object.Delete]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Object/Delete.interface.yaml
2810a2c1a23SMatt Spinler[xyz.openbmc_project.Software.Version]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Software/Version.errors.yaml
2820a2c1a23SMatt Spinler[elog-errors.hpp]: https://github.com/openbmc/phosphor-logging/blob/master/phosphor-logging/elog.hpp
2830a2c1a23SMatt Spinler[openpower-occ-control]: https://github.com/openbmc/openpower-occ-control
2840a2c1a23SMatt Spinler[led-link]: https://github.com/openbmc/openbmc/tree/master/meta-phosphor/recipes-phosphor/leds
285*72575f51SMatt Spinler[log-create-link]: https://github.com/openbmc/phosphor-dbus-interfaces/blob/master/xyz/openbmc_project/Logging/Create.interface.yaml
2860febd26bSDeepak Kodihalli
2879067c077SDeepak Kodihalli## Adding application specific error YAML
2884e5f521aSMarri Devender Rao* This document captures steps for adding application specific error YAML files
2894e5f521aSMarri Devender Rao  and generating local elog-errors.hpp header file for application use.
2904e5f521aSMarri Devender Rao* Should cater for continuous integration (CI) build, bitbake image build, and
2914e5f521aSMarri Devender Rao  local repository build.
2927aafb12eSNagaraju Goruganti
2939067c077SDeepak Kodihalli#### Continuous Integration (CI) build
2944e5f521aSMarri Devender Rao * Make is called on the repository that is modified.
2954e5f521aSMarri Devender Rao * Dependent packages are pulled based on the dependency list specified in the
2964e5f521aSMarri Devender Rao   configure.ac script.
2977aafb12eSNagaraju Goruganti
2989067c077SDeepak Kodihalli#### Recipe build
2994e5f521aSMarri Devender Rao * Native recipes copy error YAML files to shared location.
3004e5f521aSMarri Devender Rao * phosphor-logging builds elog-errors.hpp by parsing the error YAML files from
3014e5f521aSMarri Devender Rao   the shared location.
3027aafb12eSNagaraju Goruganti
3039067c077SDeepak Kodihalli#### Local repository build
3044e5f521aSMarri Devender Rao * Copies local error YAML files to the shared location in SDK
3054e5f521aSMarri Devender Rao * Make generates elog-errors.hpp by parsing the error YAML files from the
3064e5f521aSMarri Devender Rao   shared location.
3077aafb12eSNagaraju Goruganti
3089067c077SDeepak Kodihalli#### Makefile changes
3094e5f521aSMarri Devender Rao**Reference**
3104e5f521aSMarri Devender Rao * https://github.com/openbmc/openpower-debug-collector/blob/master/Makefile.am
3119067c077SDeepak Kodihalli
3129067c077SDeepak Kodihalli###### Export error YAML to shared location
3134e5f521aSMarri Devender Rao*Modify Makefile.am to export newly added error YAML to shared location*
3144e5f521aSMarri Devender Rao```
3154e5f521aSMarri Devender Raoyamldir = ${datadir}/phosphor-dbus-yaml/yaml
3164e5f521aSMarri Devender Raonobase_yaml_DATA = \
3174e5f521aSMarri Devender Rao    org/open_power/Host.errors.yaml
3184e5f521aSMarri Devender Rao```
3199067c077SDeepak Kodihalli
3209067c077SDeepak Kodihalli###### Generate elog-errors.hpp using elog parser from SDK location
3214e5f521aSMarri Devender Rao * Add a conditional check "GEN_ERRORS"
3224e5f521aSMarri Devender Rao * Disable the check for recipe bitbake image build
3234e5f521aSMarri Devender Rao * Enable it for local repository build
3244e5f521aSMarri Devender Rao * If "GEN_ERRORS" is enabled, build generates elog-errors.hpp header file.
3254e5f521aSMarri Devender Rao```
3264e5f521aSMarri Devender Rao  # Generate phosphor-logging/elog-errors.hpp
3274e5f521aSMarri Devender Rao  if GEN_ERRORS
3284e5f521aSMarri Devender Rao  ELOG_MAKO ?= elog-gen-template.mako.hpp
3294e5f521aSMarri Devender Rao  ELOG_DIR ?= ${OECORE_NATIVE_SYSROOT}${datadir}/phosphor-logging/elog
3304e5f521aSMarri Devender Rao  ELOG_GEN_DIR ?= ${ELOG_DIR}/tools/
3314e5f521aSMarri Devender Rao  ELOG_MAKO_DIR ?= ${ELOG_DIR}/tools/phosphor-logging/templates/
3324e5f521aSMarri Devender Rao  YAML_DIR ?= ${OECORE_NATIVE_SYSROOT}${datadir}/phosphor-dbus-yaml/yaml
3334e5f521aSMarri Devender Rao  phosphor-logging/elog-errors.hpp:
3344e5f521aSMarri Devender Rao      @mkdir -p ${YAML_DIR}/org/open_power/
3354e5f521aSMarri Devender Rao      @cp ${top_srcdir}/org/open_power/Host.errors.yaml \
3364e5f521aSMarri Devender Rao        ${YAML_DIR}/org/open_power/Host.errors.yaml
3374e5f521aSMarri Devender Rao      @mkdir -p `dirname $@`
3384e5f521aSMarri Devender Rao      @chmod 777 $(ELOG_GEN_DIR)/elog-gen.py
3394e5f521aSMarri Devender Rao      $(AM_V_at)$(PYTHON) $(ELOG_GEN_DIR)/elog-gen.py -y ${YAML_DIR} \
3404e5f521aSMarri Devender Rao        -t ${ELOG_MAKO_DIR} -m ${ELOG_MAKO} -o $@
3414e5f521aSMarri Devender Rao  endif
3424e5f521aSMarri Devender Rao```
3437aafb12eSNagaraju Goruganti
3449067c077SDeepak Kodihalli###### Update BUILT_SOURCES
3454e5f521aSMarri Devender Rao * Append elog-errors.hpp to BUILT_SOURCES list and put it in conditional check
3464e5f521aSMarri Devender Rao   GEN_ERRORS so that the elog-errors.hpp is generated only during local
3474e5f521aSMarri Devender Rao   repository build.
3484e5f521aSMarri Devender Rao```
3494e5f521aSMarri Devender Rao    if GEN_ERRORS
3504e5f521aSMarri Devender Rao    nobase_nodist_include_HEADERS += \
3514e5f521aSMarri Devender Rao                phosphor-logging/elog-errors.hpp
3524e5f521aSMarri Devender Rao    endif
3534e5f521aSMarri Devender Rao    if GEN_ERRORS
3544e5f521aSMarri Devender Rao    BUILT_SOURCES += phosphor-logging/elog-errors.hpp
3554e5f521aSMarri Devender Rao    endif
3564e5f521aSMarri Devender Rao```
3579067c077SDeepak Kodihalli
3589067c077SDeepak Kodihalli###### Conditional check for native build
3594e5f521aSMarri Devender Rao * As the same Makefile is used both for recipe image build and native recipe
3604e5f521aSMarri Devender Rao   build, add a conditional to ensure that only installation of error yaml files
3614e5f521aSMarri Devender Rao   happens during native build. It is not required to build repository during
3624e5f521aSMarri Devender Rao   native build.
3634e5f521aSMarri Devender Rao```
3644e5f521aSMarri Devender Rao   if !INSTALL_ERROR_YAML
3654e5f521aSMarri Devender Rao   endif
3664e5f521aSMarri Devender Rao```
3679067c077SDeepak Kodihalli
3689067c077SDeepak Kodihalli#### Autotools changes
3694e5f521aSMarri Devender Rao**Reference**
3704e5f521aSMarri Devender Rao * https://github.com/openbmc/openpower-debug-collector/blob/master/configure.ac
3717aafb12eSNagaraju Goruganti
3729067c077SDeepak Kodihalli###### Add option(argument) to enable/disable installing error yaml file
3734e5f521aSMarri Devender Rao * Install error yaml option(argument) is enabled for native recipe build
3744e5f521aSMarri Devender Rao   and disabled for bitbake build.
3754e5f521aSMarri Devender Rao
3764e5f521aSMarri Devender Rao * When install error yaml option is disabled do not check for target specific
3774e5f521aSMarri Devender Rao   packages in autotools configure script.
3784e5f521aSMarri Devender Rao
3799067c077SDeepak Kodihalli###### Add option(argument) to install error yaml files
3804e5f521aSMarri Devender Rao```
3814e5f521aSMarri Devender RaoAC_ARG_ENABLE([install_error_yaml],
3824e5f521aSMarri Devender Rao    AS_HELP_STRING([--enable-install_error_yaml],
3834e5f521aSMarri Devender Rao    [Enable installing error yaml file]),[], [install_error_yaml=no])
3844e5f521aSMarri Devender RaoAM_CONDITIONAL([INSTALL_ERROR_YAML],
3854e5f521aSMarri Devender Rao    [test "x$enable_install_error_yaml" = "xyes"])
3864e5f521aSMarri Devender RaoAS_IF([test "x$enable_install_error_yaml" != "xyes"], [
3874e5f521aSMarri Devender Rao..
3884e5f521aSMarri Devender Rao..
3894e5f521aSMarri Devender Rao])
3904e5f521aSMarri Devender Rao```
3919067c077SDeepak Kodihalli
3929067c077SDeepak Kodihalli###### Add option(argument) to enable/disable generating elog-errors header file
3934e5f521aSMarri Devender Rao```
3944e5f521aSMarri Devender RaoAC_ARG_ENABLE([gen_errors],
3954e5f521aSMarri Devender Rao    AS_HELP_STRING([--enable-gen_errors], [Enable elog-errors.hpp generation ]),
3964e5f521aSMarri Devender Rao    [],[gen_errors=yes])
3974e5f521aSMarri Devender RaoAM_CONDITIONAL([GEN_ERRORS], [test "x$enable_gen_errors" != "xno"])
3984e5f521aSMarri Devender Rao```
3994e5f521aSMarri Devender Rao
4009067c077SDeepak Kodihalli#### Recipe changes
4014e5f521aSMarri Devender Rao**Reference**
4024e5f521aSMarri Devender Rao* https://github.com/openbmc/openbmc/blob/master/meta-openbmc-machines\
4034e5f521aSMarri Devender Rao/meta-openpower/common/recipes-phosphor/debug/openpower-debug-collector.bb
4044e5f521aSMarri Devender Rao
4059067c077SDeepak Kodihalli###### Extend recipe for native and nativesdk
4064e5f521aSMarri Devender Rao* Extend the recipe for native and native SDK builds
4074e5f521aSMarri Devender Rao```
4084e5f521aSMarri Devender RaoBBCLASSEXTEND += "native nativesdk"
4094e5f521aSMarri Devender Rao```
4109067c077SDeepak Kodihalli###### Remove dependencies for native and native SDK build
4114e5f521aSMarri Devender Rao* Native recipe caters only for copying error yaml files to shared location.
4124e5f521aSMarri Devender Rao* For native and native SDK build remove dependency on packages that recipe
4134e5f521aSMarri Devender Rao  build depends
4144e5f521aSMarri Devender Rao
4159067c077SDeepak Kodihalli###### Remove dependency on phosphor-logging for native build
4164e5f521aSMarri Devender Rao```
4174e5f521aSMarri Devender RaoDEPENDS_remove_class-native = "phosphor-logging"
4184e5f521aSMarri Devender Rao```
4199067c077SDeepak Kodihalli
4209067c077SDeepak Kodihalli###### Remove dependency on phosphor-logging for native SDK build
4214e5f521aSMarri Devender Rao```
4224e5f521aSMarri Devender RaoDEPENDS_remove_class-nativesdk = "phosphor-logging"
4234e5f521aSMarri Devender Rao```
4249067c077SDeepak Kodihalli
4259067c077SDeepak Kodihalli###### Add install_error_yaml argument during native build
4264e5f521aSMarri Devender Rao* Add package config to enable/disable install_error_yaml feature.
4279067c077SDeepak Kodihalli
4289067c077SDeepak Kodihalli###### Add package config to enable/disable install_error_yaml feature
4294e5f521aSMarri Devender Rao```
4304e5f521aSMarri Devender RaoPACKAGECONFIG ??= "install_error_yaml"
4314e5f521aSMarri Devender RaoPACKAGECONFIG[install_error_yaml] = " \
4324e5f521aSMarri Devender Rao        --enable-install_error_yaml, \
4334e5f521aSMarri Devender Rao        --disable-install_error_yaml, ,\
4344e5f521aSMarri Devender Rao        "
4354e5f521aSMarri Devender Rao```
4369067c077SDeepak Kodihalli###### Enable install_error_yaml check for native build
4374e5f521aSMarri Devender Rao```
4384e5f521aSMarri Devender RaoPACKAGECONFIG_add_class-native = "install_error_yaml"
4394e5f521aSMarri Devender RaoPACKAGECONFIG_add_class-nativesdk = "install_error_yaml"
4404e5f521aSMarri Devender Rao```
4419067c077SDeepak Kodihalli###### Disable install_error_yaml during target build
4424e5f521aSMarri Devender Rao```
4434e5f521aSMarri Devender RaoPACKAGECONFIG_remove_class-target = "install_error_yaml"
4444e5f521aSMarri Devender Rao```
4454e5f521aSMarri Devender Rao
4469067c077SDeepak Kodihalli###### Disable generating elog-errors.hpp for bitbake build
4474e5f521aSMarri Devender Rao* Disable gen_errors argument for bitbake image build as the application uses
4484e5f521aSMarri Devender Rao  the elog-errors.hpp generated by phosphor-logging
4494e5f521aSMarri Devender Rao* Argument is enabled by default for local repository build in the configure
4504e5f521aSMarri Devender Rao  script of the local repository.
4514e5f521aSMarri Devender Rao```
4524e5f521aSMarri Devender Rao XTRA_OECONF += "--disable-gen_errors"
4534e5f521aSMarri Devender Rao```
4544e5f521aSMarri Devender Rao
4559067c077SDeepak Kodihalli#### Local build
4564e5f521aSMarri Devender Rao* During local build use --prefix=/usr for the configure script.
4574e5f521aSMarri Devender Rao
4583210a9f3SMatt Spinler**Reference**
4593210a9f3SMatt Spinler* https://github.com/openbmc/openpower-debug-collector/blob/master/README.md
4603210a9f3SMatt Spinler
46199c2b405SMatt Spinler## Event Log Extensions
46299c2b405SMatt Spinler
46399c2b405SMatt SpinlerThe extension concept is a way to allow code that creates other formats of
46499c2b405SMatt Spinlererror logs besides phosphor-logging's event logs to still reside in the
46599c2b405SMatt Spinlerphosphor-log-manager application.
46699c2b405SMatt Spinler
46799c2b405SMatt SpinlerThe extension code lives in the `extensions/<extension>` subdirectories,
46899c2b405SMatt Spinlerand is enabled with a `--enable-<extension>` configure flag.  The
46999c2b405SMatt Spinlerextension code won't compile unless enabled with this flag.
47099c2b405SMatt Spinler
47199c2b405SMatt SpinlerExtensions can register themselves to have functions called at the following
47299c2b405SMatt Spinlerpoints using the REGISTER_EXTENSION_FUNCTION macro.
47399c2b405SMatt Spinler* On startup
47499c2b405SMatt Spinler   * Function type void(internal::Manager&)
47599c2b405SMatt Spinler* After an event log is created
47699c2b405SMatt Spinler   * Function type void(args)
47799c2b405SMatt Spinler   * The args are:
47899c2b405SMatt Spinler     * const std::string& - The Message property
47999c2b405SMatt Spinler     * uin32_t - The event log ID
48099c2b405SMatt Spinler     * uint64_t - The event log timestamp
48199c2b405SMatt Spinler     * Level - The event level
48299c2b405SMatt Spinler     * const AdditionalDataArg& - the additional data
48399c2b405SMatt Spinler     * const AssociationEndpointsArg& - Association endpoints (callouts)
48499c2b405SMatt Spinler* Before an event log is deleted, to check if it is allowed.
48599c2b405SMatt Spinler   * Function type void(std::uint32_t, bool&) that takes the event ID
48699c2b405SMatt Spinler* After an event log is deleted
48799c2b405SMatt Spinler   * 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
49399c2b405SMatt SpinlerIn addition, an extension has the option of disabling phosphor-logging's
49499c2b405SMatt Spinlerdefault error 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:
50399c2b405SMatt Spinler* Allowing for custom old log retention algorithms.
50499c2b405SMatt Spinler* Prohibiting manual deleting of certain logs based on an extension's
50599c2b405SMatt Spinler  requirements.
50699c2b405SMatt Spinler
50799c2b405SMatt Spinler### Creating extensions
50899c2b405SMatt Spinler
50999c2b405SMatt Spinler1. Add a new flag to configure.ac to enable the extension:
51099c2b405SMatt Spinler```
51199c2b405SMatt SpinlerAC_ARG_ENABLE([foo-extension],
51299c2b405SMatt Spinler              AS_HELP_STRING([--enable-foo-extension],
51399c2b405SMatt Spinler                             [Create Foo logs]))
51499c2b405SMatt SpinlerAM_CONDITIONAL([ENABLE_FOO_EXTENSION],
51599c2b405SMatt Spinler               [test "x$enable_foo_extension" == "xyes"])
51699c2b405SMatt Spinler```
51799c2b405SMatt Spinler2. Add the code in `extensions/<extension>/`.
51899c2b405SMatt Spinler3. Create a makefile include to add the new code to phosphor-log-manager:
51999c2b405SMatt Spinler```
52099c2b405SMatt Spinlerphosphor_log_manager_SOURCES += \
52199c2b405SMatt Spinler        extensions/foo/foo.cpp
52299c2b405SMatt Spinler```
52399c2b405SMatt Spinler3. In `extensions/extensions.mk`, add the makefile include:
52499c2b405SMatt Spinler```
52599c2b405SMatt Spinlerif ENABLE_FOO_EXTENSION
52699c2b405SMatt Spinlerinclude extensions/foo/foo.mk
52799c2b405SMatt Spinlerendif
52899c2b405SMatt Spinler```
52999c2b405SMatt Spinler4. In the extension code, register the functions to call and optionally disable
53099c2b405SMatt Spinler   log capping using the provided macros:
53199c2b405SMatt Spinler```
53299c2b405SMatt SpinlerDISABLE_LOG_ENTRY_CAPS();
53399c2b405SMatt Spinler
53499c2b405SMatt Spinlervoid fooStartup(internal::Manager& manager)
53599c2b405SMatt Spinler{
53699c2b405SMatt Spinler    // Initialize
53799c2b405SMatt Spinler}
53899c2b405SMatt Spinler
53999c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooStartup);
54099c2b405SMatt Spinler
54199c2b405SMatt Spinlervoid fooCreate(const std::string& message, uint32_t id, uint64_t timestamp,
54299c2b405SMatt Spinler               Entry::Level severity, const AdditionalDataArg& additionalData,
54399c2b405SMatt Spinler               const AssociationEndpointsArg& assocs)
54499c2b405SMatt Spinler{
54599c2b405SMatt Spinler    // Create a different type of error log based on 'entry'.
54699c2b405SMatt Spinler}
54799c2b405SMatt Spinler
54899c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooCreate);
54999c2b405SMatt Spinler
55099c2b405SMatt Spinlervoid fooRemove(uint32_t id)
55199c2b405SMatt Spinler{
55299c2b405SMatt Spinler    // Delete the extension error log that corresponds to 'id'.
55399c2b405SMatt Spinler}
55499c2b405SMatt Spinler
55599c2b405SMatt SpinlerREGISTER_EXTENSION_FUNCTION(fooRemove);
55699c2b405SMatt Spinler```
5573210a9f3SMatt Spinler### Extension List
55899c2b405SMatt Spinler
5593210a9f3SMatt SpinlerThe supported extensions are:
5603210a9f3SMatt Spinler
5613210a9f3SMatt Spinler* OpenPower PELs
5623210a9f3SMatt Spinler    * Enabled with --enable-openpower-pel-extension
5633210a9f3SMatt Spinler    * Detailed information can be found
5643210a9f3SMatt Spinler        [here](extensions/openpower-pels/README.md)
565