[WIP] Custom Field Mappings - jongpie/NebulaLogger GitHub Wiki

Since v4.13.14, Nebula Logger provides the ability to add your own custom fields to its included custom objects. This is helpful in orgs that want to extend Nebula Logger's included data model by creating their own org/project-specific fields.

Summary

To start using custom field mappings, there are 4 steps:

  1. Add a custom field on LogEntryEvent__e (using whatever data type you want).
  2. Add a corresponding custom field on either Log__c or LogEntry__c.
  3. Create a mapping record in LoggerFieldMapping__mdt.
  4. Set your custom fields in code when logging.

[!NOTE]
Note: this functionality currently only works in Apex & JavaScript. Flows & OmniStudio can't currently use this feature.

  • Issue #719 is for adding equivalent functionality for Flow
  • Issue #861 is for adding equivalent functionality for OmniStudio

Adding custom fields to the platform event LogEntryEvent__e

To get started, the first step is to add a field to the platform LogEntryEvent__e`

  • Create your own custom fields on LogEntryEvent__e. Any data type supported by platform events can be used.

    • In this example, a custom text field called SomeCustomField__c has been added:

      image

  • Populate your own custom fields in Apex by calling one of the two new instance methods on LogEntryEventBuilder:

    1. setField(Schema.SObjectField field, Object fieldValue)
    2. setField(Map<Schema.SObjectField, Object> fieldToValue)

For now, this functionality is available in Apex. Long-term, equivalent functionality will hopefully be added for Flow & Lightning Components. Here is an example of using the 2 new methods in Apex:

Logger.info('hello, world')
    // Set a single field
    .setField(LogEntryEvent__e.SomeCustomTextField__c, 'some text value')
    // Set multiple fields
    .setField(new Map<Schema.SObjectField, Object>{
        LogEntryEvent__e.AnotherCustomTextField__c => 'another text value',
        LogEntryEvent__e.SomeCustomDatetimeField__c => System.now()
    });

Adding custom fields to the custom objects Log__c, LogEntry__c, and LoggerScenario__c

If you want to store the data in one of Nebula Logger's custom objects, you can follow the above steps, and also...

  • Create an equivalent custom field on one of Nebula Logger's custom objects - right now, only Log__c, LogEntry__c, and LoggerScenario__c are supported.

  • In this example, a custom text field also called SomeCustomField__c has been added to Log__c object - this will be used to store the value of the field LogEntryEvent__e.SomeCustomField__c:

    image

  • Create a record in the new CMDT LoggerFieldMapping__mdt to map the LogEntryEvent__e custom field to the custom object's custom field, shown below. Nebula Logger will automatically populate the custom object's target field with the value of the source LogEntryEvent__e field.

    • In this example, a custom text field called SomeCustomField__c has been added to both LogEntryEvent__e and Log__c.

      image

Setting Custom Fields in Apex

TODO

Setting Custom Fields in JavaScript

Resolved #718 by adding the ability to set custom fields on a log entry in JavaScript (lightning components), using a new function setField() in logEntryBuilder.js. This is the JavaScript equivalent to the Apex method overloads setField() in LogEntryEventBuilder.cls that were introduced in release v4.13.14.

  • To use the new setField() function, pass an object as the function's single parameter. The object should contain the custom fields on LogEntryEvent__e that you want to set, along with their corresponding values. For example: { SomeField__c": "some value", "AnotherField__c": "another value" }

    import { createLogger } from "c/logger";
    
    export default class LoggerCustomFieldDemo extends LightningElement {
      logger;
    
      async connectedCallback() {
        this.logger = await createLogger();
    
        this.logger.info("Hello, world! This log entry has 2 custom fields set.")
          .setField({
            SomeCustomTextField__c: "some text value",
            SomeCustomNumberField__c: 123,
          });
    
        this.logger.debug("Hello again, world! This log entry has 1 other custom field set.")
          .setField({
            AnotherCustomTextField__c: "another text value",
          });
    
        this.logger.saveLog();
      }
    }