v4.16.0 - Spring '25 Release
π§ββοΈ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 ofDatabase.EmptyRecycleBinResult
andList<Database.EmptyRecycleBinResult>
by @TrangOul and @jongpie (PR #806) β closed issue #804 reported by (also) @TrangOul-
Add new instance method overloads in
Nebula.LogEntryEventBuilder
forsetDatabaseResult()
to support logging instances ofDatabase.EmptyRecycleBinResult
andList<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 ofDatabase.EmptyRecycleBinResult
andList<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 inNebula.LogEntryEventBuilder
for logging instances of the standard Apex classesApproval.LockResult
,Approval.ProcessResult
,Approval.UnlockResult
, as well as lists of each classglobal 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 loggingDatabase
result classes, whereNebula.Logger
does provide static method overloads. See this related comment for more details on why this decision was made forApproval
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 onLogEntry__c
likeLogEntry__c.DatabaseResultType__c
, shown below:
-
CallableLogger
/ OmniStudio Logging Enhancements
- β
πRelease
v4.15.6
- OmniStudio Logging Enhancements by @jamessimone (PR #835) β closed issue #814 reported by @j-fischer while working on some related enhancements inrflib
- Closed #814 by adding a new
tryCatch
callable method for OmniStudio withinCallableLogger
- Fixed a
System.TypeException
issue in OmniStudio when attempting to add tags to a log entry withinCallableLogger
- Docs: added some explanatory comments for the OmniStudio-specific code within
CallableLogger
- Closed #814 by adding a new
Bugfixes
-
πRelease
v4.15.7
- Fixed Stacktrace Parsing & Reducedlogger.test.js
by @jamessimone (PR #840) β closed issue #780 reported by @jongpie- Fixed an issue in
loggerStackTrace.js
that would cause an unintended exception when there isn't a valid JavaScript stack trace- This issue previously could happen when logging within the managed package, as well as in some browser configs that have more restrictive settings enabled.
- Added
@api
decorator to the the functionlogger.setField()
so that it can be used when logging in Aura components.- This function was added in release
v4.14.4
, but wasn't previously accessible by Aura components.
- This function was added in release
- Closed #780 by cleaning up
logger.test.js
, resulting in, 1,400 lines of JavaScript code being removed! π§Ή
- Fixed an issue in
-
πRelease
v4.15.4
-FlowLogger
Exception Message Handling by @jamessimone (PR #828) β closed issue #827 reported by @shuylern & @andrewofornikar via discussion #823- Fixed #827:
FlowLogger
now properly truncates theLogEntryEvent__e.ExceptionMessage__c
field. Previously, long values would have caused an exception & prevented the correspondingLogEntryEvent__e
from being properly published.
- Fixed #827:
-
πRelease
v4.15.5
- Bugfix for AuthSession with NullLoginHistory
Exception by @camillerev (PR #831)- Added safe navigation operator on
LoginHistory
fromAuthSession
records to avoid aNullPointerException
- Fixed an issue where
Log__c.ImpersonatedBy__c
was not set whenAuthSession
data is queried async
- Added safe navigation operator on
-
β πRelease
v4.15.9
- Bugfix: Entry Save Override Is Not Always Used by @jongpie (PR #857) β fixed issue #856 reported by @jvega-intakedesk via discussion #855
Optimizations
-
ποΈRelease
v4.15.8
- Custom Index forLog__c.ParentLogTransactionId__c
by @jamessimone (PR #849) β fixed issue #847 reported by @jet89cook-google, @mkhokhlov, and @tsalb- Fixed #847 by adding
Log__c.ParentLogTransactionId__c
custom index to speed up code & queries that use this field
- Fixed #847 by adding
-
ποΈRelease
v4.15.1
- System.OrgLimits Optimisations by @ngreardSF (PR #802) β closed issue #801 reported by (also) @ngreardSF- Updated
LogHandler
class to cache the Apex call toSystem.OrgLimits.getMap()
inloadOrganizationLimits()
to reduce CPU usage - Added some comments + updated some existing variable names & class name to include 'serializable' to provide a little more context on why there is a custom class for org limits
- Updated
-
ποΈRelease
v4.15.3
- Improved Testability of Queries by @jongpie (PR #813) β fixed issue #687 reported by @heapallocation, fixed issue #457 reported by @JeroenSfdc via discussion #454, and fixed issue #812 reported by @angelikagalang via discussion #799- Fixed #687: Improved how records are queried & converted to the inner classes in
LoggerSObjectProxy
, which are used for dynamically interacting with some standard SObject types that don't exist in all orgs (Network
,OmniProcess
, etc.) - These changes improve the testability of this part of the code base, resulting in more thorough tests & improved code coverage for the core package
- Fixed #457 and fixed #812: Changed Nebula Logger's behavior during test execution so that the org's actual CMDT records are now loaded & used (e.g., records in
LoggerParameter__mdt
). This is controlled internally by Nebula Logger via a new Apex classLoggerConfigurationSelector
- This provides admins & developers with the ability to fully test their usage of Nebula Logger, including any customizations that have been made to the included CMDT records
- Internally, Nebula Logger's own tests still only use mock CMDT records - they do not leverage the org's actual CMDT records
- Scope creep: added access for the existing Visualforce page
LogMassDelete
to the permission setsLoggerAdmin
,LoggerLogViewer
, andLoggerEndUser
- This page has been around for ~3 years, but the permission sets didn't explicitly provide access to the page
- Fixed #687: Improved how records are queried & converted to the inner classes in
Core Unlocked Package Release - v4.16.0
These changes are new for both the unlocked package and the managed package.
Spring '25 Release Upgrade
- Bumped all metadata to API
v63.0
(Spring '25 release)- Also updated the list of picklist values in several 'API version' picklist fields on
Log__c
andLogEntry__c
- Also updated the list of picklist values in several 'API version' picklist fields on
- Greatly simplified the management of field permissions in all 4 permissions sets (listed below) by using the new object-level permission option
<viewAllFields>
(added in Spring '25)LoggerAdmin
LoggerLogViewer
LoggerEndUser
LoggerLogCreator
CallableLogger
/ OmniStudio Logging Improvements
- Fixed issue #837 reported by @gokhalesamruddhi by changing how some fields are set on new OmniStudio entries to avoid a
NullPointerException
when the entry's logging level doesn't meet the user's logging level - Scope creep: added the ability in
CallableLogger
to overrideshouldSave
on new entries, similar to using Logger method overloads likeLogger.newEntry(System.LoggingLevel loggingLevel, String message, Boolean shouldSave)
- This provides the ability in OmniStudio to force a log entry to save, even if the entry's logging level doesn't meet the user's configured logging level.
Dev / Pipeline Changes
- Upgraded several
devDependencies
items inpackage.json
/ regeneratedpackage-lock.json
- Started some foundational work to create a project-specific dev container. Eventually, this will be used both for 'local' dev (by me) & within the pipeline (
build.yml
). Three new files have been added to the repo:.devcontainer/devcontainer.json
- provides a consistent dev setup + extensions in VS Code.devcontainer/Dockerfile
- provides a consistent dev environment + dependencies in a Docker container.github/workflows/publish-docker-container.yml
- auto-publishes a Docker image- Eventually, the new Docker image will be used both for 'local' dev (by me) & within the pipeline (
build.yml
)
- Eventually, the new Docker image will be used both for 'local' dev (by me) & within the pipeline (
Installation Info
Core Unlocked Package - no namespace
Full Changelog: v4.15.10...v4.16.0
- SF CLI:
sf package install --wait 20 --security-type AdminsOnly --package 04t5Y0000015pGyQAI
- Sandbox: https://test.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015pGyQAI
- Production: https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015pGyQAI
Core Managed Package - Nebula
namespace
Full Changelog: v4.15.0...v4.16.0
- SF CLI:
sf package install --wait 20 --security-type AdminsOnly --package 04t5Y0000015pGtQAI
- Sandbox: https://test.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015pGtQAI
- Production: https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015pGtQAI