Skip to content

feat: Logger API/Helpers #570

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/giant-moose-crash.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@powersync/web': minor
---

Removed `js-logger` dependency, using the logger helper exposed by `@powersync/common`.
5 changes: 5 additions & 0 deletions .changeset/lemon-shrimps-pretend.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@powersync/common': minor
---

Added logger helpers, which can be used instead of the `js-logger` dependency.
4 changes: 1 addition & 3 deletions packages/common/rollup.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,7 @@ export default (commandLineArgs) => {
// This makes life easier
external: [
// This has dynamic logic - makes bundling hard
'cross-fetch',
// TODO: make the useDefaults logic better. Currently need access to this package directly
'js-logger'
'cross-fetch'
]
};
};
1 change: 1 addition & 0 deletions packages/common/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ export * from './db/DBAdapter.js';
export * from './utils/AbortOperation.js';
export * from './utils/BaseObserver.js';
export * from './utils/DataStream.js';
export * from './utils/Logger.js';
export * from './utils/parseQuery.js';

export * from './types/types.js';
47 changes: 47 additions & 0 deletions packages/common/src/utils/Logger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import Logger, { type ILogger, type ILogLevel } from 'js-logger';

export { GlobalLogger, ILogger, ILoggerOpts, ILogHandler, ILogLevel } from 'js-logger';

const TypedLogger: ILogger = Logger as any;

export const LogLevel = {
TRACE: TypedLogger.TRACE,
DEBUG: TypedLogger.DEBUG,
INFO: TypedLogger.INFO,
TIME: TypedLogger.TIME,
WARN: TypedLogger.WARN,
ERROR: TypedLogger.ERROR,
OFF: TypedLogger.OFF
};

export interface CreateLoggerOptions {
logLevel?: ILogLevel;
}

/**
* Retrieves the base (default) logger instance.
*
* This base logger controls the default logging configuration and is shared
* across all loggers created with `createLogger`. Adjusting settings on this
* base logger affects all loggers derived from it unless explicitly overridden.
*
*/
export function createBaseLogger() {
return Logger;
}

