Skip to content

Releases: jongpie/NebulaLogger

v4.17.3 - relatedLogEntries LWC Improvements

25 Feb 17:56
91518a0

Choose a tag to compare

Core Unlocked Package Changes

  • Fixed #896 reported by @anthonygiuliano (and confirmed by @dominykasvitkus) by leveraging SOSL to search for a matching record ID (instead of strictly filtering on LogEntry__c.RecordId__c)
  • Fixed #805 reported by @zimny349 by updating Apex class RelatedLogEntriesController to use toLabel() in SOQL when querying picklist fields
  • Improved the layout of the lightning card & datatable so the component visually better aligns with the appearance of standard related lists
  • Scope creep: fixed #952 reported by @Mike-Cleaver-LB by adding Apex class access for CallableLogger to the LoggerLogCreator permission set to ensure the running user can use it in contexts like OmniStudio

In the screenshots below, the same data is used (same Account record, and same LogEntry__c records exist) - only the relatedLogEntries LWC has changed between the 2 screenshots

Before:

image

After:

image

Installation Info

Core Unlocked Package - no namespace

Full Changelog: v4.17.2...v4.17.3

v4.17.2 - Bugfix: Modal Close Buttons Not Rendered Correctly

23 Feb 21:56
d375791

Choose a tag to compare

Core Unlocked Package Changes

Thanks to @gredrian08 for reporting issue #936 & fixing it in PR #937 🥳

  • Updated several LWCs to correct a problem with the X close button on modals not rendering correctly due to recent changes in SLDS v1 & v2
image

Installation Info

Core Unlocked Package - no namespace

Full Changelog: v4.17.1...v4.17.2

v4.17.1 - Bugfix: Allowing to log SObject without ID field

23 Feb 17:55
57ffd2c

Choose a tag to compare

Core Unlocked Package Changes

Thanks to @TrangOul for fixing issue #911 in PR #912 🥳

  • Updated LogEntryEventBuilder to catch/ignore exceptions caused by an SObject record not having an Id field (platform event objects are the most notable examples of this issue)

Installation Info

Core Unlocked Package - no namespace

Full Changelog: v4.17.0...v4.17.1

v4.17.0 - Summer '25 Release

23 Feb 16:16
8d50108

Choose a tag to compare

After taking a much-needed break from open source work, the v4.17.0 release is finally ready!

Managed Package Release - v4.17.0

This release is for both the unlocked package (as always), as well as the managed package! You can see everything that's changed between v4.16.0 and v4.17.0 for the managed package by reviewing:

  • The v4.17.0 milestone to see all of the issues & pull requests that are included in the this release.
  • The diff between v4.16.0 and v4.17.0 to see all of the code & metadata changes that have been committed since the last managed package release.

Managed Package Enhancements & Bugfixes

Core Unlocked Package Release - v4.17.0

These changes are new for both the unlocked package and the managed package.

