xref: /openbmc/phosphor-logging/README.md (revision 140d496e6a18f66cc225316465dfe5f4b6469456)
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