diff --git a/app/OptionalResourceService.ts b/app/OptionalResourceService.ts index 072fd2bc47..24c422e9d8 100644 --- a/app/OptionalResourceService.ts +++ b/app/OptionalResourceService.ts @@ -14,11 +14,13 @@ import type { OptionalResourcesDictType, } from '../ts/types/OptionalResource'; import { OptionalResourcesDictSchema } from '../ts/types/OptionalResource'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; import { getGotOptions } from '../ts/updater/got'; import { drop } from '../ts/util/drop'; import { parseUnknown } from '../ts/util/schemas'; +const log = createLogger('OptionalResourceService'); + const RESOURCES_DICT_PATH = join( __dirname, '..', @@ -75,12 +77,12 @@ export class OptionalResourceService { timingSafeEqual(digest, Buffer.from(decl.digest, 'base64')) && onDisk.length === decl.size ) { - log.warn(`OptionalResourceService: loaded ${name} from disk`); + log.warn(`loaded ${name} from disk`); this.#cache.set(name, onDisk); return onDisk; } - log.warn(`OptionalResourceService: ${name} is no longer valid on disk`); + log.warn(`${name} is no longer valid on disk`); } catch (error) { if (error.code !== 'ENOENT') { throw error; @@ -135,10 +137,7 @@ export class OptionalResourceService { try { await unlink(fullPath); } catch (error) { - log.error( - `OptionalResourceService: failed to cleanup ${subPath}`, - error - ); + log.error(`failed to cleanup ${subPath}`, error); } }) ); @@ -182,7 +181,7 @@ export class OptionalResourceService { await mkdir(dirname(destPath), { recursive: true }); await writeFile(destPath, result); } catch (error) { - log.error('OptionalResourceService: failed to save file', error); + log.error('failed to save file', error); // Still return the data that we just fetched } diff --git a/app/PreventDisplaySleepService.ts b/app/PreventDisplaySleepService.ts index 3905768216..ff5905f3a2 100644 --- a/app/PreventDisplaySleepService.ts +++ b/app/PreventDisplaySleepService.ts @@ -2,7 +2,9 @@ // SPDX-License-Identifier: AGPL-3.0-only import type { PowerSaveBlocker } from 'electron'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; + +const log = createLogger('PreventDisplaySleepService'); export class PreventDisplaySleepService { private blockerId: undefined | number; diff --git a/app/SystemTrayService.ts b/app/SystemTrayService.ts index e9e6152b2f..1a36d93539 100644 --- a/app/SystemTrayService.ts +++ b/app/SystemTrayService.ts @@ -6,9 +6,11 @@ import { Menu, Tray, app, nativeImage, nativeTheme, screen } from 'electron'; import os from 'node:os'; import { join } from 'node:path'; import { readFileSync } from 'node:fs'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; import type { LocalizerType } from '../ts/types/I18N'; +const log = createLogger('SystemTrayService'); + export type SystemTrayServiceOptionsType = Readonly<{ i18n: LocalizerType; diff --git a/app/SystemTraySettingCache.ts b/app/SystemTraySettingCache.ts index fe07622858..7f108c5885 100644 --- a/app/SystemTraySettingCache.ts +++ b/app/SystemTraySettingCache.ts @@ -1,7 +1,7 @@ // Copyright 2017 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; import OS from '../ts/util/os/osMain'; import { parseSystemTraySetting, @@ -10,6 +10,8 @@ import { import { isSystemTraySupported } from '../ts/types/Settings'; import type { ConfigType } from './base_config'; +const log = createLogger('SystemTraySettingCache'); + /** * A small helper class to get and cache the `system-tray-setting` preference in the main * process. diff --git a/app/WindowsNotifications.ts b/app/WindowsNotifications.ts index a168780b0b..5a780b6843 100644 --- a/app/WindowsNotifications.ts +++ b/app/WindowsNotifications.ts @@ -9,11 +9,13 @@ import { sendDummyKeystroke, } from '@indutny/simple-windows-notifications'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; import { AUMID } from './startup_config'; import type { WindowsNotificationData } from '../ts/services/notifications'; import { renderWindowsToast } from './renderWindowsToast'; +const log = createLogger('WindowsNotifications'); + export { sendDummyKeystroke }; const notifier = new Notifier(AUMID); diff --git a/app/attachment_channel.ts b/app/attachment_channel.ts index b15e325fe7..a81cca3aa9 100644 --- a/app/attachment_channel.ts +++ b/app/attachment_channel.ts @@ -42,7 +42,7 @@ import { safeParseInteger } from '../ts/util/numbers'; import { parseLoose } from '../ts/util/schemas'; import { sleep } from '../ts/util/sleep'; import { toWebStream } from '../ts/util/toWebStream'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; import { deleteAll as deleteAllAttachments, deleteAllBadges, @@ -62,6 +62,8 @@ import { getTempPath, } from './attachments'; +const log = createLogger('attachment_channel'); + let initialized = false; const ERASE_ATTACHMENTS_KEY = 'erase-attachments'; @@ -731,13 +733,13 @@ function handleRangeRequest({ // Chromium only sends open-ended ranges: "start-" const match = range.match(/^bytes=(\d+)-$/); if (match == null) { - log.error(`attachment_channel: invalid range header: ${range}`); + log.error(`invalid range header: ${range}`); return create200Response(); } const startParam = safeParseInteger(match[1]); if (startParam == null) { - log.error(`attachment_channel: invalid range header: ${range}`); + log.error(`invalid range header: ${range}`); return create200Response(); } diff --git a/app/attachments.ts b/app/attachments.ts index 435ac19218..749add7d9f 100644 --- a/app/attachments.ts +++ b/app/attachments.ts @@ -20,7 +20,9 @@ import { } from '../ts/AttachmentCrypto'; import type { LocalAttachmentV2Type } from '../ts/types/Attachment'; import * as Errors from '../ts/types/errors'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; + +const log = createLogger('attachments'); const PATH = 'attachments.noindex'; const AVATAR_PATH = 'avatars.noindex'; diff --git a/app/base_config.ts b/app/base_config.ts index 16fa135d24..152c64f694 100644 --- a/app/base_config.ts +++ b/app/base_config.ts @@ -7,7 +7,9 @@ import { sync as writeFileSync } from 'write-file-atomic'; import { get } from 'lodash'; import { set } from 'lodash/fp'; import { strictAssert } from '../ts/util/assert'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; + +const log = createLogger('base_config'); const ENCODING = 'utf8'; diff --git a/app/config.ts b/app/config.ts index 5133d685d0..3309542764 100644 --- a/app/config.ts +++ b/app/config.ts @@ -12,7 +12,9 @@ import { setEnvironment, parseEnvironment, } from '../ts/environment'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; + +const log = createLogger('config'); // In production mode, NODE_ENV cannot be customized by the user if (app.isPackaged) { @@ -52,7 +54,7 @@ const config: IConfig = require('config'); if (getEnvironment() !== Environment.PackagedApp) { config.util.getConfigSources().forEach(source => { - log.info(`config: Using config source ${basename(source.name)}`); + log.info(`Using config source ${basename(source.name)}`); }); } diff --git a/app/dns-fallback.ts b/app/dns-fallback.ts index 423a7105a2..0e8119afd9 100644 --- a/app/dns-fallback.ts +++ b/app/dns-fallback.ts @@ -6,7 +6,9 @@ import { readFile } from 'fs/promises'; import { DNSFallbackSchema } from '../ts/types/DNSFallback'; import type { DNSFallbackType } from '../ts/types/DNSFallback'; import { parseUnknown } from '../ts/util/schemas'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; + +const log = createLogger('dns-fallback'); let cached: DNSFallbackType | undefined; diff --git a/app/global_errors.ts b/app/global_errors.ts index 3e6b81979a..8615f575d6 100644 --- a/app/global_errors.ts +++ b/app/global_errors.ts @@ -6,10 +6,12 @@ import os from 'node:os'; import * as Errors from '../ts/types/errors'; import { redactAll } from '../ts/util/privacy'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; import { reallyJsonStringify } from '../ts/util/reallyJsonStringify'; import type { LocaleType } from './locale'; +const log = createLogger('global_errors'); + // We use hard-coded strings until we're able to update these strings from the locale. let quitText = 'Quit'; let copyErrorAndQuitText = 'Copy error and quit'; diff --git a/app/main.ts b/app/main.ts index e23cb9b89a..2149ae4407 100644 --- a/app/main.ts +++ b/app/main.ts @@ -46,7 +46,7 @@ import type { ThemeSettingType } from '../ts/types/StorageUIKeys'; import { ThemeType } from '../ts/types/Util'; import * as Errors from '../ts/types/errors'; import { resolveCanonicalLocales } from '../ts/util/resolveCanonicalLocales'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; import * as debugLog from '../ts/logging/debuglogs'; import * as uploadDebugLog from '../ts/logging/uploadDebugLog'; import { explodePromise } from '../ts/util/explodePromise'; @@ -125,6 +125,8 @@ import { getOwn } from '../ts/util/getOwn'; import { safeParseLoose, safeParseUnknown } from '../ts/util/schemas'; import { getAppErrorIcon } from '../ts/util/getAppErrorIcon'; +const log = createLogger('app/main'); + const animationSettings = systemPreferences.getAnimationSettings(); if (OS.isMacOS()) { diff --git a/app/permissions.ts b/app/permissions.ts index 05a8d45f80..21f2158152 100644 --- a/app/permissions.ts +++ b/app/permissions.ts @@ -7,7 +7,9 @@ import type { session as ElectronSession, Session } from 'electron'; import type { ConfigType } from './base_config'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; + +const log = createLogger('permissions'); const PERMISSIONS: Record = { // Allowed diff --git a/app/protocol_filter.ts b/app/protocol_filter.ts index 9f16dc7af4..ca0fccd84d 100644 --- a/app/protocol_filter.ts +++ b/app/protocol_filter.ts @@ -15,7 +15,9 @@ import { getTempPath, getUpdateCachePath, } from './attachments'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; + +const log = createLogger('protocol_filter'); type CallbackType = (response: string | ProtocolResponse) => void; diff --git a/app/spell_check.ts b/app/spell_check.ts index 729be2af53..288e39f786 100644 --- a/app/spell_check.ts +++ b/app/spell_check.ts @@ -11,9 +11,11 @@ import type { MenuListType } from '../ts/types/menu'; import type { LocalizerType } from '../ts/types/Util'; import { strictAssert } from '../ts/util/assert'; import type { LoggerType } from '../ts/types/Logging'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; import { handleAttachmentRequest } from './attachment_channel'; +const log = createLogger('spell_check'); + export const FAKE_DEFAULT_LOCALE = 'und'; // 'und' is the BCP 47 subtag for "undetermined" strictAssert( diff --git a/app/startup_config.ts b/app/startup_config.ts index 107daf07ea..2dc518344b 100644 --- a/app/startup_config.ts +++ b/app/startup_config.ts @@ -4,9 +4,11 @@ import { app } from 'electron'; import packageJson from '../package.json'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; import * as GlobalErrors from './global_errors'; +const log = createLogger('startup_config'); + GlobalErrors.addHandler(); // Set umask early on in the process lifecycle to ensure file permissions are diff --git a/app/user_config.ts b/app/user_config.ts index fe1ed95fe6..824562c972 100644 --- a/app/user_config.ts +++ b/app/user_config.ts @@ -7,9 +7,11 @@ import { app } from 'electron'; import { start } from './base_config'; import config from './config'; -import * as log from '../ts/logging/log'; +import { createLogger } from '../ts/logging/log'; import * as Errors from '../ts/types/errors'; +const log = createLogger('user_config'); + let userData: string | undefined; // Use separate data directory for benchmarks & development if (config.has('storagePath')) { diff --git a/ts/AttachmentCrypto.ts b/ts/AttachmentCrypto.ts index 01412642b5..c003ff5a1a 100644 --- a/ts/AttachmentCrypto.ts +++ b/ts/AttachmentCrypto.ts @@ -21,7 +21,7 @@ import { import type { ChunkSizeChoice } from '@signalapp/libsignal-client/dist/incremental_mac'; import { isAbsolute } from 'path'; -import * as log from './logging/log'; +import { createLogger } from './logging/log'; import { HashType, CipherType, @@ -45,6 +45,8 @@ import { missingCaseError } from './util/missingCaseError'; import { getEnvironment, Environment } from './environment'; import { toBase64 } from './Bytes'; +const log = createLogger('AttachmentCrypto'); + // This file was split from ts/Crypto.ts because it pulls things in from node, and // too many things pull in Crypto.ts, so it broke storybook. diff --git a/ts/CI.ts b/ts/CI.ts index 237d003490..ba068dd3f3 100644 --- a/ts/CI.ts +++ b/ts/CI.ts @@ -6,7 +6,7 @@ import { ipcRenderer } from 'electron'; import type { IPCResponse as ChallengeResponseType } from './challenge'; import type { MessageAttributesType } from './model-types.d'; -import * as log from './logging/log'; +import { createLogger } from './logging/log'; import { explodePromise } from './util/explodePromise'; import { AccessType, ipcInvoke } from './sql/channels'; import { backupsService } from './services/backups'; @@ -19,6 +19,8 @@ import { strictAssert } from './util/assert'; import { MessageModel } from './models/messages'; import type { SocketStatuses } from './textsecure/SocketManager'; +const log = createLogger('CI'); + type ResolveType = (data: unknown) => void; export type CIType = { @@ -81,7 +83,7 @@ export function getCI({ const pendingCompleted = completedEvents.get(event) || []; if (pendingCompleted.length) { const pending = pendingCompleted.shift(); - log.info(`CI: resolving pending result for ${event}`, pending); + log.info(`resolving pending result for ${event}`, pending); if (pendingCompleted.length === 0) { completedEvents.delete(event); @@ -91,7 +93,7 @@ export function getCI({ } } - log.info(`CI: waiting for event ${event}`); + log.info(`waiting for event ${event}`); const { resolve, reject, promise } = explodePromise(); const timer = setTimeout(() => { @@ -134,12 +136,12 @@ export function getCI({ eventListeners.delete(event); } - log.info(`CI: got event ${event} with data`, data); + log.info(`got event ${event} with data`, data); resolve(data); return; } - log.info(`CI: postponing event ${event}`); + log.info(`postponing event ${event}`); let resultList = completedEvents.get(event); if (!resultList) { diff --git a/ts/CI/benchmarkConversationOpen.ts b/ts/CI/benchmarkConversationOpen.ts index fd50e12d44..fac9f1f9a9 100644 --- a/ts/CI/benchmarkConversationOpen.ts +++ b/ts/CI/benchmarkConversationOpen.ts @@ -15,9 +15,11 @@ import { sleep } from '../util/sleep'; import { stats } from '../util/benchmark/stats'; import type { StatsType } from '../util/benchmark/stats'; import type { MessageAttributesType } from '../model-types.d'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import { postSaveUpdates } from '../util/cleanup'; +const log = createLogger('benchmarkConversationOpen'); + const BUFFER_DELAY_MS = 50; type PopulateConversationArgsType = { diff --git a/ts/ConversationController.ts b/ts/ConversationController.ts index 251e1bbe26..e5f6cf855e 100644 --- a/ts/ConversationController.ts +++ b/ts/ConversationController.ts @@ -15,7 +15,7 @@ import type { import type { ConversationModel } from './models/conversations'; import { DataReader, DataWriter } from './sql/Client'; -import * as log from './logging/log'; +import { createLogger } from './logging/log'; import * as Errors from './types/errors'; import { getAuthorId } from './messages/helpers'; import { maybeDeriveGroupV2Id } from './groups'; @@ -43,6 +43,8 @@ import { isConversationAccepted } from './util/isConversationAccepted'; import { areWePending } from './util/groupMembershipUtils'; import { conversationJobQueue } from './jobs/conversationJobQueue'; +const log = createLogger('ConversationController'); + type ConvoMatchType = | { key: 'serviceId' | 'pni'; @@ -854,7 +856,7 @@ export class ConversationController { // Note: `doCombineConversations` is directly used within this function since both // run on `_combineConversationsQueue` queue and we don't want deadlocks. async #doCheckForConflicts(): Promise { - log.info('ConversationController.checkForConflicts: starting...'); + log.info('checkForConflicts: starting...'); const byServiceId = Object.create(null); const byE164 = Object.create(null); const byGroupV2Id = Object.create(null); @@ -1309,11 +1311,11 @@ export class ConversationController { setReadOnly(value: boolean): void { if (this.#isReadOnly === value) { - log.warn(`ConversationController: already at readOnly=${value}`); + log.warn(`already at readOnly=${value}`); return; } - log.info(`ConversationController: readOnly=${value}`); + log.info(`readOnly=${value}`); this.#isReadOnly = value; } @@ -1415,7 +1417,7 @@ export class ConversationController { } } log.info( - `ConversationController: unset avatars for ${numberOfConversationsMigrated} unaccepted conversations` + `unset avatars for ${numberOfConversationsMigrated} unaccepted conversations` ); drop(window.storage.put('avatarsHaveBeenMigrated', true)); } @@ -1430,9 +1432,7 @@ export class ConversationController { continue; } - log.warn( - `ConversationController: Repairing ${convo.idForLogging()}'s isPinned` - ); + log.warn(`Repairing ${convo.idForLogging()}'s isPinned`); convo.set('isPinned', true); drop(updateConversation(convo.attributes)); @@ -1447,7 +1447,7 @@ export class ConversationController { } log.info( - 'ConversationController.clearShareMyPhoneNumber: ' + + 'clearShareMyPhoneNumber: ' + `updating ${sharedWith.length} conversations` ); @@ -1469,7 +1469,7 @@ export class ConversationController { const e164ToUse = transformedE164s.get(e164) ?? e164; const pni = serviceIdMap.get(e164ToUse)?.pni; - log.info(`ConversationController: forgetting e164=${e164ToUse} pni=${pni}`); + log.info(`forgetting e164=${e164ToUse} pni=${pni}`); const convos = [this.get(e164ToUse), this.get(pni)]; @@ -1486,7 +1486,7 @@ export class ConversationController { } async #doLoad(): Promise { - log.info('ConversationController: starting initial fetch'); + log.info('starting initial fetch'); if (this._conversations.length) { throw new Error('ConversationController: Already loaded!'); @@ -1502,7 +1502,7 @@ export class ConversationController { if (temporaryConversations.length) { log.warn( - `ConversationController: Removing ${temporaryConversations.length} temporary conversations` + `Removing ${temporaryConversations.length} temporary conversations` ); } const queue = new PQueue({ @@ -1563,21 +1563,18 @@ export class ConversationController { } } catch (error) { log.error( - 'ConversationController.load/map: Failed to prepare a conversation', + 'load/map: Failed to prepare a conversation', Errors.toLogFormat(error) ); } }) ); log.info( - 'ConversationController: done with initial fetch, ' + + 'done with initial fetch, ' + `got ${this._conversations.length} conversations` ); } catch (error) { - log.error( - 'ConversationController: initial fetch failed', - Errors.toLogFormat(error) - ); + log.error('initial fetch failed', Errors.toLogFormat(error)); throw error; } } diff --git a/ts/Curve.ts b/ts/Curve.ts index e731ae6353..3015a7c197 100644 --- a/ts/Curve.ts +++ b/ts/Curve.ts @@ -11,7 +11,9 @@ import type { CompatPreKeyType, CompatSignedPreKeyType, } from './textsecure/Types.d'; -import * as log from './logging/log'; +import { createLogger } from './logging/log'; + +const log = createLogger('Curve'); export function isNonNegativeInteger(n: unknown): n is number { return typeof n === 'number' && n % 1 === 0 && n >= 0; diff --git a/ts/IdleDetector.ts b/ts/IdleDetector.ts index 8da55849e3..bcdeb3b33d 100644 --- a/ts/IdleDetector.ts +++ b/ts/IdleDetector.ts @@ -2,9 +2,11 @@ // SPDX-License-Identifier: AGPL-3.0-only import EventEmitter from 'events'; -import * as log from './logging/log'; +import { createLogger } from './logging/log'; import { clearTimeoutIfNecessary } from './util/clearTimeoutIfNecessary'; +const log = createLogger('IdleDetector'); + const POLL_INTERVAL_MS = 5 * 1000; const IDLE_THRESHOLD_MS = 20; diff --git a/ts/RemoteConfig.ts b/ts/RemoteConfig.ts index 3a7445f65c..37a6150757 100644 --- a/ts/RemoteConfig.ts +++ b/ts/RemoteConfig.ts @@ -4,7 +4,7 @@ import { get, throttle } from 'lodash'; import type { WebAPIType } from './textsecure/WebAPI'; -import * as log from './logging/log'; +import { createLogger } from './logging/log'; import type { AciString } from './types/ServiceId'; import { parseIntOrThrow } from './util/parseIntOrThrow'; import { HOUR } from './util/durations'; @@ -15,6 +15,8 @@ import { HashType } from './types/Crypto'; import { getCountryCode } from './types/PhoneNumber'; import { parseRemoteClientExpiration } from './util/parseRemoteClientExpiration'; +const log = createLogger('RemoteConfig'); + export type ConfigKeyType = | 'desktop.calling.ringrtcAdmFull.3' | 'desktop.calling.ringrtcAdmInternal' diff --git a/ts/SignalProtocolStore.ts b/ts/SignalProtocolStore.ts index e5858150a7..31ef8902b7 100644 --- a/ts/SignalProtocolStore.ts +++ b/ts/SignalProtocolStore.ts @@ -54,7 +54,7 @@ import { isServiceIdString, ServiceIdKind } from './types/ServiceId'; import type { Address } from './types/Address'; import type { QualifiedAddressStringType } from './types/QualifiedAddress'; import { QualifiedAddress } from './types/QualifiedAddress'; -import * as log from './logging/log'; +import { createLogger } from './logging/log'; import * as Errors from './types/errors'; import { MINUTE } from './util/durations'; import { conversationJobQueue } from './jobs/conversationJobQueue'; @@ -65,6 +65,8 @@ import { import { formatGroups, groupWhile } from './util/groupWhile'; import { parseUnknown } from './util/schemas'; +const log = createLogger('SignalProtocolStore'); + const TIMESTAMP_THRESHOLD = 5 * 1000; // 5 seconds const LOW_KEYS_THRESHOLD = 25; @@ -172,7 +174,7 @@ async function _fillCaches, HydratedType>( }); } - log.info(`SignalProtocolStore: Finished caching ${field} data`); + log.info(`Finished caching ${field} data`); // eslint-disable-next-line no-param-reassign, @typescript-eslint/no-explicit-any object[field] = cache as any; } @@ -1203,7 +1205,7 @@ export class SignalProtocolStore extends EventEmitter { this.#currentZone = zone; if (zone !== GLOBAL_ZONE) { - log.info(`SignalProtocolStore.enterZone(${zone.name}:${name})`); + log.info(`enterZone(${zone.name}:${name})`); } } } @@ -1225,7 +1227,7 @@ export class SignalProtocolStore extends EventEmitter { } if (zone !== GLOBAL_ZONE) { - log.info(`SignalProtocolStore.leaveZone(${zone.name})`); + log.info(`leaveZone(${zone.name})`); } this.#currentZone = undefined; @@ -1245,8 +1247,7 @@ export class SignalProtocolStore extends EventEmitter { } log.info( - `SignalProtocolStore: running blocked ${toEnter.length} jobs in ` + - `zone ${next.zone.name}` + `running blocked ${toEnter.length} jobs in zone ${next.zone.name}` ); for (const { callback } of toEnter) { callback(); @@ -1781,8 +1782,7 @@ export class SignalProtocolStore extends EventEmitter { }; log.info( - `SignalProtocolStore: migrating identity key from ${record.fromDB.id} ` + - `to ${newRecord.id}` + `migrating identity key from ${record.fromDB.id} to ${newRecord.id}` ); await this.#_saveIdentityKey(newRecord); @@ -2428,7 +2428,7 @@ export class SignalProtocolStore extends EventEmitter { async removeOurOldPni(oldPni: PniString): Promise { const { storage } = window; - log.info(`SignalProtocolStore.removeOurOldPni(${oldPni})`); + log.info(`removeOurOldPni(${oldPni})`); // Update caches this.#ourIdentityKeys.delete(oldPni); diff --git a/ts/backbone/reliable_trigger.ts b/ts/backbone/reliable_trigger.ts index 8473c8e9f1..2ddc100810 100644 --- a/ts/backbone/reliable_trigger.ts +++ b/ts/backbone/reliable_trigger.ts @@ -2,7 +2,9 @@ // SPDX-License-Identifier: AGPL-3.0-only import type * as Backbone from 'backbone'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; + +const log = createLogger('reliable_trigger'); type InternalBackboneEvent = { callback: (...args: Array) => unknown; diff --git a/ts/background.ts b/ts/background.ts index 3437c08267..1f7a2ef6ee 100644 --- a/ts/background.ts +++ b/ts/background.ts @@ -148,7 +148,7 @@ import { } from './types/ServiceId'; import { isAciString } from './util/isAciString'; import { normalizeAci } from './util/normalizeAci'; -import * as log from './logging/log'; +import { createLogger } from './logging/log'; import { deleteAllLogs } from './util/deleteAllLogs'; import { startInteractionMode } from './services/InteractionMode'; import { ReactionSource } from './reactions/ReactionSource'; @@ -220,6 +220,8 @@ import { NavTab } from './state/ducks/nav'; import { Page } from './components/Preferences'; import { EditState } from './components/ProfileEditor'; +const log = createLogger('background'); + export function isOverHourIntoPast(timestamp: number): boolean { return isNumber(timestamp) && isOlderThan(timestamp, HOUR); } @@ -371,7 +373,7 @@ export async function startApp(): Promise { const { Message } = window.Signal.Types; - log.info('background page reloaded'); + log.info('page reloaded'); log.info('environment:', getEnvironment()); let newVersion = false; @@ -756,7 +758,7 @@ export async function startApp(): Promise { // These make key operations available to IPC handlers created in preload.js window.Events = createIPCEvents({ shutdown: async () => { - log.info('background/shutdown'); + log.info('shutdown'); flushMessageCounter(); @@ -780,12 +782,12 @@ export async function startApp(): Promise { server !== undefined, 'WebAPI should be initialized together with MessageReceiver' ); - log.info('background/shutdown: shutting down messageReceiver'); + log.info('shutdown: shutting down messageReceiver'); pauseProcessing('shutdown'); await window.waitForAllBatchers(); } - log.info('background/shutdown: flushing conversations'); + log.info('shutdown: flushing conversations'); // Flush debounced updates for conversations await Promise.all( @@ -797,27 +799,27 @@ export async function startApp(): Promise { sleeper.shutdown(); const shutdownQueues = async () => { - log.info('background/shutdown: shutting down queues'); + log.info('shutdown: shutting down queues'); await Promise.allSettled([ StartupQueue.shutdown(), shutdownAllJobQueues(), ]); - log.info('background/shutdown: shutting down conversation queues'); + log.info('shutdown: shutting down conversation queues'); await Promise.allSettled( window.ConversationController.getAll().map(async convo => { try { await convo.shutdownJobQueue(); } catch (err) { log.error( - `background/shutdown: error waiting for conversation ${convo.idForLogging} job queue shutdown`, + `shutdown: error waiting for conversation ${convo.idForLogging} job queue shutdown`, Errors.toLogFormat(err) ); } }) ); - log.info('background/shutdown: all queues shutdown'); + log.info('shutdown: all queues shutdown'); }; // wait for at most 1 minutes for startup queue and job queues to drain @@ -827,7 +829,7 @@ export async function startApp(): Promise { new Promise((resolve, _) => { timeout = setTimeout(() => { log.warn( - 'background/shutdown - timed out waiting for StartupQueue/JobQueues, continuing with shutdown' + 'shutdown - timed out waiting for StartupQueue/JobQueues, continuing with shutdown' ); timeout = undefined; resolve(); @@ -838,7 +840,7 @@ export async function startApp(): Promise { clearTimeout(timeout); } - log.info('background/shutdown: waiting for all batchers'); + log.info('shutdown: waiting for all batchers'); // A number of still-to-queue database queries might be waiting inside batchers. // We wait for these to empty first, and then shut down the data interface. @@ -848,14 +850,14 @@ export async function startApp(): Promise { ]); log.info( - 'background/shutdown: waiting for all attachment backups & downloads to finish' + 'shutdown: waiting for all attachment backups & downloads to finish' ); // Since we canceled the inflight requests earlier in shutdown, these should // resolve quickly await attachmentDownloadStopPromise; await attachmentBackupStopPromise; - log.info('background/shutdown: closing the database'); + log.info('shutdown: closing the database'); // Shut down the data interface cleanly await DataWriter.shutdown(); @@ -1095,7 +1097,7 @@ export async function startApp(): Promise { ); } catch (error) { log.warn( - 'background/setInterval: Failed to parse integer from desktop.retryRespondMaxAge feature flag', + 'setInterval: Failed to parse integer from desktop.retryRespondMaxAge feature flag', Errors.toLogFormat(error) ); } @@ -1104,7 +1106,7 @@ export async function startApp(): Promise { await DataWriter.deleteSentProtosOlderThan(now - sentProtoMaxAge); } catch (error) { log.error( - 'background/onready/setInterval: Error deleting sent protos: ', + 'onready/setInterval: Error deleting sent protos: ', Errors.toLogFormat(error) ); } @@ -1135,7 +1137,7 @@ export async function startApp(): Promise { }); } catch (error) { log.error( - 'background/onready/setInterval: Error getting expired retry placeholders: ', + 'onready/setInterval: Error getting expired retry placeholders: ', Errors.toLogFormat(error) ); } @@ -1162,7 +1164,7 @@ export async function startApp(): Promise { await window.ConversationController.checkForConflicts(); } catch (error) { log.error( - 'background.js: ConversationController failed to load:', + 'js: ConversationController failed to load:', Errors.toLogFormat(error) ); } finally { @@ -1344,7 +1346,7 @@ export async function startApp(): Promise { }); if (reconnect) { - log.info('background: reconnecting websocket on user change'); + log.info('reconnecting websocket on user change'); enqueueReconnectToWebSocket(); } }); @@ -1434,7 +1436,7 @@ export async function startApp(): Promise { return; } - log.error('background: remote expiration detected, disabling reconnects'); + log.error('remote expiration detected, disabling reconnects'); drop(window.storage.put('remoteBuildExpiration', Date.now())); drop(server?.onExpiration('remote')); remotelyExpired = true; @@ -1646,7 +1648,7 @@ export async function startApp(): Promise { strictAssert(server, 'server must be initialized'); const onOnline = () => { - log.info('background: online'); + log.info('online'); drop(afterAuthSocketConnect()); }; @@ -1658,7 +1660,7 @@ export async function startApp(): Promise { const hasAppEverBeenRegistered = Registration.everDone(); - log.info('background: offline', { + log.info('offline', { authSocketConnectCount, hasInitialLoadCompleted, appView, @@ -1679,19 +1681,17 @@ export async function startApp(): Promise { if (state.app.appView === AppViewType.Installer) { if (state.installer.step === InstallScreenStep.LinkInProgress) { log.info( - 'background: offline, but app has been registered before; opening inbox' + 'offline, but app has been registered before; opening inbox' ); window.reduxActions.app.openInbox(); } else if (state.installer.step === InstallScreenStep.BackupImport) { - log.warn('background: offline, but app has needs to import backup'); + log.warn('offline, but app has needs to import backup'); // TODO: DESKTOP-7584 } } if (!hasInitialLoadCompleted) { - log.info( - 'background: offline; initial load not completed; triggering onEmpty' - ); + log.info('offline; initial load not completed; triggering onEmpty'); drop(onEmpty({ isFromMessageReceiver: false })); // this ensures that the inbox loading progress bar is dismissed } } @@ -2019,13 +2019,13 @@ export async function startApp(): Promise { } function onNavigatorOffline() { - log.info('background: navigator offline'); + log.info('navigator offline'); drop(server?.onNavigatorOffline()); } function onNavigatorOnline() { - log.info('background: navigator online'); + log.info('navigator online'); drop(server?.onNavigatorOnline()); } @@ -3247,7 +3247,7 @@ export async function startApp(): Promise { function onError(ev: ErrorEvent): void { const { error } = ev; - log.error('background onError:', Errors.toLogFormat(error)); + log.error('onError:', Errors.toLogFormat(error)); if ( error instanceof HTTPError && @@ -3257,7 +3257,7 @@ export async function startApp(): Promise { return; } - log.warn('background onError: Doing nothing with incoming error'); + log.warn('onError: Doing nothing with incoming error'); } function onViewOnceOpenSync(ev: ViewOnceOpenSyncEvent): void { diff --git a/ts/badges/badgeImageFileDownloader.ts b/ts/badges/badgeImageFileDownloader.ts index 19599c2380..f1f8ec41cc 100644 --- a/ts/badges/badgeImageFileDownloader.ts +++ b/ts/badges/badgeImageFileDownloader.ts @@ -3,11 +3,13 @@ import PQueue from 'p-queue'; import { DataWriter } from '../sql/Client'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import { MINUTE } from '../util/durations'; import { missingCaseError } from '../util/missingCaseError'; import { waitForOnline } from '../util/waitForOnline'; +const log = createLogger('badgeImageFileDownloader'); + enum BadgeDownloaderState { Idle, Checking, diff --git a/ts/badges/parseBadgesFromServer.ts b/ts/badges/parseBadgesFromServer.ts index 90fafdb9a7..274099ac18 100644 --- a/ts/badges/parseBadgesFromServer.ts +++ b/ts/badges/parseBadgesFromServer.ts @@ -5,12 +5,14 @@ import * as z from 'zod'; import { isEmpty } from 'lodash'; import { isRecord } from '../util/isRecord'; import { isNormalNumber } from '../util/isNormalNumber'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import type { BadgeType, BadgeImageType } from './types'; import { parseBadgeCategory } from './BadgeCategory'; import { BadgeImageTheme, parseBadgeImageTheme } from './BadgeImageTheme'; import { safeParseUnknown } from '../util/schemas'; +const log = createLogger('parseBadgesFromServer'); + const MAX_BADGES = 1000; const badgeFromServerSchema = z.object({ diff --git a/ts/calling/VideoSupport.ts b/ts/calling/VideoSupport.ts index dbd22bcebd..13a59310de 100644 --- a/ts/calling/VideoSupport.ts +++ b/ts/calling/VideoSupport.ts @@ -9,7 +9,9 @@ import { videoPixelFormatToEnum } from '@signalapp/ringrtc'; import type { VideoFrameSender, VideoFrameSource } from '@signalapp/ringrtc'; import type { RefObject } from 'react'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; + +const log = createLogger('VideoSupport'); export class GumVideoCaptureOptions { maxWidth = 640; diff --git a/ts/challenge.ts b/ts/challenge.ts index 122d2d035c..3990feab09 100644 --- a/ts/challenge.ts +++ b/ts/challenge.ts @@ -19,11 +19,13 @@ import { missingCaseError } from './util/missingCaseError'; import type { StorageInterface } from './types/Storage.d'; import * as Errors from './types/errors'; import { HTTPError, type SendMessageChallengeData } from './textsecure/Errors'; -import * as log from './logging/log'; +import { createLogger } from './logging/log'; import { drop } from './util/drop'; import { findRetryAfterTimeFromError } from './jobs/helpers/findRetryAfterTimeFromError'; import { MINUTE } from './util/durations'; +const log = createLogger('challenge'); + export type ChallengeResponse = Readonly<{ captcha: string; }>; @@ -150,14 +152,14 @@ export class ChallengeHandler { const challenges: ReadonlyArray = this.options.storage.get(STORAGE_KEY) || []; - log.info(`challenge: loading ${challenges.length} challenges`); + log.info(`loading ${challenges.length} challenges`); await Promise.all( challenges.map(async challenge => { const expireAfter = this.options.expireAfter || DEFAULT_EXPIRE_AFTER; if (isOlderThan(challenge.createdAt, expireAfter)) { log.info( - `challenge: expired challenge for conversation ${challenge.conversationId}` + `expired challenge for conversation ${challenge.conversationId}` ); return; } @@ -177,7 +179,7 @@ export class ChallengeHandler { public async onOffline(): Promise { this.#isOnline = false; - log.info('challenge: offline'); + log.info('offline'); } public async onOnline(): Promise { @@ -186,7 +188,7 @@ export class ChallengeHandler { const pending = Array.from(this.#pendingStarts.values()); this.#pendingStarts.clear(); - log.info(`challenge: online, starting ${pending.length} queues`); + log.info(`online, starting ${pending.length} queues`); // Start queues for challenges that matured while we were offline await this.#startAllQueues(); @@ -321,9 +323,7 @@ export class ChallengeHandler { conversationId: string, source: string ): Promise { - log.info( - `challenge: unregistered conversation ${conversationId} via ${source}` - ); + log.info(`unregistered conversation ${conversationId} via ${source}`); this.#registeredConversations.delete(conversationId); this.#pendingStarts.delete(conversationId); @@ -374,7 +374,7 @@ export class ChallengeHandler { }: { force?: boolean; } = {}): void { - log.info(`challenge: startAllQueues force=${force}`); + log.info(`startAllQueues force=${force}`); Array.from(this.#registeredConversations.values()) .filter(challenge => force || shouldStartQueue(challenge)) diff --git a/ts/components/Avatar.tsx b/ts/components/Avatar.tsx index 68f5206376..d04ab0d9da 100644 --- a/ts/components/Avatar.tsx +++ b/ts/components/Avatar.tsx @@ -16,7 +16,7 @@ import { filterDOMProps } from '@react-aria/utils'; import type { AvatarColorType } from '../types/Colors'; import type { BadgeType } from '../badges/types'; import type { LocalizerType } from '../types/Util'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import { BadgeImageTheme } from '../badges/BadgeImageTheme'; import { HasStories } from '../types/Stories'; import { Spinner } from './Spinner'; @@ -28,6 +28,8 @@ import { isBadgeVisible } from '../badges/isBadgeVisible'; import { SIGNAL_AVATAR_PATH } from '../types/SignalConversation'; import { getAvatarPlaceholderGradient } from '../utils/getAvatarPlaceholderGradient'; +const log = createLogger('Avatar'); + export enum AvatarBlur { NoBlur, BlurPicture, @@ -134,7 +136,7 @@ export function Avatar({ const image = new Image(); image.src = avatarUrl; image.onerror = () => { - log.warn('Avatar: Image failed to load; failing over to placeholder'); + log.warn('Image failed to load; failing over to placeholder'); setImageBroken(true); }; diff --git a/ts/components/AvatarPreview.tsx b/ts/components/AvatarPreview.tsx index 7c388bbb7b..53d9643f39 100644 --- a/ts/components/AvatarPreview.tsx +++ b/ts/components/AvatarPreview.tsx @@ -5,7 +5,7 @@ import type { CSSProperties } from 'react'; import React, { useEffect, useState } from 'react'; import { noop } from 'lodash'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import type { LocalizerType } from '../types/Util'; import { Spinner } from './Spinner'; import type { AvatarColorType } from '../types/Colors'; @@ -14,6 +14,8 @@ import { getInitials } from '../util/getInitials'; import { imagePathToBytes } from '../util/imagePathToBytes'; import { type ConversationType } from '../state/ducks/conversations'; +const log = createLogger('AvatarPreview'); + export type PropsType = { avatarColor?: AvatarColorType; avatarUrl?: string; diff --git a/ts/components/CallManager.tsx b/ts/components/CallManager.tsx index ed47936ef8..a1faa0bde9 100644 --- a/ts/components/CallManager.tsx +++ b/ts/components/CallManager.tsx @@ -48,7 +48,7 @@ import { missingCaseError } from '../util/missingCaseError'; import { CallingToastProvider } from './CallingToast'; import type { SmartReactionPicker } from '../state/smart/ReactionPicker'; import type { Props as ReactionPickerProps } from './conversation/ReactionPicker'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import { isGroupOrAdhocActiveCall } from '../util/isGroupOrAdhocCall'; import { CallingAdhocCallInfo } from './CallingAdhocCallInfo'; import { callLinkRootKeyToUrl } from '../util/callLinkRootKeyToUrl'; @@ -60,6 +60,8 @@ import { } from '../types/NotificationProfile'; import type { NotificationProfileType } from '../types/NotificationProfile'; +const log = createLogger('CallManager'); + const GROUP_CALL_RING_DURATION = 60 * 1000; export type DirectIncomingCall = Readonly<{ @@ -618,16 +620,16 @@ export function CallManager({ activeNotificationProfile?.id ?? '' ); log.info( - `CallManager: Would play ringtone, but notification profile ${redactedId} prevented it` + `Would play ringtone, but notification profile ${redactedId} prevented it` ); return; } - log.info('CallManager: Playing ringtone'); + log.info('Playing ringtone'); playRingtone(); return () => { - log.info('CallManager: Stopping ringtone'); + log.info('Stopping ringtone'); stopRingtone(); }; } @@ -734,7 +736,7 @@ export function CallManager({ activeNotificationProfile?.id ?? '' ); log.info( - `CallManager: Would show incoming call bar, but notification profile ${redactedId} prevented it` + `Would show incoming call bar, but notification profile ${redactedId} prevented it` ); return null; } diff --git a/ts/components/CallingRaisedHandsList.tsx b/ts/components/CallingRaisedHandsList.tsx index f2cb65ea8b..a2599b9c74 100644 --- a/ts/components/CallingRaisedHandsList.tsx +++ b/ts/components/CallingRaisedHandsList.tsx @@ -12,10 +12,12 @@ import type { LocalizerType } from '../types/Util'; import type { ConversationType } from '../state/ducks/conversations'; import { ModalHost } from './ModalHost'; import { drop } from '../util/drop'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import { usePrevious } from '../hooks/usePrevious'; import { useReducedMotion } from '../hooks/useReducedMotion'; +const log = createLogger('CallingRaisedHandsList'); + export type PropsType = { readonly i18n: LocalizerType; readonly onClose: () => void; @@ -45,10 +47,9 @@ export function CallingRaisedHandsList({ raisedHands.forEach(demuxId => { const conversation = conversationsByDemuxId.get(demuxId); if (!conversation) { - log.warn( - 'CallingRaisedHandsList: Failed to get conversationsByDemuxId for demuxId', - { demuxId } - ); + log.warn('Failed to get conversationsByDemuxId for demuxId', { + demuxId, + }); return; } diff --git a/ts/components/CallsList.tsx b/ts/components/CallsList.tsx index 6355271acc..caae891deb 100644 --- a/ts/components/CallsList.tsx +++ b/ts/components/CallsList.tsx @@ -36,7 +36,7 @@ import { toBoundedDate, } from '../util/timestamp'; import type { ConversationType } from '../state/ducks/conversations'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import { refMerger } from '../util/refMerger'; import { drop } from '../util/drop'; import { strictAssert } from '../util/assert'; @@ -73,6 +73,8 @@ import type { StartCallData } from './ConfirmLeaveCallModal'; import { Button, ButtonVariant } from './Button'; import type { ICUJSXMessageParamsByKeyType } from '../types/Util'; +const log = createLogger('CallsList'); + function Timestamp({ i18n, timestamp, @@ -576,7 +578,7 @@ export function CallsList({ ]); results = { count, items }; } catch (error) { - log.error('CallsList#fetchTotal error fetching', error); + log.error('fetchTotal error fetching', error); } // Clear the loading indicator timeout @@ -671,7 +673,7 @@ export function CallsList({ }; }); } catch (error) { - log.error('CallsList#loadMoreRows error fetching', error); + log.error('loadMoreRows error fetching', error); } }, [enqueueCallPeeks, searchState] diff --git a/ts/components/CompositionInput.tsx b/ts/components/CompositionInput.tsx index a572fe235d..0ea101d791 100644 --- a/ts/components/CompositionInput.tsx +++ b/ts/components/CompositionInput.tsx @@ -59,7 +59,7 @@ import { SignalClipboard } from '../quill/signal-clipboard'; import { DirectionalBlot } from '../quill/block/blot'; import { getClassNamesFor } from '../util/getClassNamesFor'; import { isNotNil } from '../util/isNotNil'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import * as Errors from '../types/errors'; import type { LinkPreviewForUIType } from '../types/message/LinkPreviews'; import { StagedLinkPreview } from './conversation/StagedLinkPreview'; @@ -83,6 +83,8 @@ import { useFunEmojiSearch } from './fun/useFunEmojiSearch'; import type { EmojiCompletionOptions } from '../quill/emoji/completion'; import { useFunEmojiLocalizer } from './fun/useFunEmojiLocalizer'; +const log = createLogger('CompositionInput'); + Quill.register( { 'formats/emoji': EmojiBlot, @@ -348,16 +350,14 @@ export function CompositionInput(props: Props): React.ReactElement { } if (!canSendRef.current) { - log.warn( - 'CompositionInput: Not submitting message - cannot send right now' - ); + log.warn('Not submitting message - cannot send right now'); return; } const { text, bodyRanges } = getTextAndRanges(); log.info( - `CompositionInput: Submitting message ${timestamp} with ${bodyRanges.length} ranges` + `Submitting message ${timestamp} with ${bodyRanges.length} ranges` ); canSendRef.current = false; const didSend = onSubmit(text, bodyRanges, timestamp); @@ -967,7 +967,7 @@ export function CompositionInput(props: Props): React.ReactElement { window.addEventListener('mouseup', onMouseUp); } catch (error) { log.error( - 'CompositionInput.onMouseDown: Failed to check event target', + 'onMouseDown: Failed to check event target', Errors.toLogFormat(error) ); } diff --git a/ts/components/CompositionRecordingDraft.tsx b/ts/components/CompositionRecordingDraft.tsx index de09f672ec..a2f0bdd26c 100644 --- a/ts/components/CompositionRecordingDraft.tsx +++ b/ts/components/CompositionRecordingDraft.tsx @@ -7,10 +7,12 @@ import type { LocalizerType } from '../types/Util'; import { WaveformScrubber } from './conversation/WaveformScrubber'; import { PlaybackButton } from './PlaybackButton'; import { RecordingComposer } from './RecordingComposer'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import type { Size } from '../hooks/useSizeObserver'; import { SizeObserver } from '../hooks/useSizeObserver'; +const log = createLogger('CompositionRecordingDraft'); + export type Props = { i18n: LocalizerType; audioUrl: string | undefined; diff --git a/ts/components/DebugLogWindow.tsx b/ts/components/DebugLogWindow.tsx index dae59a4a08..a64c64a4f6 100644 --- a/ts/components/DebugLogWindow.tsx +++ b/ts/components/DebugLogWindow.tsx @@ -8,7 +8,7 @@ import type { LocalizerType } from '../types/Util'; import * as Errors from '../types/errors'; import type { AnyToast } from '../types/Toast'; import { ToastType } from '../types/Toast'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import { Button, ButtonVariant } from './Button'; import { Spinner } from './Spinner'; import { ToastManager } from './ToastManager'; @@ -17,6 +17,8 @@ import { shouldNeverBeCalled } from '../util/shouldNeverBeCalled'; import { openLinkInWebBrowser } from '../util/openLinkInWebBrowser'; import { useEscapeHandling } from '../hooks/useEscapeHandling'; +const log = createLogger('DebugLogWindow'); + enum LoadState { NotStarted, Started, @@ -96,7 +98,7 @@ export function DebugLogWindow({ const publishedLogURL = await uploadLogs(text); setPublicLogURL(publishedLogURL); } catch (error) { - log.error('DebugLogWindow error:', Errors.toLogFormat(error)); + log.error('error:', Errors.toLogFormat(error)); setLoadState(LoadState.Loaded); setToast({ toastType: ToastType.DebugLogError }); } diff --git a/ts/components/ErrorBoundary.tsx b/ts/components/ErrorBoundary.tsx index 58aaa11ae4..1cf2f73d35 100644 --- a/ts/components/ErrorBoundary.tsx +++ b/ts/components/ErrorBoundary.tsx @@ -5,9 +5,11 @@ import type { ReactNode, ErrorInfo } from 'react'; import React from 'react'; import * as Errors from '../types/errors'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import { ToastType } from '../types/Toast'; +const log = createLogger('ErrorBoundary'); + export type Props = { children: ReactNode; name: string; @@ -33,7 +35,7 @@ export class ErrorBoundary extends React.PureComponent { const { closeView, name } = this.props; log.error( - `ErrorBoundary/${name}: ` + + `${name}: ` + `captured rendering error ${Errors.toLogFormat(error)}` + `\nerrorInfo: ${errorInfo.componentStack}` ); diff --git a/ts/components/GroupCallRemoteParticipants.tsx b/ts/components/GroupCallRemoteParticipants.tsx index 48d1297e68..df7b78f06e 100644 --- a/ts/components/GroupCallRemoteParticipants.tsx +++ b/ts/components/GroupCallRemoteParticipants.tsx @@ -24,12 +24,14 @@ import { missingCaseError } from '../util/missingCaseError'; import { SECOND } from '../util/durations'; import { filter, join } from '../util/iterables'; import * as setUtil from '../util/setUtil'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import { MAX_FRAME_HEIGHT, MAX_FRAME_WIDTH } from '../calling/constants'; import { SizeObserver } from '../hooks/useSizeObserver'; import { strictAssert } from '../util/assert'; import type { CallingImageDataCache } from './CallManager'; +const log = createLogger('GroupCallRemoteParticipants'); + const SMALL_TILES_MIN_HEIGHT = 80; const LARGE_TILES_MIN_HEIGHT = 200; const PARTICIPANT_MARGIN = 12; @@ -774,7 +776,7 @@ function getGridParticipantsByPage({ if (!nextPage) { log.warn( - `GroupCallRemoteParticipants: failed after ${attemptNumber} attempts to layout + `failed after ${attemptNumber} attempts to layout the page; pageIndex: ${pages.length}, \ # fit in priority order: ${nextPageInPriorityOrder.numParticipants}, \ # fit in sorted order: ${nextPageInSortedOrder.numParticipants}` diff --git a/ts/components/I18n.tsx b/ts/components/I18n.tsx index 96494771c5..12214ebed6 100644 --- a/ts/components/I18n.tsx +++ b/ts/components/I18n.tsx @@ -7,7 +7,9 @@ import type { LocalizerType, ICUJSXMessageParamsByKeyType, } from '../types/Util'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; + +const log = createLogger('I18n'); export type Props = { /** The translation string id */ diff --git a/ts/components/Inbox.tsx b/ts/components/Inbox.tsx index ee0a6db0ab..9c564e192d 100644 --- a/ts/components/Inbox.tsx +++ b/ts/components/Inbox.tsx @@ -5,10 +5,12 @@ import type { ReactNode } from 'react'; import React, { useEffect, useState, useMemo } from 'react'; import classNames from 'classnames'; import type { LocalizerType } from '../types/Util'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import { SECOND, DAY } from '../util/durations'; import type { SmartNavTabsProps } from '../state/smart/NavTabs'; +const log = createLogger('Inbox'); + export type PropsType = { firstEnvelopeTimestamp: number | undefined; envelopeTimestamp: number | undefined; diff --git a/ts/components/Lightbox.tsx b/ts/components/Lightbox.tsx index 95eafb5c0e..5caf59093d 100644 --- a/ts/components/Lightbox.tsx +++ b/ts/components/Lightbox.tsx @@ -16,7 +16,7 @@ import type { import type { LocalizerType } from '../types/Util'; import type { MediaItemType } from '../types/MediaItem'; import * as GoogleChrome from '../util/GoogleChrome'; -import * as log from '../logging/log'; +import { createLogger } from '../logging/log'; import * as Errors from '../types/errors'; import { Avatar, AvatarSize } from './Avatar'; import { IMAGE_PNG, isImage, isVideo } from '../types/MIME'; @@ -35,6 +35,8 @@ import { formatFileSize } from '../util/formatFileSize'; import { SECOND } from '../util/durations'; import { Toast } from './Toast'; +const log = createLogger('Lightbox'); + export type PropsType = { children?: ReactNode; closeLightbox: () => unknown; @@ -308,7 +310,7 @@ export function Lightbox({ if (videoElement.paused) { onMediaPlaybackStart(); void videoElement.play().catch(error => { - log.error('Lightbox: Failed to play video', Errors.toLogFormat(error)); + log.error('Failed to play video', Errors.toLogFormat(error)); }); } else { videoElement.pause(); @@ -667,7 +669,7 @@ export function Lightbox({ /> ); } else { - log.info('Lightbox: Unexpected content type', { contentType }); + log.info('Unexpected content type', { contentType }); content = (