diff --git a/nebula-logger/core/main/log-management/flexipages/LogRecordPage.flexipage-meta.xml b/nebula-logger/core/main/log-management/flexipages/LogRecordPage.flexipage-meta.xml index a74ebf30b..974483a16 100644 --- a/nebula-logger/core/main/log-management/flexipages/LogRecordPage.flexipage-meta.xml +++ b/nebula-logger/core/main/log-management/flexipages/LogRecordPage.flexipage-meta.xml @@ -7,7 +7,7 @@ actionNames - Log__c.ViewLogJSON + Log__c.OpenViewer ChangeOwnerOne diff --git a/nebula-logger/core/main/log-management/layouts/Log__c-Log Layout.layout-meta.xml b/nebula-logger/core/main/log-management/layouts/Log__c-Log Layout.layout-meta.xml index 1ef166d1d..161423505 100644 --- a/nebula-logger/core/main/log-management/layouts/Log__c-Log Layout.layout-meta.xml +++ b/nebula-logger/core/main/log-management/layouts/Log__c-Log Layout.layout-meta.xml @@ -321,7 +321,7 @@ Record - Log__c.ViewLogJSON + Log__c.OpenViewer QuickAction 0 diff --git a/nebula-logger/core/main/log-management/lwc/logJSON/__tests__/data/getLog.json b/nebula-logger/core/main/log-management/lwc/logJSON/__tests__/data/getLog.json deleted file mode 100644 index f1ac7fc0f..000000000 --- a/nebula-logger/core/main/log-management/lwc/logJSON/__tests__/data/getLog.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "Name": "Log-1234567890" -} diff --git a/nebula-logger/core/main/log-management/lwc/logJSON/__tests__/logJSON.test.js b/nebula-logger/core/main/log-management/lwc/logJSON/__tests__/logJSON.test.js deleted file mode 100644 index d0063f41f..000000000 --- a/nebula-logger/core/main/log-management/lwc/logJSON/__tests__/logJSON.test.js +++ /dev/null @@ -1,71 +0,0 @@ -import { createElement } from 'lwc'; -import LogJSON from 'c/logJSON'; -import getLog from '@salesforce/apex/Logger.getLog'; -import { registerApexTestWireAdapter } from '@salesforce/sfdx-lwc-jest'; - -// Mock data -const mockGetLog = require('./data/getLog.json'); - -// Register a test wire adapter -const getLogAdapter = registerApexTestWireAdapter(getLog); - -document.execCommand = jest.fn(); - -jest.mock( - '@salesforce/apex/Logger.getLog', - () => { - return { - default: () => mockGetLog - }; - }, - { virtual: true } -); - -describe('Logger JSON Viewer lwc tests', () => { - afterEach(() => { - while (document.body.firstChild) { - document.body.removeChild(document.body.firstChild); - } - jest.clearAllMocks(); - }); - - it('sets document title', async () => { - const logViewerElement = createElement('c-log-json', { is: LogJSON }); - document.body.appendChild(logViewerElement); - getLogAdapter.emit(mockGetLog); - - await Promise.resolve(); - expect(logViewerElement.title).toEqual('JSON for ' + mockGetLog.Name); - }); - - it('defaults to brand button variant', async () => { - const logViewer = createElement('c-log-json', { is: LogJSON }); - document.body.appendChild(logViewer); - - getLogAdapter.emit(mockGetLog); - - await Promise.resolve(); - const inputButton = logViewer.shadowRoot.querySelector('lightning-button-stateful'); - expect(logViewer.title).toEqual('JSON for ' + mockGetLog.Name); - expect(inputButton.variant).toEqual('brand'); - }); - - it('copies the JSON to the clipboard', async () => { - const logViewer = createElement('c-log-json', { is: LogJSON }); - document.body.appendChild(logViewer); - - getLogAdapter.emit(mockGetLog); - - // Resolve a promise to wait for a rerender of the new content - return Promise.resolve() - .then(() => { - let copyJsonBtn = logViewer.shadowRoot.querySelector('lightning-button-stateful[data-id="copy-json-btn"]'); - copyJsonBtn.click(); - }) - .then(() => { - const clipboardContent = JSON.parse(logViewer.shadowRoot.querySelector('pre').textContent); - expect(clipboardContent).toEqual(mockGetLog); - expect(document.execCommand).toHaveBeenCalledWith('copy'); - }); - }); -}); diff --git a/nebula-logger/core/main/log-management/lwc/logJSON/logJSON.css b/nebula-logger/core/main/log-management/lwc/logJSON/logJSON.css deleted file mode 100644 index ed52f8b6a..000000000 --- a/nebula-logger/core/main/log-management/lwc/logJSON/logJSON.css +++ /dev/null @@ -1,11 +0,0 @@ -pre { - max-height: 500px; - margin: auto 10px; - overflow-y: scroll; -} - -.slds-modal__content { - overflow-y: hidden !important; - height: unset !important; - max-height: unset !important; -} diff --git a/nebula-logger/core/main/log-management/lwc/logJSON/logJSON.html b/nebula-logger/core/main/log-management/lwc/logJSON/logJSON.html deleted file mode 100644 index 063f43544..000000000 --- a/nebula-logger/core/main/log-management/lwc/logJSON/logJSON.html +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/nebula-logger/core/main/log-management/lwc/logJSON/logJSON.js b/nebula-logger/core/main/log-management/lwc/logJSON/logJSON.js deleted file mode 100644 index e55298e16..000000000 --- a/nebula-logger/core/main/log-management/lwc/logJSON/logJSON.js +++ /dev/null @@ -1,68 +0,0 @@ -/************************************************************************************************* - * This file is part of the Nebula Logger project, released under the MIT License. * - * See LICENSE file or go to https://github.com/jongpie/NebulaLogger for full license details. * - ************************************************************************************************/ - -import { api, LightningElement, wire } from 'lwc'; -import getLog from '@salesforce/apex/Logger.getLog'; - -export default class LogJSON extends LightningElement { - @api - recordId; - - log; - logJSON; - jsonCopied = false; - - @wire(getLog, { logId: '$recordId' }) - wiredGetLog(result) { - this.log = result; - - let formattedLog; - // Sort the keys (fields) in the log object - if (result.data) { - formattedLog = Object.keys(result.data) - .sort() - .reduce((obj, key) => { - obj[key] = result.data[key]; - return obj; - }, {}); - } - this.logJSON = JSON.stringify(formattedLog, null, '\t'); - } - - @api - get title() { - return this.log.data ? 'JSON for ' + this.log.data.Name : ''; - } - - get variant() { - return this.jsonCopied ? 'success' : 'brand'; - } - - async copyToClipboard() { - const value = this.template.querySelector('pre').textContent; - - const textArea = document.createElement('textarea'); - textArea.value = value; - // Avoid scrolling to bottom - textArea.style.top = '0'; - textArea.style.left = '0'; - textArea.style.position = 'fixed'; - - document.body.appendChild(textArea); - textArea.focus(); - textArea.select(); - document.execCommand('copy'); - document.body.removeChild(textArea); - - /* eslint-disable-next-line no-console */ - console.log('Log data successfully copied to clipboard', JSON.parse(value)); - this.jsonCopied = true; - - /* eslint-disable-next-line @lwc/lwc/no-async-operation */ - setTimeout(() => { - this.jsonCopied = false; - }, 5000); - } -} diff --git a/nebula-logger/core/main/log-management/lwc/logViewer/__tests__/data/getLog.json b/nebula-logger/core/main/log-management/lwc/logViewer/__tests__/data/getLog.json new file mode 100644 index 000000000..051b2cfec --- /dev/null +++ b/nebula-logger/core/main/log-management/lwc/logViewer/__tests__/data/getLog.json @@ -0,0 +1,849 @@ +{ + "ApiReleaseNumber__c": "236.12", + "ApiReleaseVersion__c": "Spring '22 Patch 12", + "ApiVersion__c": "v54.0", + "CreatedById": "0051h000008NoMwAAK", + "CreatedDate": "2022-03-09T05:22:53.000Z", + "EndTime__c": "2022-03-09T05:22:50.000Z", + "Id": "a021h000004AXYMAA4", + "IsClosed__c": false, + "IsDeleted": false, + "IsResolved__c": false, + "LastModifiedById": "0051h000008NoMwAAK", + "LastModifiedDate": "2022-03-09T05:22:57.000Z", + "LastReferencedDate": "2022-03-09T05:47:29.000Z", + "LastViewedDate": "2022-03-09T05:47:29.000Z", + "Locale__c": "en_US", + "LogEntriesSummary__c": "9 total entries, 1 error(s), 1 warning(s)", + "LogEntries__r": [ + { + "LastModifiedDate": "2022-03-09T05:22:53.000Z", + "HasException__c": false, + "LimitsMobilePushApexCalls__c": "0 / 10", + "LoggingLevelWithImage__c": "\" FINEST", + "HasDatabaseResult__c": false, + "LimitsAggregateQueries__c": "0 / 300", + "MessageMasked__c": false, + "LimitsSoqlQueryRowsMax__c": 50000, + "HasRecordJson__c": false, + "LimitsCalloutsMax__c": 100, + "LimitsEmailInvocationsUsed__c": 0, + "IsDeleted": false, + "LimitsCalloutsUsed__c": 0, + "Log__c": "a021h000004AXYMAA4", + "LimitsDmlRowsMax__c": 10000, + "LimitsCpuTimeUsed__c": 132, + "LimitsQueueableJobsMax__c": 50, + "LimitsPublishImmediateDmlStatementsUsed__c": 0, + "LimitsSoslSearchesUsed__c": 0, + "LimitsDmlStatementsMax__c": 150, + "Message__c": "Logger - Saving 8 log entries via Anonymous Apex, save method is EVENT_BUS", + "Id": "a011h000005P8h7AAC", + "LoggingLevelOrdinal__c": 2, + "MessageTruncated__c": false, + "LimitsQueueableJobsUsed__c": 0, + "LimitsPublishImmediateDmlStatements__c": "0 / 150", + "TransactionEntryNumber__c": 9, + "LimitsSoqlQueryRows__c": "4 / 50000", + "HasRecordId__c": false, + "LimitsSoqlQueries__c": "4 / 100", + "LimitsSoqlQueryRowsUsed__c": 4, + "Timestamp__c": "2022-03-09T05:22:50.000Z", + "LimitsDmlRowsUsed__c": 0, + "LimitsMobilePushApexCallsUsed__c": 0, + "RecordJsonMasked__c": false, + "LimitsAggregateQueriesMax__c": 300, + "SystemModstamp": "2022-03-09T05:22:53.000Z", + "LimitsCallouts__c": "0 / 100", + "LimitsSoqlQueriesMax__c": 100, + "LimitsDmlStatements__c": "0 / 150", + "LimitsSoslSearches__c": "0 / 20", + "LogTransactionId__c": "4heTw6JlPFkvtu-qbxkog-", + "LimitsPublishImmediateDmlStatementsMax__c": 150, + "LimitsFutureCallsUsed__c": 0, + "LimitsCpuTime__c": "132 / 10000", + "OriginLocation__c": "AnonymousBlock", + "LimitsDmlStatementsUsed__c": 0, + "Name": "a011h000005P8h7", + "StackTrace__c": "AnonymousBlock: line 21, column 1\nAnonymousBlock: line 21, column 1", + "HasStackTrace__c": true, + "LimitsSoslSearchesMax__c": 20, + "CreatedById": "0051h000008NoMwAAK", + "HasExceptionStackTrace__c": false, + "LimitsDmlRows__c": "0 / 10000", + "LimitsFutureCallsMax__c": 50, + "LimitsHeapSizeMax__c": 6000000, + "LimitsHeapSize__c": "41745 / 6000000", + "CreatedDate": "2022-03-09T05:22:53.000Z", + "LimitsSoqlQueryLocatorRowsUsed__c": 0, + "LimitsAsyncCalls__c": "0 / 200", + "LimitsCpuTimeMax__c": 10000, + "EventUuid__c": "9dadd636-3d40-492a-913a-3add99824912", + "LoggedByUsernameLink__c": "test-sgpopgvvyplr@example.com", + "LimitsQueueableJobs__c": "0 / 50", + "LimitsSoqlQueryLocatorRows__c": "0 / 10000", + "LimitsHeapSizeUsed__c": 41745, + "TriggerIsExecuting__c": false, + "LimitsMobilePushApexCallsMax__c": 10, + "Origin__c": "Apex.AnonymousBlock", + "LimitsAsyncCallsMax__c": 200, + "LimitsAsyncCallsUsed__c": 0, + "LoggingLevel__c": "FINEST", + "LimitsAggregateQueriesUsed__c": 0, + "LimitsEmailInvocations__c": "0 / 10", + "OriginType__c": "Apex", + "LimitsFutureCalls__c": "0 / 50", + "EpochTimestamp__c": 1646803370189, + "LimitsSoqlQueryLocatorRowsMax__c": 10000, + "LimitsEmailInvocationsMax__c": 10, + "LastModifiedById": "0051h000008NoMwAAK", + "LimitsSoqlQueriesUsed__c": 4 + }, + { + "LastModifiedDate": "2022-03-09T05:22:53.000Z", + "HasException__c": false, + "LimitsMobilePushApexCalls__c": "0 / 10", + "LoggingLevelWithImage__c": "\" FINEST", + "HasDatabaseResult__c": false, + "LimitsAggregateQueries__c": "0 / 300", + "MessageMasked__c": false, + "LimitsSoqlQueryRowsMax__c": 50000, + "HasRecordJson__c": false, + "LimitsCalloutsMax__c": 100, + "LimitsEmailInvocationsUsed__c": 0, + "IsDeleted": false, + "LimitsCalloutsUsed__c": 0, + "Log__c": "a021h000004AXYMAA4", + "LimitsDmlRowsMax__c": 10000, + "LimitsCpuTimeUsed__c": 122, + "LimitsQueueableJobsMax__c": 50, + "LimitsPublishImmediateDmlStatementsUsed__c": 0, + "LimitsSoslSearchesUsed__c": 0, + "LimitsDmlStatementsMax__c": 150, + "Message__c": "Example FINEST entry", + "Id": "a011h000005P8h6AAC", + "LoggingLevelOrdinal__c": 2, + "MessageTruncated__c": false, + "LimitsQueueableJobsUsed__c": 0, + "LimitsPublishImmediateDmlStatements__c": "0 / 150", + "TransactionEntryNumber__c": 8, + "LimitsSoqlQueryRows__c": "4 / 50000", + "HasRecordId__c": false, + "LimitsSoqlQueries__c": "4 / 100", + "LimitsSoqlQueryRowsUsed__c": 4, + "Timestamp__c": "2022-03-09T05:22:50.000Z", + "LimitsDmlRowsUsed__c": 0, + "LimitsMobilePushApexCallsUsed__c": 0, + "RecordJsonMasked__c": false, + "LimitsAggregateQueriesMax__c": 300, + "SystemModstamp": "2022-03-09T05:22:53.000Z", + "LimitsCallouts__c": "0 / 100", + "LimitsSoqlQueriesMax__c": 100, + "LimitsDmlStatements__c": "0 / 150", + "LimitsSoslSearches__c": "0 / 20", + "LogTransactionId__c": "4heTw6JlPFkvtu-qbxkog-", + "LimitsPublishImmediateDmlStatementsMax__c": 150, + "LimitsFutureCallsUsed__c": 0, + "LimitsCpuTime__c": "122 / 10000", + "OriginLocation__c": "AnonymousBlock", + "LimitsDmlStatementsUsed__c": 0, + "Name": "a011h000005P8h6", + "StackTrace__c": "AnonymousBlock: line 19, column 1\nAnonymousBlock: line 19, column 1", + "HasStackTrace__c": true, + "LimitsSoslSearchesMax__c": 20, + "CreatedById": "0051h000008NoMwAAK", + "HasExceptionStackTrace__c": false, + "LimitsDmlRows__c": "0 / 10000", + "LimitsFutureCallsMax__c": 50, + "LimitsHeapSizeMax__c": 6000000, + "LimitsHeapSize__c": "37516 / 6000000", + "CreatedDate": "2022-03-09T05:22:53.000Z", + "LimitsSoqlQueryLocatorRowsUsed__c": 0, + "LimitsAsyncCalls__c": "0 / 200", + "LimitsCpuTimeMax__c": 10000, + "EventUuid__c": "58747fda-b991-4d44-86f1-892eb288f94e", + "LoggedByUsernameLink__c": "test-sgpopgvvyplr@example.com", + "LimitsQueueableJobs__c": "0 / 50", + "LimitsSoqlQueryLocatorRows__c": "0 / 10000", + "LimitsHeapSizeUsed__c": 37516, + "TriggerIsExecuting__c": false, + "LimitsMobilePushApexCallsMax__c": 10, + "Origin__c": "Apex.AnonymousBlock", + "LimitsAsyncCallsMax__c": 200, + "LimitsAsyncCallsUsed__c": 0, + "LoggingLevel__c": "FINEST", + "LimitsAggregateQueriesUsed__c": 0, + "LimitsEmailInvocations__c": "0 / 10", + "OriginType__c": "Apex", + "LimitsFutureCalls__c": "0 / 50", + "EpochTimestamp__c": 1646803370178, + "LimitsSoqlQueryLocatorRowsMax__c": 10000, + "LimitsEmailInvocationsMax__c": 10, + "LastModifiedById": "0051h000008NoMwAAK", + "LimitsSoqlQueriesUsed__c": 4 + }, + { + "LastModifiedDate": "2022-03-09T05:22:53.000Z", + "HasException__c": false, + "LimitsMobilePushApexCalls__c": "0 / 10", + "LoggingLevelWithImage__c": "\" FINER", + "HasDatabaseResult__c": false, + "LimitsAggregateQueries__c": "0 / 300", + "MessageMasked__c": false, + "LimitsSoqlQueryRowsMax__c": 50000, + "HasRecordJson__c": false, + "LimitsCalloutsMax__c": 100, + "LimitsEmailInvocationsUsed__c": 0, + "IsDeleted": false, + "LimitsCalloutsUsed__c": 0, + "Log__c": "a021h000004AXYMAA4", + "LimitsDmlRowsMax__c": 10000, + "LimitsCpuTimeUsed__c": 113, + "LimitsQueueableJobsMax__c": 50, + "LimitsPublishImmediateDmlStatementsUsed__c": 0, + "LimitsSoslSearchesUsed__c": 0, + "LimitsDmlStatementsMax__c": 150, + "Message__c": "Example FINER entry", + "Id": "a011h000005P8h5AAC", + "LoggingLevelOrdinal__c": 3, + "MessageTruncated__c": false, + "LimitsQueueableJobsUsed__c": 0, + "LimitsPublishImmediateDmlStatements__c": "0 / 150", + "TransactionEntryNumber__c": 7, + "LimitsSoqlQueryRows__c": "4 / 50000", + "HasRecordId__c": false, + "LimitsSoqlQueries__c": "4 / 100", + "LimitsSoqlQueryRowsUsed__c": 4, + "Timestamp__c": "2022-03-09T05:22:50.000Z", + "LimitsDmlRowsUsed__c": 0, + "LimitsMobilePushApexCallsUsed__c": 0, + "RecordJsonMasked__c": false, + "LimitsAggregateQueriesMax__c": 300, + "SystemModstamp": "2022-03-09T05:22:53.000Z", + "LimitsCallouts__c": "0 / 100", + "LimitsSoqlQueriesMax__c": 100, + "LimitsDmlStatements__c": "0 / 150", + "LimitsSoslSearches__c": "0 / 20", + "LogTransactionId__c": "4heTw6JlPFkvtu-qbxkog-", + "LimitsPublishImmediateDmlStatementsMax__c": 150, + "LimitsFutureCallsUsed__c": 0, + "LimitsCpuTime__c": "113 / 10000", + "OriginLocation__c": "AnonymousBlock", + "LimitsDmlStatementsUsed__c": 0, + "Name": "a011h000005P8h5", + "StackTrace__c": "AnonymousBlock: line 18, column 1\nAnonymousBlock: line 18, column 1", + "HasStackTrace__c": true, + "LimitsSoslSearchesMax__c": 20, + "CreatedById": "0051h000008NoMwAAK", + "HasExceptionStackTrace__c": false, + "LimitsDmlRows__c": "0 / 10000", + "LimitsFutureCallsMax__c": 50, + "LimitsHeapSizeMax__c": 6000000, + "LimitsHeapSize__c": "33429 / 6000000", + "CreatedDate": "2022-03-09T05:22:53.000Z", + "LimitsSoqlQueryLocatorRowsUsed__c": 0, + "LimitsAsyncCalls__c": "0 / 200", + "LimitsCpuTimeMax__c": 10000, + "EventUuid__c": "f5c18382-72ba-4808-8319-56cdfe27916f", + "LoggedByUsernameLink__c": "test-sgpopgvvyplr@example.com", + "LimitsQueueableJobs__c": "0 / 50", + "LimitsSoqlQueryLocatorRows__c": "0 / 10000", + "LimitsHeapSizeUsed__c": 33429, + "TriggerIsExecuting__c": false, + "LimitsMobilePushApexCallsMax__c": 10, + "Origin__c": "Apex.AnonymousBlock", + "LimitsAsyncCallsMax__c": 200, + "LimitsAsyncCallsUsed__c": 0, + "LoggingLevel__c": "FINER", + "LimitsAggregateQueriesUsed__c": 0, + "LimitsEmailInvocations__c": "0 / 10", + "OriginType__c": "Apex", + "LimitsFutureCalls__c": "0 / 50", + "EpochTimestamp__c": 1646803370169, + "LimitsSoqlQueryLocatorRowsMax__c": 10000, + "LimitsEmailInvocationsMax__c": 10, + "LastModifiedById": "0051h000008NoMwAAK", + "LimitsSoqlQueriesUsed__c": 4 + }, + { + "LastModifiedDate": "2022-03-09T05:22:53.000Z", + "HasException__c": false, + "LimitsMobilePushApexCalls__c": "0 / 10", + "LoggingLevelWithImage__c": "\" FINE", + "HasDatabaseResult__c": false, + "LimitsAggregateQueries__c": "0 / 300", + "MessageMasked__c": false, + "LimitsSoqlQueryRowsMax__c": 50000, + "HasRecordJson__c": false, + "LimitsCalloutsMax__c": 100, + "LimitsEmailInvocationsUsed__c": 0, + "IsDeleted": false, + "LimitsCalloutsUsed__c": 0, + "Log__c": "a021h000004AXYMAA4", + "LimitsDmlRowsMax__c": 10000, + "LimitsCpuTimeUsed__c": 104, + "LimitsQueueableJobsMax__c": 50, + "LimitsPublishImmediateDmlStatementsUsed__c": 0, + "LimitsSoslSearchesUsed__c": 0, + "LimitsDmlStatementsMax__c": 150, + "Message__c": "Example FINE entry", + "Id": "a011h000005P8h4AAC", + "LoggingLevelOrdinal__c": 4, + "MessageTruncated__c": false, + "LimitsQueueableJobsUsed__c": 0, + "LimitsPublishImmediateDmlStatements__c": "0 / 150", + "TransactionEntryNumber__c": 6, + "LimitsSoqlQueryRows__c": "4 / 50000", + "HasRecordId__c": false, + "LimitsSoqlQueries__c": "4 / 100", + "LimitsSoqlQueryRowsUsed__c": 4, + "Timestamp__c": "2022-03-09T05:22:50.000Z", + "LimitsDmlRowsUsed__c": 0, + "LimitsMobilePushApexCallsUsed__c": 0, + "RecordJsonMasked__c": false, + "LimitsAggregateQueriesMax__c": 300, + "SystemModstamp": "2022-03-09T05:22:53.000Z", + "LimitsCallouts__c": "0 / 100", + "LimitsSoqlQueriesMax__c": 100, + "LimitsDmlStatements__c": "0 / 150", + "LimitsSoslSearches__c": "0 / 20", + "LogTransactionId__c": "4heTw6JlPFkvtu-qbxkog-", + "LimitsPublishImmediateDmlStatementsMax__c": 150, + "LimitsFutureCallsUsed__c": 0, + "LimitsCpuTime__c": "104 / 10000", + "OriginLocation__c": "AnonymousBlock", + "LimitsDmlStatementsUsed__c": 0, + "Name": "a011h000005P8h4", + "StackTrace__c": "AnonymousBlock: line 17, column 1\nAnonymousBlock: line 17, column 1", + "HasStackTrace__c": true, + "LimitsSoslSearchesMax__c": 20, + "CreatedById": "0051h000008NoMwAAK", + "HasExceptionStackTrace__c": false, + "LimitsDmlRows__c": "0 / 10000", + "LimitsFutureCallsMax__c": 50, + "LimitsHeapSizeMax__c": 6000000, + "LimitsHeapSize__c": "29340 / 6000000", + "CreatedDate": "2022-03-09T05:22:53.000Z", + "LimitsSoqlQueryLocatorRowsUsed__c": 0, + "LimitsAsyncCalls__c": "0 / 200", + "LimitsCpuTimeMax__c": 10000, + "EventUuid__c": "ea49c0ac-234a-4793-bff5-cfcf0bb0685b", + "LoggedByUsernameLink__c": "test-sgpopgvvyplr@example.com", + "LimitsQueueableJobs__c": "0 / 50", + "LimitsSoqlQueryLocatorRows__c": "0 / 10000", + "LimitsHeapSizeUsed__c": 29340, + "TriggerIsExecuting__c": false, + "LimitsMobilePushApexCallsMax__c": 10, + "Origin__c": "Apex.AnonymousBlock", + "LimitsAsyncCallsMax__c": 200, + "LimitsAsyncCallsUsed__c": 0, + "LoggingLevel__c": "FINE", + "LimitsAggregateQueriesUsed__c": 0, + "LimitsEmailInvocations__c": "0 / 10", + "OriginType__c": "Apex", + "LimitsFutureCalls__c": "0 / 50", + "EpochTimestamp__c": 1646803370159, + "LimitsSoqlQueryLocatorRowsMax__c": 10000, + "LimitsEmailInvocationsMax__c": 10, + "LastModifiedById": "0051h000008NoMwAAK", + "LimitsSoqlQueriesUsed__c": 4 + }, + { + "LastModifiedDate": "2022-03-09T05:22:53.000Z", + "HasException__c": false, + "LimitsMobilePushApexCalls__c": "0 / 10", + "RecordSObjectClassification__c": "Standard Object", + "LoggingLevelWithImage__c": "\" DEBUG", + "HasDatabaseResult__c": false, + "LimitsAggregateQueries__c": "0 / 300", + "MessageMasked__c": false, + "RecordLink__c": "test-sgpopgvvyplr@example.com", + "LimitsSoqlQueryRowsMax__c": 50000, + "HasRecordJson__c": false, + "LimitsCalloutsMax__c": 100, + "LimitsEmailInvocationsUsed__c": 0, + "IsDeleted": false, + "LimitsCalloutsUsed__c": 0, + "Log__c": "a021h000004AXYMAA4", + "RecordId__c": "0051h000008NoMxAAK", + "LimitsDmlRowsMax__c": 10000, + "LimitsCpuTimeUsed__c": 94, + "LimitsQueueableJobsMax__c": 50, + "LimitsPublishImmediateDmlStatementsUsed__c": 0, + "LimitsSoslSearchesUsed__c": 0, + "LimitsDmlStatementsMax__c": 150, + "Message__c": "Example DEBUG entry for just a record ID", + "Id": "a011h000005P8h3AAC", + "LoggingLevelOrdinal__c": 5, + "MessageTruncated__c": false, + "RecordSObjectType__c": "User", + "LimitsQueueableJobsUsed__c": 0, + "LimitsPublishImmediateDmlStatements__c": "0 / 150", + "RecordDetailedLink__c": "User: test-sgpopgvvyplr@example.com", + "TransactionEntryNumber__c": 5, + "LimitsSoqlQueryRows__c": "4 / 50000", + "HasRecordId__c": true, + "LimitsSoqlQueries__c": "4 / 100", + "LimitsSoqlQueryRowsUsed__c": 4, + "Timestamp__c": "2022-03-09T05:22:50.000Z", + "LimitsDmlRowsUsed__c": 0, + "LimitsMobilePushApexCallsUsed__c": 0, + "RecordJsonMasked__c": false, + "LimitsAggregateQueriesMax__c": 300, + "SystemModstamp": "2022-03-09T05:22:53.000Z", + "LimitsCallouts__c": "0 / 100", + "LimitsSoqlQueriesMax__c": 100, + "LimitsDmlStatements__c": "0 / 150", + "LimitsSoslSearches__c": "0 / 20", + "LogTransactionId__c": "4heTw6JlPFkvtu-qbxkog-", + "LimitsPublishImmediateDmlStatementsMax__c": 150, + "RecordCollectionType__c": "Single", + "LimitsFutureCallsUsed__c": 0, + "LimitsCpuTime__c": "94 / 10000", + "OriginLocation__c": "AnonymousBlock", + "LimitsDmlStatementsUsed__c": 0, + "Name": "a011h000005P8h3", + "StackTrace__c": "AnonymousBlock: line 16, column 1\nAnonymousBlock: line 16, column 1", + "HasStackTrace__c": true, + "LimitsSoslSearchesMax__c": 20, + "CreatedById": "0051h000008NoMwAAK", + "HasExceptionStackTrace__c": false, + "LimitsDmlRows__c": "0 / 10000", + "LimitsFutureCallsMax__c": 50, + "LimitsHeapSizeMax__c": 6000000, + "LimitsHeapSize__c": "25114 / 6000000", + "CreatedDate": "2022-03-09T05:22:53.000Z", + "LimitsSoqlQueryLocatorRowsUsed__c": 0, + "LimitsAsyncCalls__c": "0 / 200", + "LimitsCpuTimeMax__c": 10000, + "RecordName__c": "test-sgpopgvvyplr@example.com", + "EventUuid__c": "4b1cbe02-9778-4472-a5c1-8de2a25cc9b7", + "LoggedByUsernameLink__c": "test-sgpopgvvyplr@example.com", + "LimitsQueueableJobs__c": "0 / 50", + "LimitsSoqlQueryLocatorRows__c": "0 / 10000", + "LimitsHeapSizeUsed__c": 25114, + "TriggerIsExecuting__c": false, + "LimitsMobilePushApexCallsMax__c": 10, + "Origin__c": "Apex.AnonymousBlock", + "LimitsAsyncCallsMax__c": 200, + "LimitsAsyncCallsUsed__c": 0, + "LoggingLevel__c": "DEBUG", + "LimitsAggregateQueriesUsed__c": 0, + "LimitsEmailInvocations__c": "0 / 10", + "OriginType__c": "Apex", + "LimitsFutureCalls__c": "0 / 50", + "EpochTimestamp__c": 1646803370149, + "LimitsSoqlQueryLocatorRowsMax__c": 10000, + "LimitsEmailInvocationsMax__c": 10, + "LastModifiedById": "0051h000008NoMwAAK", + "LimitsSoqlQueriesUsed__c": 4 + }, + { + "LastModifiedDate": "2022-03-09T05:22:53.000Z", + "HasException__c": false, + "LimitsMobilePushApexCalls__c": "0 / 10", + "RecordJson__c": "{\n \"attributes\" : {\n \"type\" : \"User\",\n \"url\" : \"/services/data/v54.0/sobjects/User/0051h000008NoMxAAK\"\n },\n \"Id\" : \"0051h000008NoMxAAK\",\n \"Name\" : \"User User\",\n \"Username\" : \"test-sgpopgvvyplr@example.com\",\n \"ProfileId\" : \"00e1h000000xTOgAAM\",\n \"Profile\" : {\n \"attributes\" : {\n \"type\" : \"Profile\",\n \"url\" : \"/services/data/v54.0/sobjects/Profile/00e1h000000xTOgAAM\"\n },\n \"Id\" : \"00e1h000000xTOgAAM\",\n \"Name\" : \"System Administrator\"\n },\n \"AboutMe\" : \"I hope you dont leak my social, which is XXX-XX-9999, btw.\"\n}", + "RecordSObjectClassification__c": "Standard Object", + "LoggingLevelWithImage__c": "\" DEBUG", + "HasDatabaseResult__c": false, + "LimitsAggregateQueries__c": "0 / 300", + "MessageMasked__c": false, + "RecordLink__c": "test-sgpopgvvyplr@example.com", + "LimitsSoqlQueryRowsMax__c": 50000, + "HasRecordJson__c": true, + "LimitsCalloutsMax__c": 100, + "LimitsEmailInvocationsUsed__c": 0, + "IsDeleted": false, + "LimitsCalloutsUsed__c": 0, + "Log__c": "a021h000004AXYMAA4", + "RecordId__c": "0051h000008NoMxAAK", + "LimitsDmlRowsMax__c": 10000, + "LimitsCpuTimeUsed__c": 85, + "LimitsQueueableJobsMax__c": 50, + "LimitsPublishImmediateDmlStatementsUsed__c": 0, + "LimitsSoslSearchesUsed__c": 0, + "LimitsDmlStatementsMax__c": 150, + "Message__c": "Example DEBUG entry", + "Id": "a011h000005P8h2AAC", + "LoggingLevelOrdinal__c": 5, + "MessageTruncated__c": false, + "RecordSObjectType__c": "User", + "LimitsQueueableJobsUsed__c": 0, + "LimitsPublishImmediateDmlStatements__c": "0 / 150", + "RecordDetailedLink__c": "User: test-sgpopgvvyplr@example.com", + "TransactionEntryNumber__c": 4, + "LimitsSoqlQueryRows__c": "4 / 50000", + "HasRecordId__c": true, + "LimitsSoqlQueries__c": "4 / 100", + "LimitsSoqlQueryRowsUsed__c": 4, + "Timestamp__c": "2022-03-09T05:22:50.000Z", + "LimitsDmlRowsUsed__c": 0, + "LimitsMobilePushApexCallsUsed__c": 0, + "RecordJsonMasked__c": true, + "LimitsAggregateQueriesMax__c": 300, + "SystemModstamp": "2022-03-09T05:22:53.000Z", + "LimitsCallouts__c": "0 / 100", + "LimitsSoqlQueriesMax__c": 100, + "LimitsDmlStatements__c": "0 / 150", + "LimitsSoslSearches__c": "0 / 20", + "LogTransactionId__c": "4heTw6JlPFkvtu-qbxkog-", + "LimitsPublishImmediateDmlStatementsMax__c": 150, + "RecordCollectionType__c": "Single", + "LimitsFutureCallsUsed__c": 0, + "LimitsCpuTime__c": "85 / 10000", + "OriginLocation__c": "AnonymousBlock", + "LimitsDmlStatementsUsed__c": 0, + "Name": "a011h000005P8h2", + "StackTrace__c": "AnonymousBlock: line 15, column 1\nAnonymousBlock: line 15, column 1", + "HasStackTrace__c": true, + "LimitsSoslSearchesMax__c": 20, + "CreatedById": "0051h000008NoMwAAK", + "HasExceptionStackTrace__c": false, + "LimitsDmlRows__c": "0 / 10000", + "LimitsFutureCallsMax__c": 50, + "LimitsHeapSizeMax__c": 6000000, + "LimitsHeapSize__c": "20253 / 6000000", + "CreatedDate": "2022-03-09T05:22:53.000Z", + "LimitsSoqlQueryLocatorRowsUsed__c": 0, + "LimitsAsyncCalls__c": "0 / 200", + "LimitsCpuTimeMax__c": 10000, + "RecordName__c": "test-sgpopgvvyplr@example.com", + "EventUuid__c": "5c2ffa21-1c7b-421b-813e-cbd7971cb446", + "LoggedByUsernameLink__c": "test-sgpopgvvyplr@example.com", + "LimitsQueueableJobs__c": "0 / 50", + "LimitsSoqlQueryLocatorRows__c": "0 / 10000", + "LimitsHeapSizeUsed__c": 20253, + "TriggerIsExecuting__c": false, + "LimitsMobilePushApexCallsMax__c": 10, + "Origin__c": "Apex.AnonymousBlock", + "LimitsAsyncCallsMax__c": 200, + "LimitsAsyncCallsUsed__c": 0, + "LoggingLevel__c": "DEBUG", + "LimitsAggregateQueriesUsed__c": 0, + "LimitsEmailInvocations__c": "0 / 10", + "OriginType__c": "Apex", + "LimitsFutureCalls__c": "0 / 50", + "EpochTimestamp__c": 1646803370138, + "LimitsSoqlQueryLocatorRowsMax__c": 10000, + "LimitsEmailInvocationsMax__c": 10, + "LastModifiedById": "0051h000008NoMwAAK", + "LimitsSoqlQueriesUsed__c": 4 + }, + { + "LastModifiedDate": "2022-03-09T05:22:53.000Z", + "HasException__c": false, + "LimitsMobilePushApexCalls__c": "0 / 10", + "RecordJson__c": "{\n \"attributes\" : {\n \"type\" : \"User\",\n \"url\" : \"/services/data/v54.0/sobjects/User/0051h000008NoMxAAK\"\n },\n \"Id\" : \"0051h000008NoMxAAK\",\n \"Name\" : \"User User\",\n \"Username\" : \"test-sgpopgvvyplr@example.com\",\n \"ProfileId\" : \"00e1h000000xTOgAAM\",\n \"Profile\" : {\n \"attributes\" : {\n \"type\" : \"Profile\",\n \"url\" : \"/services/data/v54.0/sobjects/Profile/00e1h000000xTOgAAM\"\n },\n \"Id\" : \"00e1h000000xTOgAAM\",\n \"Name\" : \"System Administrator\"\n },\n \"AboutMe\" : \"I hope you dont leak my social, which is XXX-XX-9999, btw.\"\n}", + "RecordSObjectClassification__c": "Standard Object", + "LoggingLevelWithImage__c": "\" INFO", + "HasDatabaseResult__c": false, + "LimitsAggregateQueries__c": "0 / 300", + "MessageMasked__c": true, + "RecordLink__c": "test-sgpopgvvyplr@example.com", + "LimitsSoqlQueryRowsMax__c": 50000, + "HasRecordJson__c": true, + "LimitsCalloutsMax__c": 100, + "LimitsEmailInvocationsUsed__c": 0, + "IsDeleted": false, + "LimitsCalloutsUsed__c": 0, + "Log__c": "a021h000004AXYMAA4", + "RecordId__c": "0051h000008NoMxAAK", + "LimitsDmlRowsMax__c": 10000, + "LimitsCpuTimeUsed__c": 74, + "LimitsQueueableJobsMax__c": 50, + "LimitsPublishImmediateDmlStatementsUsed__c": 0, + "LimitsSoslSearchesUsed__c": 0, + "LimitsDmlStatementsMax__c": 150, + "Message__c": "In case you want to steal my identity, my fake social is XXX-XX-9999, thanks", + "Id": "a011h000005P8h1AAC", + "LoggingLevelOrdinal__c": 6, + "MessageTruncated__c": false, + "RecordSObjectType__c": "User", + "LimitsQueueableJobsUsed__c": 0, + "LimitsPublishImmediateDmlStatements__c": "0 / 150", + "RecordDetailedLink__c": "User: test-sgpopgvvyplr@example.com", + "TransactionEntryNumber__c": 3, + "LimitsSoqlQueryRows__c": "4 / 50000", + "HasRecordId__c": true, + "LimitsSoqlQueries__c": "4 / 100", + "LimitsSoqlQueryRowsUsed__c": 4, + "Timestamp__c": "2022-03-09T05:22:50.000Z", + "LimitsDmlRowsUsed__c": 0, + "LimitsMobilePushApexCallsUsed__c": 0, + "RecordJsonMasked__c": true, + "LimitsAggregateQueriesMax__c": 300, + "SystemModstamp": "2022-03-09T05:22:53.000Z", + "LimitsCallouts__c": "0 / 100", + "LimitsSoqlQueriesMax__c": 100, + "LimitsDmlStatements__c": "0 / 150", + "LimitsSoslSearches__c": "0 / 20", + "LogTransactionId__c": "4heTw6JlPFkvtu-qbxkog-", + "LimitsPublishImmediateDmlStatementsMax__c": 150, + "RecordCollectionType__c": "Single", + "LimitsFutureCallsUsed__c": 0, + "LimitsCpuTime__c": "74 / 10000", + "OriginLocation__c": "AnonymousBlock", + "LimitsDmlStatementsUsed__c": 0, + "Name": "a011h000005P8h1", + "StackTrace__c": "AnonymousBlock: line 14, column 1\nAnonymousBlock: line 14, column 1", + "HasStackTrace__c": true, + "LimitsSoslSearchesMax__c": 20, + "CreatedById": "0051h000008NoMwAAK", + "HasExceptionStackTrace__c": false, + "LimitsDmlRows__c": "0 / 10000", + "LimitsFutureCallsMax__c": 50, + "LimitsHeapSizeMax__c": 6000000, + "LimitsHeapSize__c": "15333 / 6000000", + "CreatedDate": "2022-03-09T05:22:53.000Z", + "LimitsSoqlQueryLocatorRowsUsed__c": 0, + "LimitsAsyncCalls__c": "0 / 200", + "LimitsCpuTimeMax__c": 10000, + "RecordName__c": "test-sgpopgvvyplr@example.com", + "EventUuid__c": "c780f79c-d24c-4a2c-84bb-be06249debb0", + "LoggedByUsernameLink__c": "test-sgpopgvvyplr@example.com", + "LimitsQueueableJobs__c": "0 / 50", + "LimitsSoqlQueryLocatorRows__c": "0 / 10000", + "LimitsHeapSizeUsed__c": 15333, + "TriggerIsExecuting__c": false, + "LimitsMobilePushApexCallsMax__c": 10, + "Origin__c": "Apex.AnonymousBlock", + "LimitsAsyncCallsMax__c": 200, + "LimitsAsyncCallsUsed__c": 0, + "LoggingLevel__c": "INFO", + "LimitsAggregateQueriesUsed__c": 0, + "LimitsEmailInvocations__c": "0 / 10", + "OriginType__c": "Apex", + "LimitsFutureCalls__c": "0 / 50", + "EpochTimestamp__c": 1646803370126, + "LimitsSoqlQueryLocatorRowsMax__c": 10000, + "LimitsEmailInvocationsMax__c": 10, + "LastModifiedById": "0051h000008NoMwAAK", + "LimitsSoqlQueriesUsed__c": 4 + }, + { + "LastModifiedDate": "2022-03-09T05:22:53.000Z", + "HasException__c": false, + "LimitsMobilePushApexCalls__c": "0 / 10", + "LoggingLevelWithImage__c": "\" WARN", + "HasDatabaseResult__c": false, + "LimitsAggregateQueries__c": "0 / 300", + "MessageMasked__c": true, + "LimitsSoqlQueryRowsMax__c": 50000, + "HasRecordJson__c": false, + "LimitsCalloutsMax__c": 100, + "LimitsEmailInvocationsUsed__c": 0, + "IsDeleted": false, + "LimitsCalloutsUsed__c": 0, + "Log__c": "a021h000004AXYMAA4", + "LimitsDmlRowsMax__c": 10000, + "LimitsCpuTimeUsed__c": 68, + "LimitsQueueableJobsMax__c": 50, + "LimitsPublishImmediateDmlStatementsUsed__c": 0, + "LimitsSoslSearchesUsed__c": 0, + "LimitsDmlStatementsMax__c": 150, + "Message__c": "Here is my fake Mastercard credit card ****-****-****-0005, please don't steal it", + "Id": "a011h000005P8h0AAC", + "LoggingLevelOrdinal__c": 7, + "MessageTruncated__c": false, + "LimitsQueueableJobsUsed__c": 0, + "LimitsPublishImmediateDmlStatements__c": "0 / 150", + "TransactionEntryNumber__c": 2, + "LimitsSoqlQueryRows__c": "4 / 50000", + "HasRecordId__c": false, + "LimitsSoqlQueries__c": "4 / 100", + "LimitsSoqlQueryRowsUsed__c": 4, + "Timestamp__c": "2022-03-09T05:22:50.000Z", + "LimitsDmlRowsUsed__c": 0, + "LimitsMobilePushApexCallsUsed__c": 0, + "RecordJsonMasked__c": false, + "LimitsAggregateQueriesMax__c": 300, + "SystemModstamp": "2022-03-09T05:22:53.000Z", + "LimitsCallouts__c": "0 / 100", + "LimitsSoqlQueriesMax__c": 100, + "LimitsDmlStatements__c": "0 / 150", + "LimitsSoslSearches__c": "0 / 20", + "LogTransactionId__c": "4heTw6JlPFkvtu-qbxkog-", + "LimitsPublishImmediateDmlStatementsMax__c": 150, + "LimitsFutureCallsUsed__c": 0, + "LimitsCpuTime__c": "68 / 10000", + "OriginLocation__c": "AnonymousBlock", + "LimitsDmlStatementsUsed__c": 0, + "Name": "a011h000005P8h0", + "StackTrace__c": "AnonymousBlock: line 13, column 1\nAnonymousBlock: line 13, column 1", + "HasStackTrace__c": true, + "LimitsSoslSearchesMax__c": 20, + "CreatedById": "0051h000008NoMwAAK", + "HasExceptionStackTrace__c": false, + "LimitsDmlRows__c": "0 / 10000", + "LimitsFutureCallsMax__c": 50, + "LimitsHeapSizeMax__c": 6000000, + "LimitsHeapSize__c": "11116 / 6000000", + "CreatedDate": "2022-03-09T05:22:53.000Z", + "LimitsSoqlQueryLocatorRowsUsed__c": 0, + "LimitsAsyncCalls__c": "0 / 200", + "LimitsCpuTimeMax__c": 10000, + "EventUuid__c": "9b68c3c3-e2f2-41e8-b4a2-b5470dfcde84", + "LoggedByUsernameLink__c": "test-sgpopgvvyplr@example.com", + "LimitsQueueableJobs__c": "0 / 50", + "LimitsSoqlQueryLocatorRows__c": "0 / 10000", + "LimitsHeapSizeUsed__c": 11116, + "TriggerIsExecuting__c": false, + "LimitsMobilePushApexCallsMax__c": 10, + "Origin__c": "Apex.AnonymousBlock", + "LimitsAsyncCallsMax__c": 200, + "LimitsAsyncCallsUsed__c": 0, + "LoggingLevel__c": "WARN", + "LimitsAggregateQueriesUsed__c": 0, + "LimitsEmailInvocations__c": "0 / 10", + "OriginType__c": "Apex", + "LimitsFutureCalls__c": "0 / 50", + "EpochTimestamp__c": 1646803370120, + "LimitsSoqlQueryLocatorRowsMax__c": 10000, + "LimitsEmailInvocationsMax__c": 10, + "LastModifiedById": "0051h000008NoMwAAK", + "LimitsSoqlQueriesUsed__c": 4 + }, + { + "LastModifiedDate": "2022-03-09T05:22:53.000Z", + "HasException__c": false, + "LimitsMobilePushApexCalls__c": "0 / 10", + "LoggingLevelWithImage__c": "\" ERROR", + "HasDatabaseResult__c": false, + "LimitsAggregateQueries__c": "0 / 300", + "MessageMasked__c": true, + "LimitsSoqlQueryRowsMax__c": 50000, + "HasRecordJson__c": false, + "LimitsCalloutsMax__c": 100, + "LimitsEmailInvocationsUsed__c": 0, + "IsDeleted": false, + "LimitsCalloutsUsed__c": 0, + "Log__c": "a021h000004AXYMAA4", + "LimitsDmlRowsMax__c": 10000, + "LimitsCpuTimeUsed__c": 30, + "LimitsQueueableJobsMax__c": 50, + "LimitsPublishImmediateDmlStatementsUsed__c": 0, + "LimitsSoslSearchesUsed__c": 0, + "LimitsDmlStatementsMax__c": 150, + "Message__c": "Here is my fake Visa credit card\n\n ****-****-****-0004,\n\n\n please don't steal it", + "Id": "a011h000005P8gzAAC", + "LoggingLevelOrdinal__c": 8, + "MessageTruncated__c": false, + "LimitsQueueableJobsUsed__c": 0, + "LimitsPublishImmediateDmlStatements__c": "0 / 150", + "TransactionEntryNumber__c": 1, + "LimitsSoqlQueryRows__c": "1 / 50000", + "HasRecordId__c": false, + "LimitsSoqlQueries__c": "1 / 100", + "LimitsSoqlQueryRowsUsed__c": 1, + "Timestamp__c": "2022-03-09T05:22:50.000Z", + "LimitsDmlRowsUsed__c": 0, + "LimitsMobilePushApexCallsUsed__c": 0, + "RecordJsonMasked__c": false, + "LimitsAggregateQueriesMax__c": 300, + "SystemModstamp": "2022-03-09T05:22:53.000Z", + "LimitsCallouts__c": "0 / 100", + "LimitsSoqlQueriesMax__c": 100, + "LimitsDmlStatements__c": "0 / 150", + "LimitsSoslSearches__c": "0 / 20", + "LogTransactionId__c": "4heTw6JlPFkvtu-qbxkog-", + "LimitsPublishImmediateDmlStatementsMax__c": 150, + "LimitsFutureCallsUsed__c": 0, + "LimitsCpuTime__c": "30 / 10000", + "OriginLocation__c": "AnonymousBlock", + "LimitsDmlStatementsUsed__c": 0, + "Name": "a011h000005P8gz", + "StackTrace__c": "AnonymousBlock: line 12, column 1\nAnonymousBlock: line 12, column 1", + "HasStackTrace__c": true, + "LimitsSoslSearchesMax__c": 20, + "CreatedById": "0051h000008NoMwAAK", + "HasExceptionStackTrace__c": false, + "LimitsDmlRows__c": "0 / 10000", + "LimitsFutureCallsMax__c": 50, + "LimitsHeapSizeMax__c": 6000000, + "LimitsHeapSize__c": "5472 / 6000000", + "CreatedDate": "2022-03-09T05:22:53.000Z", + "LimitsSoqlQueryLocatorRowsUsed__c": 0, + "LimitsAsyncCalls__c": "0 / 200", + "LimitsCpuTimeMax__c": 10000, + "EventUuid__c": "5a1678b2-82b6-4228-8907-a0df605bda03", + "LoggedByUsernameLink__c": "test-sgpopgvvyplr@example.com", + "LimitsQueueableJobs__c": "0 / 50", + "LimitsSoqlQueryLocatorRows__c": "0 / 10000", + "LimitsHeapSizeUsed__c": 5472, + "TriggerIsExecuting__c": false, + "LimitsMobilePushApexCallsMax__c": 10, + "Origin__c": "Apex.AnonymousBlock", + "LimitsAsyncCallsMax__c": 200, + "LimitsAsyncCallsUsed__c": 0, + "LoggingLevel__c": "ERROR", + "LimitsAggregateQueriesUsed__c": 0, + "LimitsEmailInvocations__c": "0 / 10", + "OriginType__c": "Apex", + "LimitsFutureCalls__c": "0 / 50", + "EpochTimestamp__c": 1646803370023, + "LimitsSoqlQueryLocatorRowsMax__c": 10000, + "LimitsEmailInvocationsMax__c": 10, + "LastModifiedById": "0051h000008NoMwAAK", + "LimitsSoqlQueriesUsed__c": 1 + } + ], + "LogRetentionDate__c": "2022-03-22", + "LoggedByUsernameLink__c": "test-sgpopgvvyplr@example.com", + "LoggedByUsername__c": "test-sgpopgvvyplr@example.com", + "LoggedBy__c": "0051h000008NoMxAAK", + "LoggerVersionNumber__c": "v4.7.0", + "LoginApplication__c": "Salesforce CLI", + "LoginBrowser__c": "Unknown", + "LoginHistoryId__c": "0Ya1h00000yEUrXCAW", + "LoginPlatform__c": "Unknown", + "LoginType__c": "Remote Access 2.0", + "MaxLogEntryLoggingLevelOrdinal__c": 8, + "Name": "Log-000004", + "OrganizationDomainUrl__c": "https://velocity-nosoftware-48362.cs79.my.salesforce.com", + "OrganizationEnvironmentType__c": "Scratch Org", + "OrganizationId__c": "00D1h000000MNKZEA4", + "OrganizationInstanceName__c": "CS79", + "OrganizationName__c": "Nebula Logger - Base Scratch Org", + "OrganizationType__c": "Enterprise Edition", + "Owner": { + "Type": "User", + "Id": "0051h000008NoMxAAK", + "Name": "User User" + }, + "OwnerId": "0051h000008NoMxAAK", + "Priority__c": "High", + "ProfileId__c": "00e1h000000xTOgAAM", + "ProfileLink__c": "System Administrator", + "ProfileName__c": "System Administrator", + "Scenario__c": "an example transaction scenario name", + "SendSlackNotification__c": true, + "SessionId__c": "0Ak1h00001MhxLcCAJ", + "SessionSecurityLevel__c": "STANDARD", + "SessionType__c": "Oauth2", + "SourceIp__c": "Salesforce.com IP", + "StartTime__c": "2022-03-09T05:22:50.000Z", + "Status__c": "New", + "SystemModeSummary__c": "API.v54.0.ANONYMOUS", + "SystemMode__c": "ANONYMOUS", + "SystemModstamp": "2022-03-09T05:22:57.000Z", + "TimeZoneId__c": "America/Los_Angeles", + "TimeZoneName__c": "(GMT-08:00) Pacific Standard Time (America/Los_Angeles)", + "TotalDEBUGLogEntries__c": 2, + "TotalERRORLogEntries__c": 1, + "TotalFINELogEntries__c": 1, + "TotalFINERLogEntries__c": 1, + "TotalFINESTLogEntries__c": 2, + "TotalINFOLogEntries__c": 1, + "TotalLimitsCpuTimeUsed__c": 132, + "TotalLogEntries__c": 9, + "TotalWARNLogEntries__c": 1, + "TransactionId__c": "4heTw6JlPFkvtu-qbxkog-", + "UserLicenseDefinitionKey__c": "SFDC", + "UserLicenseId__c": "1001h000000abKhAAI", + "UserLicenseName__c": "Salesforce", + "UserLoggingLevelOrdinal__c": 2, + "UserLoggingLevel__c": "FINEST", + "UserRoleLink__c": " ", + "UserType__c": "Standard", + "WasLoggedByCurrentUser__c": true +} diff --git a/nebula-logger/core/main/log-management/lwc/logViewer/__tests__/logViewer.test.js b/nebula-logger/core/main/log-management/lwc/logViewer/__tests__/logViewer.test.js new file mode 100644 index 000000000..201c7b6cd --- /dev/null +++ b/nebula-logger/core/main/log-management/lwc/logViewer/__tests__/logViewer.test.js @@ -0,0 +1,112 @@ +import { createElement } from 'lwc'; +import LogViewer from 'c/logViewer'; +import getLog from '@salesforce/apex/Logger.getLog'; +import { registerApexTestWireAdapter } from '@salesforce/sfdx-lwc-jest'; + +// Mock data +const mockGetLog = require('./data/getLog.json'); + +// Register a test wire adapter +const getLogAdapter = registerApexTestWireAdapter(getLog); + +document.execCommand = jest.fn(); + +jest.mock( + '@salesforce/apex/Logger.getLog', + () => { + return { + default: () => mockGetLog + }; + }, + { virtual: true } +); + +test.todo('test for downloading JSON file'); +test.todo('test for downloading log file'); + +describe('Logger JSON Viewer lwc tests', () => { + afterEach(() => { + while (document.body.firstChild) { + document.body.removeChild(document.body.firstChild); + } + jest.clearAllMocks(); + }); + + it('sets document title', async () => { + const logViewerElement = createElement('c-log-viewer', { is: LogViewer }); + document.body.appendChild(logViewerElement); + getLogAdapter.emit(mockGetLog); + + await Promise.resolve(); + expect(logViewerElement.title).toEqual(mockGetLog.Name); + }); + + it('defaults to brand button variant', async () => { + const logViewer = createElement('c-log-viewer', { is: LogViewer }); + document.body.appendChild(logViewer); + + getLogAdapter.emit(mockGetLog); + + await Promise.resolve(); + const inputButton = logViewer.shadowRoot.querySelector('lightning-button-stateful'); + expect(logViewer.title).toEqual(mockGetLog.Name); + expect(inputButton.variant).toEqual('brand'); + }); + + it('copies the JSON to the clipboard', async () => { + const logViewer = createElement('c-log-viewer', { is: LogViewer }); + document.body.appendChild(logViewer); + + getLogAdapter.emit(mockGetLog); + + return Promise.resolve() + .then(() => { + let copyBtn = logViewer.shadowRoot.querySelector('lightning-button-stateful[data-id="copy-btn"]'); + copyBtn.click(); + }) + .then(() => { + const tab = logViewer.shadowRoot.querySelector('lightning-tab[data-id="json-content"]'); + expect(tab.value).toEqual('json'); + tab.dispatchEvent(new CustomEvent('active')); + }) + .then(() => { + const clipboardContent = JSON.parse(logViewer.shadowRoot.querySelector('pre').textContent); + expect(clipboardContent).toEqual(mockGetLog); + expect(document.execCommand).toHaveBeenCalledWith('copy'); + }); + }); + + it('copies the log file to the clipboard', async () => { + const logViewer = createElement('c-log-viewer', { is: LogViewer }); + document.body.appendChild(logViewer); + + getLogAdapter.emit(mockGetLog); + + return Promise.resolve() + .then(() => { + let copyBtn = logViewer.shadowRoot.querySelector('lightning-button-stateful[data-id="copy-btn"]'); + copyBtn.click(); + }) + .then(() => { + const tab = logViewer.shadowRoot.querySelector('lightning-tab[data-id="file-content"]'); + expect(tab.value).toEqual('file'); + tab.dispatchEvent(new CustomEvent('active')); + }) + .then(() => { + let expectedContentLines = []; + mockGetLog.LogEntries__r.forEach(logEntry => { + const columns = []; + columns.push(new Date(logEntry.EpochTimestamp__c).toISOString()); + columns.push(logEntry.LoggingLevel__c); + columns.push(logEntry.StackTrace__c?.split('\n')[0]); + columns.push(logEntry.Message__c); + + expectedContentLines.push(columns.join(' | ')); + }); + + const clipboardContent = logViewer.shadowRoot.querySelector('pre').textContent; + expect(clipboardContent).toEqual(expectedContentLines.join('\n')); + expect(document.execCommand).toHaveBeenCalledWith('copy'); + }); + }); +}); diff --git a/nebula-logger/core/main/log-management/lwc/logViewer/logViewer.css b/nebula-logger/core/main/log-management/lwc/logViewer/logViewer.css new file mode 100644 index 000000000..d35f572f0 --- /dev/null +++ b/nebula-logger/core/main/log-management/lwc/logViewer/logViewer.css @@ -0,0 +1,9 @@ +.content { + height: calc(100vh - 550px); +} + +.content pre { + height: 100%; + margin: auto 10px; + overflow-y: scroll; +} diff --git a/nebula-logger/core/main/log-management/lwc/logViewer/logViewer.html b/nebula-logger/core/main/log-management/lwc/logViewer/logViewer.html new file mode 100644 index 000000000..dfda55ed1 --- /dev/null +++ b/nebula-logger/core/main/log-management/lwc/logViewer/logViewer.html @@ -0,0 +1,36 @@ + + + diff --git a/nebula-logger/core/main/log-management/lwc/logViewer/logViewer.js b/nebula-logger/core/main/log-management/lwc/logViewer/logViewer.js new file mode 100644 index 000000000..583eb7fbd --- /dev/null +++ b/nebula-logger/core/main/log-management/lwc/logViewer/logViewer.js @@ -0,0 +1,130 @@ +/************************************************************************************************* + * This file is part of the Nebula Logger project, released under the MIT License. * + * See LICENSE file or go to https://github.com/jongpie/NebulaLogger for full license details. * + ************************************************************************************************/ + +import { LightningElement, api, wire } from 'lwc'; +import getLog from '@salesforce/apex/Logger.getLog'; +import EPOCH_TIMESTAMP_FIELD from '@salesforce/schema/LogEntry__c.EpochTimestamp__c'; +import LOGGING_LEVEL_FIELD from '@salesforce/schema/LogEntry__c.LoggingLevel__c'; +import MESSAGE_FIELD from '@salesforce/schema/LogEntry__c.Message__c'; +import STACK_TRACE_FIELD from '@salesforce/schema/LogEntry__c.StackTrace__c'; + +export default class LogViewer extends LightningElement { + @api + recordId; + + isLoaded = false; + log = {}; + currentMode = {}; + dataCopied = false; + + _logFileContent; + _logJSONContent; + + @wire(getLog, { logId: '$recordId' }) + wiredGetLog(result) { + if (result.data) { + this.log = result.data; + this._loadLogFileContent(); + this._loadLogJSONContent(); + this.isLoaded = true; + } + } + + @api + get title() { + return this.log?.Name; + } + + get variant() { + return this.dataCopied ? 'success' : 'brand'; + } + + get downloadButtonLabel() { + return `Download ${this.currentMode?.label}`; + } + + handleTabActivated(event) { + this.currentMode = { + label: event.target.label, + value: event.target.value + }; + + switch (this.currentMode.value) { + case 'file': + this.currentMode.data = this._logFileContent; + this.currentMode.extension = 'log'; + break; + case 'json': + this.currentMode.data = this._logJSONContent; + this.currentMode.extension = 'json'; + break; + } + } + + async copyToClipboard() { + // const value = this.template.querySelector('pre').textContent; + const value = this.currentMode.data; + + const textArea = document.createElement('textarea'); + textArea.value = value; + // Avoid scrolling to bottom + textArea.style.top = '0'; + textArea.style.left = '0'; + textArea.style.position = 'fixed'; + + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + document.execCommand('copy'); + document.body.removeChild(textArea); + + /* eslint-disable-next-line no-console */ + console.log('Log data successfully copied to clipboard', value); + this.dataCopied = true; + + /* eslint-disable-next-line @lwc/lwc/no-async-operation */ + setTimeout(() => { + this.dataCopied = false; + }, 5000); + } + + async downloadFile() { + const exportedFilename = this.log.Name + '_' + this.log.OrganizationId__c + '.' + this.currentMode.extension; + const encodedValue = encodeURIComponent(this.currentMode.data); + + const link = window.document.createElement('a'); + link.href = 'data:text;charset=utf-8,' + encodedValue; + link.target = '_blank'; + link.download = exportedFilename; + link.click(); + } + + _loadLogFileContent() { + const fieldDelimiter = '\n'; + const lineDelimiter = '\n\n' + '-'.repeat(36) + '\n\n'; + const logFileLines = []; + this.log.LogEntries__r.forEach(logEntry => { + const columns = []; + columns.push('[' + new Date(logEntry[EPOCH_TIMESTAMP_FIELD.fieldApiName]).toISOString() + ' - ' + logEntry[LOGGING_LEVEL_FIELD.fieldApiName] + ']'); + columns.push('[Message]\n' + logEntry[MESSAGE_FIELD.fieldApiName]); + columns.push('\n[Stack Trace]\n' + logEntry[STACK_TRACE_FIELD.fieldApiName]); + + logFileLines.push(columns.join(fieldDelimiter)); + }); + this._logFileContent = logFileLines.join(lineDelimiter); + } + + _loadLogJSONContent() { + // Sort the keys (fields) in the log object + let formattedLog; + formattedLog = Object.keys(this.log) + .sort() + .reduce((obj, key) => { + obj[key] = this.log[key]; + return obj; + }, {}); + this._logJSONContent = JSON.stringify(formattedLog, null, '\t'); + } +} diff --git a/nebula-logger/core/main/log-management/lwc/logJSON/logJSON.js-meta.xml b/nebula-logger/core/main/log-management/lwc/logViewer/logViewer.js-meta.xml similarity index 100% rename from nebula-logger/core/main/log-management/lwc/logJSON/logJSON.js-meta.xml rename to nebula-logger/core/main/log-management/lwc/logViewer/logViewer.js-meta.xml diff --git a/nebula-logger/core/main/log-management/quickActions/Log__c.ViewLogJSON.quickAction-meta.xml b/nebula-logger/core/main/log-management/quickActions/Log__c.OpenViewer.quickAction-meta.xml similarity index 58% rename from nebula-logger/core/main/log-management/quickActions/Log__c.ViewLogJSON.quickAction-meta.xml rename to nebula-logger/core/main/log-management/quickActions/Log__c.OpenViewer.quickAction-meta.xml index 47d562200..731bca851 100644 --- a/nebula-logger/core/main/log-management/quickActions/Log__c.ViewLogJSON.quickAction-meta.xml +++ b/nebula-logger/core/main/log-management/quickActions/Log__c.OpenViewer.quickAction-meta.xml @@ -1,9 +1,9 @@ ScreenAction - Shows the current log & log entries in JSON format - - logJSON + Shows the current log & log entries in different formats + + logViewer false LightningWebComponent diff --git a/nebula-logger/core/main/logger-engine/classes/Logger.cls b/nebula-logger/core/main/logger-engine/classes/Logger.cls index 8914bd751..8781cc8bc 100644 --- a/nebula-logger/core/main/logger-engine/classes/Logger.cls +++ b/nebula-logger/core/main/logger-engine/classes/Logger.cls @@ -2646,9 +2646,13 @@ global with sharing class Logger { logFieldNames.addAll(new List{ 'Owner.Name', 'Owner.Type' }); List logEntryFieldNames = new List(Schema.LogEntry__c.SObjectType.getDescribe().fields.getMap().keySet()); - List textReplacements = new List{ String.join(logFieldNames, ','), String.join(logEntryFieldNames, ',') }; + List textReplacements = new List{ + String.join(logFieldNames, ','), + String.join(logEntryFieldNames, ','), + Schema.LogEntry__c.TransactionEntryNumber__c.getDescribe().getName() + }; String query = String.format( - 'SELECT {0}, (SELECT {1} FROM LogEntries__r) FROM Log__c WHERE Id = :logId OR TransactionId__c = :logId', + 'SELECT {0}, (SELECT {1} FROM LogEntries__r ORDER BY {2}) FROM Log__c WHERE Id = :logId OR TransactionId__c = :logId', textReplacements ); diff --git a/nebula-logger/managed-package/core/main/deprecated/aura/logJSONViewer/logJSONViewer.cmp b/nebula-logger/managed-package/core/main/deprecated/aura/logJSONViewer/logJSONViewer.cmp index dc752f767..ce545d878 100644 --- a/nebula-logger/managed-package/core/main/deprecated/aura/logJSONViewer/logJSONViewer.cmp +++ b/nebula-logger/managed-package/core/main/deprecated/aura/logJSONViewer/logJSONViewer.cmp @@ -4,5 +4,5 @@ **********************************************************************************************--> - This component has been deprecated - please instead use the lwc logJSON + This component has been deprecated - please instead use the lwc logViewer diff --git a/nebula-logger/managed-package/core/main/deprecated/lwc/logViewer/logViewer.html b/nebula-logger/managed-package/core/main/deprecated/lwc/logViewer/logViewer.html deleted file mode 100644 index cdfb780ad..000000000 --- a/nebula-logger/managed-package/core/main/deprecated/lwc/logViewer/logViewer.html +++ /dev/null @@ -1,6 +0,0 @@ - - - diff --git a/nebula-logger/managed-package/core/main/deprecated/lwc/logViewer/logViewer.js b/nebula-logger/managed-package/core/main/deprecated/lwc/logViewer/logViewer.js deleted file mode 100644 index ba5552f76..000000000 --- a/nebula-logger/managed-package/core/main/deprecated/lwc/logViewer/logViewer.js +++ /dev/null @@ -1,8 +0,0 @@ -/************************************************************************************************* - * This file is part of the Nebula Logger project, released under the MIT License. * - * See LICENSE file or go to https://github.com/jongpie/NebulaLogger for full license details. * - ************************************************************************************************/ - -import { LightningElement } from 'lwc'; - -export default class LogViewer extends LightningElement {} diff --git a/nebula-logger/managed-package/core/main/deprecated/lwc/logViewer/logViewer.js-meta.xml b/nebula-logger/managed-package/core/main/deprecated/lwc/logViewer/logViewer.js-meta.xml deleted file mode 100644 index e4e51b24e..000000000 --- a/nebula-logger/managed-package/core/main/deprecated/lwc/logViewer/logViewer.js-meta.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - 53.0 - true -