/**
* Creates and configures a new named logger based on the base logger.
*
* Named loggers allow specific modules or areas of your application to have
* their own logging levels and behaviors. These loggers inherit configuration
* from the base logger by default but can override settings independently.
*/
export function createLogger(name: string, options: CreateLoggerOptions = {}): ILogger {
const logger = Logger.get(name);
if (options.logLevel) {
logger.setLevel(options.logLevel);
}

return logger;
}
3 changes: 1 addition & 2 deletions packages/web/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,7 @@
"async-mutex": "^0.4.0",
"bson": "^6.6.0",
"comlink": "^4.4.2",
"commander": "^12.1.0",
"js-logger": "^1.6.1"
"commander": "^12.1.0"
},
"devDependencies": {
"@journeyapps/wa-sqlite": "^1.2.2",
Expand Down
5 changes: 2 additions & 3 deletions packages/web/src/db/adapters/AbstractWebSQLOpenFactory.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { DBAdapter, SQLOpenFactory } from '@powersync/common';
import Logger, { ILogger } from 'js-logger';
import { type ILogger, createLogger, DBAdapter, SQLOpenFactory } from '@powersync/common';
import { SSRDBAdapter } from './SSRDBAdapter';
import { ResolvedWebSQLFlags, WebSQLOpenFactoryOptions, isServerSide, resolveWebSQLFlags } from './web-sql-flags';

Expand All @@ -9,7 +8,7 @@ export abstract class AbstractWebSQLOpenFactory implements SQLOpenFactory {

constructor(protected options: WebSQLOpenFactoryOptions) {
this.resolvedFlags = resolveWebSQLFlags(options.flags);
this.logger = options.logger ?? Logger.get(`AbstractWebSQLOpenFactory - ${this.options.dbFilename}`);
this.logger = options.logger ?? createLogger(`AbstractWebSQLOpenFactory - ${this.options.dbFilename}`);
}

/**
Expand Down
5 changes: 3 additions & 2 deletions packages/web/src/db/adapters/LockedAsyncDatabaseAdapter.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import {
type ILogger,
BaseObserver,
createLogger,
DBAdapter,
DBAdapterListener,
DBGetUtils,
Expand All @@ -8,7 +10,6 @@ import {
QueryResult,
Transaction
} from '@powersync/common';
import Logger, { ILogger } from 'js-logger';
import { getNavigatorLocks } from '../..//shared/navigator';
import { AsyncDatabaseConnection } from './AsyncDatabaseConnection';
import { SharedConnectionWorker, WebDBAdapter } from './WebDBAdapter';
Expand Down Expand Up @@ -50,7 +51,7 @@ export class LockedAsyncDatabaseAdapter
constructor(protected options: LockedAsyncDatabaseAdapterOptions) {
super();
this._dbIdentifier = options.name;
this.logger = options.logger ?? Logger.get(`LockedAsyncDatabaseAdapter - ${this._dbIdentifier}`);
this.logger = options.logger ?? createLogger(`LockedAsyncDatabaseAdapter - ${this._dbIdentifier}`);
// Set the name if provided. We can query for the name if not available yet
this.debugMode = options.debugMode ?? false;
if (this.debugMode) {
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/db/adapters/web-sql-flags.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { SQLOpenOptions } from '@powersync/common';
import { ILogger } from 'js-logger';
import { type ILogger, SQLOpenOptions } from '@powersync/common';

/**
* Common settings used when creating SQL connections on web.
Expand Down
3 changes: 1 addition & 2 deletions packages/web/src/db/sync/WebRemote.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
import { type ILogger } from 'js-logger';

import {
AbstractRemote,
AbstractRemoteOptions,
BSONImplementation,
DEFAULT_REMOTE_LOGGER,
FetchImplementation,
FetchImplementationProvider,
ILogger,
RemoteConnector
} from '@powersync/common';

Expand Down
18 changes: 9 additions & 9 deletions packages/web/src/worker/sync/BroadcastLogger.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import Logger, { type ILogLevel, type ILogger } from 'js-logger';
import { type ILogger, type ILogLevel, LogLevel } from '@powersync/common';
import { type WrappedSyncPort } from './SharedSyncImplementation';

/**
Expand All @@ -14,13 +14,13 @@ export class BroadcastLogger implements ILogger {
OFF: ILogLevel;

constructor(protected clients: WrappedSyncPort[]) {
this.TRACE = Logger.TRACE;
this.DEBUG = Logger.DEBUG;
this.INFO = Logger.INFO;
this.TIME = Logger.TIME;
this.WARN = Logger.WARN;
this.ERROR = Logger.ERROR;
this.OFF = Logger.OFF;
this.TRACE = LogLevel.TRACE;
this.DEBUG = LogLevel.DEBUG;
this.INFO = LogLevel.INFO;
this.TIME = LogLevel.TIME;
this.WARN = LogLevel.WARN;
this.ERROR = LogLevel.ERROR;
this.OFF = LogLevel.OFF;
}

trace(...x: any[]): void {
Expand Down Expand Up @@ -75,7 +75,7 @@ export class BroadcastLogger implements ILogger {

getLevel(): ILogLevel {
// Levels are not adjustable on this level.
return Logger.INFO;
return LogLevel.INFO;
}

enabledFor(level: ILogLevel): boolean {
Expand Down
5 changes: 3 additions & 2 deletions packages/web/src/worker/sync/SharedSyncImplementation.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
import {
type AbstractStreamingSyncImplementation,
type ILogger,
type LockOptions,
type PowerSyncConnectionOptions,
type StreamingSyncImplementation,
type StreamingSyncImplementationListener,
type SyncStatusOptions,
AbortOperation,
BaseObserver,
createLogger,
DBAdapter,
SqliteBucketStorage,
SyncStatus
} from '@powersync/common';
import { Mutex } from 'async-mutex';
import * as Comlink from 'comlink';
import Logger, { type ILogger } from 'js-logger';
import { WebRemote } from '../../db/sync/WebRemote';
import {
WebStreamingSyncImplementation,
Expand Down Expand Up @@ -107,7 +108,7 @@ export class SharedSyncImplementation
this.dbAdapter = null;
this.syncParams = null;
this.syncStreamClient = null;
this.logger = Logger.get('shared-sync');
this.logger = createLogger('shared-sync');
this.lastConnectOptions = undefined;

this.isInitialized = new Promise((resolve) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ import {
SharedSyncClientEvent,
type ManualSharedSyncPayload
} from './SharedSyncImplementation';
import Logger from 'js-logger';
import { createBaseLogger } from '@powersync/common';

const _self: SharedWorkerGlobalScope = self as any;
Logger.useDefaults();
const logger = createBaseLogger();
logger.useDefaults();

const sharedSyncImplementation = new SharedSyncImplementation();

_self.onconnect = function (event: MessageEvent<string>) {
Expand Down
14 changes: 10 additions & 4 deletions packages/web/tests/multiple_instances.test.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
import { AbstractPowerSyncDatabase, SqliteBucketStorage, SyncStatus } from '@powersync/common';
import {
AbstractPowerSyncDatabase,
createBaseLogger,
createLogger,
SqliteBucketStorage,
SyncStatus
} from '@powersync/common';
import {
SharedWebStreamingSyncImplementation,
SharedWebStreamingSyncImplementationOptions,
WebRemote
} from '@powersync/web';
import { Mutex } from 'async-mutex';
import Logger from 'js-logger';

import { beforeAll, describe, expect, it, vi } from 'vitest';
import { WebDBAdapter } from '../src/db/adapters/WebDBAdapter';
import { TestConnector } from './utils/MockStreamOpenFactory';
Expand All @@ -20,7 +26,7 @@ describe('Multiple Instances', { sequential: true }, () => {
schema: testSchema
});

beforeAll(() => Logger.useDefaults());
beforeAll(() => createBaseLogger().useDefaults());

function createAsset(powersync: AbstractPowerSyncDatabase) {
return powersync.execute('INSERT INTO assets(id, description) VALUES(uuid(), ?)', ['test']);
Expand All @@ -39,7 +45,7 @@ describe('Multiple Instances', { sequential: true }, () => {
});

it('should broadcast logs from shared sync worker', { timeout: 20000 }, async () => {
const logger = Logger.get('test-logger');
const logger = createLogger('test-logger');
const spiedErrorLogger = vi.spyOn(logger, 'error');
const spiedDebugLogger = vi.spyOn(logger, 'debug');

Expand Down
9 changes: 4 additions & 5 deletions packages/web/tests/uploads.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { WebPowerSyncDatabaseOptions } from '@powersync/web';
import Logger from 'js-logger';
import { createBaseLogger, createLogger, WebPowerSyncDatabaseOptions } from '@powersync/web';
import p from 'p-defer';
import { v4 } from 'uuid';
import { beforeAll, describe, expect, it, vi } from 'vitest';
Expand Down Expand Up @@ -40,10 +39,10 @@ describe(

function describeCrudUploadTests(getDatabaseOptions: () => WebPowerSyncDatabaseOptions) {
return () => {
beforeAll(() => Logger.useDefaults());
beforeAll(() => createBaseLogger().useDefaults());

it('should warn for missing upload operations in uploadData', async () => {
const logger = Logger.get('crud-logger');
const logger = createLogger('crud-logger');

const options = getDatabaseOptions();

Expand Down Expand Up @@ -83,7 +82,7 @@ function describeCrudUploadTests(getDatabaseOptions: () => WebPowerSyncDatabaseO
});

it('should immediately upload sequential transactions', async () => {
const logger = Logger.get('crud-logger');
const logger = createLogger('crud-logger');

const options = getDatabaseOptions();

Expand Down
1 change: 0 additions & 1 deletion packages/web/webpack.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@ module.exports = () => {
'@powersync/common': '@powersync/common',
'async-mutex': 'async-mutex',
comlink: 'comlink',
'js-logger': 'js-logger',
lodash: 'lodash'
},
devtool: production ? 'source-map' : 'cheap-module-source-map',
Expand Down
3 changes: 0 additions & 3 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.