Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
08e7340
Updated LoggerEndUser permission set to have (minimal) CRUD access so…
jongpie Feb 25, 2026
eae6dc6
Upgraded from using sfdx-scanner to code-analyzer v5 (including borro…
jongpie Feb 26, 2026
b2094b7
Suppressed several Apex PMD violations now being reported via code-an…
jongpie Feb 26, 2026
7152d07
Used the new Salesforce-UX slds-linter tool to auto-fix several SLDS …
jongpie Feb 26, 2026
c0a1f99
Bumped all metadata to API v65.0 (Winter '26 release)
jongpie Feb 26, 2026
d8da007
Updated several Apex classes so system messages consistently use 'Neb…
jongpie Feb 26, 2026
1051e75
Retrieved all metadata after upgrading to API v65.0, which resulted i…
jongpie Feb 26, 2026
2bbf92d
Added Apex class access for CallableLogger to LoggerAdmin permission set
jongpie Feb 26, 2026
47e2fb2
Bumped package version number, name, and description
jongpie Feb 26, 2026
72fb8a8
Updated build.yml to reflect that sfdx scanner has been replaced with…
jongpie Feb 26, 2026
5c9c3ef
Worked with @jamessimone to resolve some lingering issues caused by u…
jongpie Feb 26, 2026
ab66693
Updated several Apex classes to suppress some PMD warnings that are n…
jongpie Feb 26, 2026
f409173
Updated several LWCs & their Jest tests to either improve some of the…
jongpie Mar 4, 2026
bbfff0f
Fixed a Apex test failure caused by a small change to a system-genera…
jongpie Mar 4, 2026
3b6ed92
Created new core unlocked package version
actions-user Mar 4, 2026
777fd1a
Generated updated package.xml manifest file for core unlocked package…
actions-user Mar 4, 2026
5f808a0
[skip ci] Added new managed package version ID
jongpie Mar 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
7 changes: 0 additions & 7 deletions .eslintignore

This file was deleted.

5 changes: 2 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,11 @@ jobs:
if: ${{ (github.event_name == 'pull_request') && (github.event.pull_request.draft == false) && (steps.changes.outputs.core == 'true') }}
run: npm run package:version:number:verify

- name: 'Verify LWC with ESLint'
- name: 'Verify LWC with Code Analyzer'
run: npm run scan:lwc

- name: 'Verify Apex with SFDX Scanner'
- name: 'Verify Apex with Code Analyzer'
run: |
npm run sf:plugins:link:scanner
npm run scan:apex

# TODO - uncomment - temporarily commented-out due to an issue with apexdocs in the pipeline
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ yarn.lock
*.log
**/lwc/jsconfig.json
.config
code-analyzer*.json
32 changes: 8 additions & 24 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,33 +5,29 @@

The most robust observability solution for Salesforce experts. Built 100% natively on the platform, and designed to work seamlessly with Apex, Lightning Components, Flow, OmniStudio, and integrations.

## Unlocked Package - v4.17.3
## Unlocked Package - v4.18.0

[![Install Unlocked Package in a Sandbox](./images/btn-install-unlocked-package-sandbox.png)](https://test.salesforce.com/packaging/installPackage.apexp?p0=04tg70000001IMHAA2)
[![Install Unlocked Package in Production](./images/btn-install-unlocked-package-production.png)](https://login.salesforce.com/packaging/installPackage.apexp?p0=04tg70000001IMHAA2)
[![Install Unlocked Package in a Sandbox](./images/btn-install-unlocked-package-sandbox.png)](https://test.salesforce.com/packaging/installPackage.apexp?p0=04tg70000001jUXAAY)
[![Install Unlocked Package in Production](./images/btn-install-unlocked-package-production.png)](https://login.salesforce.com/packaging/installPackage.apexp?p0=04tg70000001jUXAAY)
[![View Documentation](./images/btn-view-documentation.png)](https://github.com/jongpie/NebulaLogger/wiki)

`sf package install --wait 20 --security-type AdminsOnly --package 04tg70000001IMHAA2`
`sf package install --wait 20 --security-type AdminsOnly --package 04tg70000001jUXAAY`

---

## Managed Package - v4.17.0
## Managed Package - v4.18.0

[![Install Managed Package in a Sandbox](./images/btn-install-managed-package-sandbox.png)](https://test.salesforce.com/packaging/installPackage.apexp?mgd=true&p0=04tg70000000r5xAAA)
[![Install Managed Package in Production](./images/btn-install-managed-package-production.png)](https://login.salesforce.com/packaging/installPackage.apexp?mgd=true&p0=04tg70000000r5xAAA)
[![Install Managed Package in a Sandbox](./images/btn-install-managed-package-sandbox.png)](https://test.salesforce.com/packaging/installPackage.apexp?mgd=true&p0=04tg70000001jSvAAI)
[![Install Managed Package in Production](./images/btn-install-managed-package-production.png)](https://login.salesforce.com/packaging/installPackage.apexp?mgd=true&p0=04tg70000001jSvAAI)
[![View Milestone](./images/btn-view-managed-package-milestone.png)](https://github.com/jongpie/NebulaLogger/milestone/16?closed=1)

`sf package install --wait 30 --security-type AdminsOnly --package 04tg70000000r5xAAA`
`sf package install --wait 30 --security-type AdminsOnly --package 04tg70000001jSvAAI`

---

> [!NOTE]
> Starting in September 2024, Nebula Logger's documentation is being rewritten & consolidated into [the wiki](https://github.com/jongpie/NebulaLogger/wiki). Most of the content show below will eventually be migrated to the wiki instead.

## Features

1. A unified logging tool that supports easily adding log entries across the Salesforce platform, using:

- [Apex](https://github.com/jongpie/NebulaLogger/wiki/Logging-in-Apex): classes, triggers, and anonymous Apex scripts
- [Lightning Components](https://github.com/jongpie/NebulaLogger/wiki/Logging-in-Components): lightning web components (LWCs) & aura components
- [Flow & Process Builder](https://github.com/jongpie/NebulaLogger/wiki/Logging-in-Flow): any Flow type that supports invocable actions
Expand All @@ -40,7 +36,6 @@ The most robust observability solution for Salesforce experts. Built 100% native
2. Built with an event-driven pub/sub messaging architecture, using `LogEntryEvent__e` [platform events](https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_intro.htm). For more details on leveraging platform events, see [the Platform Events Developer Guide site](https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_subscribe_cometd.htm)

3. Actionable observability data about your Salesforce org, available directly in your Salesforce org via the 5 included custom objects

- `Log__c`
- `LogEntry__c`
- `LogEntryTag__c`
Expand All @@ -54,7 +49,6 @@ The most robust observability solution for Salesforce experts. Built 100% native
8. Dynamically assign tags to `Log__c` and `LogEntry__c` records for tagging/labeling your logs
9. Extendable with a built-in plugin framework: easily build or install plugins that enhance Nebula Logger, using Apex or Flow (not currently available in the managed package)
10. ISVs & package developers have several options for leveraging Nebula Logger in your own packages

- **Optional Dependency**: dynamically leverage Nebula Logger in your own packages - when it's available in a subscriber's org - using [Apex's `Callable` interface](https://developer.salesforce.com/docs/atlas.en-us.apexref.meta/apexref/apex_interface_System_Callable.htm) and Nebula Logger's included implementation `CallableLogger` (requires `v4.14.10` of Nebula Logger or newer)
- **Hard Dependency**: add either Nebula Logger's unlocked (no namespace) package or its managed package (`Nebula` namespace) as a dependency for your package to ensure customers always have a version of Nebula Logger installed
- **No Dependency**: Bundle Nebula Logger's metadata into your own project - all of Nebula Logger's metadata is fully open source & freely available. This approach provides with full control of what's included in your own app/project.
Expand Down Expand Up @@ -653,18 +647,14 @@ This feature requires that you populate your custom fields yourself, and is only
The first step is to add a field to the platform event `LogEntryEvent__e`

- Create a custom field 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:

![Custom Field on LogEntryEvent__e](./images/custom-field-log-entry-event.png)

- In Apex, you have 2 ways to populate your custom fields

1. Set the field once per transaction - every `LogEntryEvent__e` logged in the transaction will then automatically have the specified field populated with the same value.
- This is typically used for fields that are mapped to an equivalent `Log__c` or `LoggerScenario__c` field.

- How: call the static method overloads `Logger.setField(Schema.SObjectField field, Object fieldValue)` or `Logger.setField(Map<Schema.SObjectField, Object> fieldToValue)`

2. Set the field on a specific `LogEntryEvent__e` record - other records will not have the field automatically set.
- This is typically used for fields that are mapped to an equivalent `LogEntry__c` field.
- How: call the instance method overloads `LogEntryEventBuilder.setField(Schema.SObjectField field, Object fieldValue)` or `LogEntryEventBuilder.setField(Map<Schema.SObjectField, Object> fieldToValue)`
Expand All @@ -682,12 +672,9 @@ The first step is to add a field to the platform event `LogEntryEvent__e`
```

- In JavaScript, you have 2 ways to populate your custom fields. These are very similar to the 2 ways available in Apex (above).

1. Set the field once per component - every `LogEntryEvent__e` logged in your component will then automatically have the specified field populated with the same value.
- This is typically used for fields that are mapped to an equivalent `Log__c` or `LoggerScenario__c` field.

- How: call the `logger` LWC function `logger.setField(Object fieldToValue)`

2. Set the field on a specific `LogEntryEvent__e` record - other records will not have the field automatically set.
- This is typically used for fields that are mapped to an equivalent `LogEntry__c` field.
- How: call the instance function `LogEntryEventBuilder.setField(Object fieldToValue)`
Expand Down Expand Up @@ -717,13 +704,11 @@ The first step is to add a field to the platform event `LogEntryEvent__e`
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`:

![Custom Field on LogEntryEvent__e](./images/custom-field-log.png)

- 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`.

![Custom Field on LogEntryEvent__e](./images/custom-field-mapping.png)
Expand Down Expand Up @@ -820,7 +805,6 @@ Two Apex classes are provided out-of-the-box to handle automatically deleting ol
If you want to add your own automation to the `Log__c` or `LogEntry__c` objects, you can leverage Apex or Flow to define "plugins" - the logger system will then automatically run the plugins after each trigger event (BEFORE_INSERT, BEFORE_UPDATE, AFTER_INSERT, AFTER_UPDATE, and so on). This framework makes it easy to build your own plugins, or deploy/install others' prebuilt packages, without having to modify the logging system directly.

- Flow plugins: your Flow should be built as auto-launched Flows with these parameters:

1. `Input` parameter `triggerOperationType` - The name of the current trigger operation (such as BEFORE_INSERT, BEFORE_UPDATE, etc.)
2. `Input` parameter `triggerNew` - The list of logger records being processed (`Log__c` or `LogEntry__c` records)
3. `Output` parameter `updatedTriggerNew` - If your Flow makes any updates to the collection of records, you should return a record collection containing the updated records
Expand Down
Loading