Summer '25 Release Upgrade

  • Bumped all metadata to API v64.0 (Spring '26 release)
    • Also updated the list of picklist values in several 'API version' picklist fields on Log__c and LogEntry__c

Apex Logging Bugfixes

  • Updated Logger to more accurately reflect the current quiddity value when logging the system message Logger - Saving X log entries via <quiddity>
  • Fixed #910 - Updated CallableLogger to use List<String> instead of List<Object> for tags passed in via OmniStudio
    • Previously using List<Object> caused some exceptions, and the values should always be strings anyway

JavaScript Logging Bugfixes

  • Updated logger LWC to reflect the latest changes in Salesforce's JavaScript stack traces
    • These changes broke the previous stack trace parsing logic - hopefully the modified logic is more resilient to future changes
    • The Jest tests in logger.test.js have also been expanded to include parsing examples of stack traces from Chrome, Firefox, Edge - with & without debug mode (which can make a difference in the stack traces & parsing logic)
  • Updated logger LWC to immediately instantiate an internal instance of LoggerService
    • This was previously done in connectedCallback, which added an extra unnecessary event cycle that could cause some occasional goofiness

PrismJS Enhancements & Bugfixes

  • Upgraded the version of PrismJS in LoggerResources static resource from 1.29.0 to 1.30.0
  • Updated some CSS in loggerCodeViewer.css to correct some rendering issues due to changes in SLDS + SLDS v2
  • Fixed #777 - Corrected an issue in loggerCodeViewer that caused PrismJS's line highlighting to not work correctly when only 1 instance of loggerCodeViewer (used by other LWCs like logEntryMetadataViewer) was on a page

LWC Testing Improvements

  • Fixed #881 - Added more Jest tests in to the LWCs tests below to validate existing functionality that wasn't previously covered by tests:
    • logEntryEventStream.test.js
    • logEntryMetadataViewer.test.js
    • loggerHomeHeader.test.js
    • logger.test.js
    • loggerPageSection.test.js
    • loggerSettings.test.js
    • logViewer.test.js
  • Added a recipes LWC loggerWrapper to mimic orgs that use Nebula Logger's logger LWC through their own logging LWC

Apex Testing Improvements

  • Updated LogEntryEventHandler_Tests to only use mock CMDT records (instead of relying on the metadata records deployed to the org)
    • All other test classes were previously updated to only use mock records, but this particular test class was overlooked
  • Partially addressed #922 - Updated pipeline-only tests in LogEntryEventHandler_Tests_FieldMappings.cls to validate that custom picklist fields with restricted values are handled properly

Pipeline Changes

  • Updated scratch org definition files to tweak how OmniStudio is enabled in scratch orgs
  • Updated pipeline & local dev scripts to use OmniStudio managed package v258.6 (Winter '26 release)
  • Upgraded some dev dependencies in package.json

Installation Info

Core Unlocked Package - no namespace

Full Changelog: v4.16.5...v4.17.0

Core Managed Package - Nebula namespace

Full Changelog: v4.16.0...v4.17.0

v4.16.5 - Capture Apex Cursor Transaction Limits

15 Aug 20:09
c1402a9

Choose a tag to compare

Thanks to @vikashkrml for working on this release in PR #892 🥳👏

Core Unlocked Package Changes

Fixed #760 by adding auto-capturing of Apex cursor transaction limits for rows & fetch calls, stored in new fields on LogEntryEvent__e & LogEntry__c

  • Added 4 new number fields on both LogEntryEvent__e and LogEntry__c to capture Apex cursor limit values returned by the Limits class

    1. LimitsApexCursorFetchCallsUsed__c 🟰 System.Limits.getFetchCallsOnApexCursor()
    2. LimitsApexCursorFetchCallsMax__c 🟰 System.Limits.getLimitFetchCallsOnApexCursor()
    3. LimitsApexCursorRowsUsed__c 🟰 System.Limits.getApexCursorRows()
    4. LimitsApexCursorRowsMax__c 🟰 System.Limits.getLimitApexCursorRows()
  • Added 2 new formula fields on LogEntry__c to show the percentage used of both Apex cursor fetch calls and Apex cursor rows. This formula fields provide the same functionality as the other existing formula fields on LogEntry__c shown on the Transaction Limits tab of the flexipage

    image

Installation Info

Core Unlocked Package - no namespace

Full Changelog: v4.16.4...v4.16.5

v4.16.4 - Bugfix: logger LWC Initialization Message

23 Jul 23:49
2ab4af9

Choose a tag to compare

Core Unlocked Package Changes

Fixed #870 (reported by @dominykasvitkus) by updating the logger LWC initialization message to only print when JavaScript console logging is enabled via LoggerSettings__c. Also resolved some test isolation issues in logger.test.js + test improvements + code cleanup:

  • Updated loggerService.js to only call console.info() with an init message ('logger component initialized') when console logging is enabled via LoggerSettings__c.IsJavaScriptConsoleLoggingEnabled__c
  • Replaced enableSystemMessages() and disableSystemMessages() in loggerService.js with a new static variable LoggerService.areSystemMessagesEnabled (intended for internal-use only)
  • Updated logger.test.js to reset LoggerService.hasInitialized and LoggerService.areSystemMessagesEnabled static variables in beforeEach() (instead of afterAll())
  • Switched to using jest.resetAllMocks() instead of jest.clearAllMocks() in logger.test.js for better test isolation
  • Updated all test functions to consistently use all 3 logger creation methods (createLogger, getLogger, and getMarkupLogger)

Also include a 🤏 liiiiiiitle bit of scope creep:

  • Updated all Jest tests to import createElement from '@lwc/engine-dom' (instead of 'lwc')
  • Updated the project's threshold for code coverage in codecov.yml to compensate for the lower code coverage in LWC tests for now (currently around ~86%). Eventually, tests & code coverage for LWC will be improved - but for now, the constant pipeline alerts from codecov.io aren't particularly helpful 😅
  • Cleaned up a small code block in LogBatchPurger using the null coalescing operator (??) to reduce the lines of code needed
  • Corrected the label on field LoggerScenarioRule__mdt.IsLogAssignmentEnabled__c to use the term Logger Scenario, instead of the deprecated term Log Scenario

Installation Info

Core Unlocked Package - no namespace

Full Changelog: v4.16.3...v4.16.4

v4.16.3 - Made LogBatchPurger's Batch Size Configurable

21 Jul 21:16
b34b2c0

Choose a tag to compare

Core Unlocked Package Changes

Fixed #807 by adding the ability to declaratively configure the default batch size in LogBatchPurger. This can be used to reduce the batch size to help with mitigating Apex heap size exceptions that can sometimes happen in the LogBatchPurger job when deleting larger volumes of logging data. And making it now configurable makes it easy to quickly change it in orgs as needed.

  • Add new LoggerParameter__mdt record LogBatchPurgerDefaultBatchSize
  • ℹ️ The new default batch size for LogBatchPurger is now 500 (and now controlled via LogBatchPurgerDefaultBatchSize).
  • Previously, 2000 was used, but 500 is the new default to try to help avoid Apex heap size exceptions. If desired, you can update the record's Value__c field to 2000 to restore the previous value/behavior used prior to this release

Installation Info

Core Unlocked Package - no namespace

Full Changelog: v4.16.2...v4.16.3

v4.16.2 - Origin Location Stacktrace Parsing Improvement

02 Jun 20:42
4fbfaa8

Choose a tag to compare

Slight tweak to origin location stack trace parsing in Apex to improve how origin location is displayed:

  • before, it was possible for External entry point to be reported as the origin location even when a valid stacktrace was present beneath that text
  • if there is a valid stacktrace line beneath the words External entry point, those will be used as the origin location from now on

Noticed while we were cross-checking the following issue: jamessimone/apex-rollup#683 (comment)

v4.16.1 - Data Masking & String Truncation Improvements

30 May 16:34
0642147

Choose a tag to compare

Core Unlocked Package Changes

Bundled Data Masking Rules Bugfixes + New American Express (AMEX) Masking Rule

  • Bugfix: Fixed issues in the regular expressions (regexes) used in the 3 existing LogEntryDataMaskRule__mdt records (stored in the field SensitiveDataRegEx__c). The previous regexes were too aggressive, and would sometimes incorrectly mask substrings of non-credit card & non-social security number values.
    • SocialSecurityNumber
    • MastercardCreditCardNumber
    • VisaCreditCardNumber
  • Enhancement: Added a new bundled record in LogEntryDataMaskRule__mdt for American Express (AMEX) credit card numbers - AmericanExpressCreditCardNumber (similar to the existing rules for Visa & Mastercard)

Data Masking Bugfixes + Truncation Bugfixes + New *Truncated__c Boolean Fields

  • Bugfix: Fixed #695 by adding another round of string truncation after applying data masking to fix issues where string values could still be too long for the corresponding fields

    • Context: Some data masking rules can (intentionally) cause a text value's length to increase. For example, social security numbers are formatted with - dashes when masked, so values like 123456789 (9 characters) are 2 characters longer when masked as ***-**-6789 (11 characters).
    • In previous versions of Nebula Logger, text was truncated, then masked. With a combination of long text values + matching data to mask, the resulting text value could be too long. This was especially a problem for the Message__c field in several orgs, but the same issue could/did happen with several other text fields.
    • In this release, the text is truncated again after masking to ensure the data will fit into the corresponding field.
  • Optimization: Refactored some duplicated logic in LogEntryEventBuilder for truncating + masking various text values

    • There are several fields being masked + truncated (and more fields will probably be added in the future), and the existing code had a lot of code duplication happening.
  • Enhancement: Added several new *Truncated__c boolean fields on both LogEntryEvent__e & LogEntry__c for some data points where it would be helpful to have the context that data has been truncated. There are 5 sets of new fields included:

    1. LogEntryEvent__e.HttpRequestBodyTruncated__c ➡️ LogEntry__c.HttpRequestBodyTruncated__c
    2. LogEntryEvent__e.HttpResponseBodyTruncated__c ➡️ LogEntry__c.HttpResponseBodyTruncated__c
    3. LogEntryEvent__e.RecordJsonTruncated__c ➡️ LogEntry__c.RecordJsonTruncated__c
    4. LogEntryEvent__e.RestRequestBodyTruncated__c ➡️ LogEntry__c.RestRequestBodyTruncated__c
    5. LogEntryEvent__e.RestResponseBodyTruncated__c ➡️ LogEntry__c.RestResponseBodyTruncated__c
  • Enhancement: Updated the LogEntryRecordPage flexipage to add the new *Truncated__c boolean fields on LogEntry__c (mentioned above, and shown below)

    • These fields are configured to only show on the page when true, similar to the behavior used for the existing *Masked__c fields, like LogEntry__c.MessageMasked__c & LogEntry__c.RecordJsonMasked__c

    image

    image

    image

    image

    image

Pipeline Improvements for extra-tests Directory

  • DevOps/Pipeline Improvement: Added new pipeline-only test classes with integration tests to validate that the custom metadata type (CMDT) records bundled with Nebula Logger work as expected
    • This includes validating records in LogEntryDataMaskRule__mdt, LoggerParameter__mdt, LoggerSObjectHandler__mdt, and LogStatus__mdt
    • Since orgs can choose to modify or delete the bundled CMDT records, this level of testing needs to happen just in the pipeline
  • Re-organized the Apex test classes + metadata in nebula-logger/extra-tests to make it a little more clear what everything is being used for. The number of files has grown a lot over the last few years, so a little cleanup was needed.
    • This directory's metadata is only used by the pipeline to more thoroughly test some features & metadata that's bundled with Nebula Logger - none of it is included when installing Nebula Logger, so these changes should not have any direct impact to people using Nebula Logger.

Installation Info

Core Unlocked Package - no namespace

Full Changelog: v4.16.0...v4.16.1

v4.16.0 - Spring '25 Release

22 Apr 14:59
323fa77

Choose a tag to compare

🧙‍♂️An open source release is never late, nor is it early. It arrives precisely when it means to. And also when I have the time to work on it. 🧙‍♂️

A huge thanks goes to everyone that's contributed to this release over the last several months! There has been a great mix of bug reporting, features requests, discussions + feedback, and code contributions. This has all been incredibly helpful in delivering some great enhancements this release. So thanks again to everyone that's helped!

Managed Package Release - v4.16.0

This release is for both the unlocked package (as always), as well as the managed package! You can see everything that's changed between v4.15.0 and v4.16.0 for the managed package by reviewing:

  • The v4.16.0 milestone to see all of the issues & pull requests that are included in the this release.
  • The diff between v4.15.0 and v4.16.0 to see all of the code & metadata changes that have been committed since the last managed package release.

Apex Logging Enhancements

  • Release v4.15.2 - Added Support for Logging Instances of Database.EmptyRecycleBinResult and List<Database.EmptyRecycleBinResult> by @TrangOul and @jongpie (PR #806) → closed issue #804 reported by (also) @TrangOul

    • Add new instance method overloads in Nebula.LogEntryEventBuilder for setDatabaseResult() to support logging instances of Database.EmptyRecycleBinResult and List<Database.EmptyRecycleBinResult>

      global Nebula.LogEntryEventBuilder setDatabaseResult(Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global Nebula.LogEntryEventBuilder setDatabaseResult(List<Database.EmptyRecycleBinResult> emptyRecycleBinResults);
    • Added new static method overloads in Logger to make it easier to log instances of Database.EmptyRecycleBinResult and List<Database.EmptyRecycleBinResult>

      global static Nebula.LogEntryEventBuilder error(Nebula.LogMessage logMessage, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder error(String message, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder warn(Nebula.LogMessage logMessage, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder warn(String message, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder info(Nebula.LogMessage logMessage, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder info(String message, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder debug(Nebula.LogMessage logMessage, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder debug(String message, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder fine(Nebula.LogMessage logMessage, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder fine(Nebula.LogMessage logMessage, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder finer(String message, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder finer(String message, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder finest(String message, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder finest(String message, Database.EmptyRecycleBinResult emptyRecycleBinResult);
      global static Nebula.LogEntryEventBuilder logDatabaseErrors(System.LoggingLevel loggingLevel, Nebula.LogMessage logMessage, List<Database.EmptyRecycleBinResult> emptyRecycleBinResults);
      global static Nebula.LogEntryEventBuilder logDatabaseErrors(System.LoggingLevel loggingLevel, String message, List<Database.EmptyRecycleBinResult> emptyRecycleBinResults);
  • Release v4.15.10 - Approval Results Logging by @TrangOul, @jamessimone, and @jongpie (#850) → closed issue #844 reported by @PawelWozniak

    • Added new setApprovalResult() methods in Nebula.LogEntryEventBuilder for logging instances of the standard Apex classes Approval.LockResult, Approval.ProcessResult, Approval.UnlockResult, as well as lists of each class

      global Nebula.LogEntryEventBuilder setApprovalResult(Approval.LockResult lockResult);
      global Nebula.LogEntryEventBuilder setApprovalResult(Approval.ProcessResult processResult);
      global Nebula.LogEntryEventBuilder setApprovalResult(Approval.UnlockResult unlockResult);
      global Nebula.LogEntryEventBuilder setApprovalResult(List<Approval.LockResult> lockResults);
      global Nebula.LogEntryEventBuilder setApprovalResult(List<Approval.ProcessResult> processResults);
      global Nebula.LogEntryEventBuilder setApprovalResult(List<Approval.UnlockResult> unlockResults);
    • Note: for now, the decision has been made to not provide overloads in Nebula.Logger for logging the approval classes - this is a little different from logging Database result classes, where Nebula.Logger does provide static method overloads. See this related comment for more details on why this decision was made for Approval result classes.

    • Example usage:

      SObject someRecord = [SELECT Id FROM Account LIMIT 1];
      Approval.LockResult lockResult = Approval.lock(someRecord);
      
      // The builder's new method overloads setApprovalResult() can be called to capture approval details
      Nebula.Logger.debug('Locked record for approval', someRecord)
          .setApprovalResult(lockResult);
      Nebula.Logger.saveLog();
    • The approval result data is stored in the existing set of DatabaseResult* fields on LogEntry__c like LogEntry__c.DatabaseResultType__c, shown below:

      image

CallableLogger / OmniStudio Logging Enhancements

Bugfixes

Read more