Skip to content

Commit 5b085fd

Browse files
authored
feat(logger): introduce context-level logger (#1896)
1 parent 2320d9c commit 5b085fd

24 files changed

+144
-90
lines changed

docs/api.md

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
- [class: Worker](#class-worker)
2828
- [class: BrowserServer](#class-browserserver)
2929
- [class: BrowserType](#class-browsertype)
30-
- [class: LoggerSink](#class-loggersink)
30+
- [class: Logger](#class-logger)
3131
- [class: ChromiumBrowser](#class-chromiumbrowser)
3232
- [class: ChromiumBrowserContext](#class-chromiumbrowsercontext)
3333
- [class: ChromiumCoverage](#class-chromiumcoverage)
@@ -218,6 +218,7 @@ Indicates that the browser is connected.
218218
- `username` <[string]>
219219
- `password` <[string]>
220220
- `colorScheme` <"dark"|"light"|"no-preference"> Emulates `'prefers-colors-scheme'` media feature, supported values are `'light'`, `'dark'`, `'no-preference'`. See [page.emulateMedia(options)](#pageemulatemediaoptions) for more details. Defaults to '`light`'.
221+
- `logger` <[Logger]> Logger sink for Playwright logging.
221222
- returns: <[Promise]<[BrowserContext]>>
222223

223224
Creates a new browser context. It won't share cookies/cache with other browser contexts.
@@ -259,6 +260,7 @@ Creates a new browser context. It won't share cookies/cache with other browser c
259260
- `username` <[string]>
260261
- `password` <[string]>
261262
- `colorScheme` <"dark"|"light"|"no-preference"> Emulates `'prefers-colors-scheme'` media feature, supported values are `'light'`, `'dark'`, `'no-preference'`. See [page.emulateMedia(options)](#pageemulatemediaoptions) for more details. Defaults to '`light`'.
263+
- `logger` <[Logger]> Logger sink for Playwright logging.
262264
- returns: <[Promise]<[Page]>>
263265

264266
Creates a new page in a new browser context. Closing this page will close the context as well.
@@ -3757,7 +3759,7 @@ const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
37573759
- `options` <[Object]>
37583760
- `wsEndpoint` <[string]> A browser websocket endpoint to connect to. **required**
37593761
- `slowMo` <[number]> Slows down Playwright operations by the specified amount of milliseconds. Useful so that you can see what is going on. Defaults to 0.
3760-
- `loggerSink` <[LoggerSink]> Sink for log messages.
3762+
- `logger` <[Logger]> Logger sink for Playwright logging.
37613763
- returns: <[Promise]<[Browser]>>
37623764

37633765
This methods attaches Playwright to an existing browser instance.
@@ -3774,7 +3776,7 @@ This methods attaches Playwright to an existing browser instance.
37743776
- `handleSIGINT` <[boolean]> Close the browser process on Ctrl-C. Defaults to `true`.
37753777
- `handleSIGTERM` <[boolean]> Close the browser process on SIGTERM. Defaults to `true`.
37763778
- `handleSIGHUP` <[boolean]> Close the browser process on SIGHUP. Defaults to `true`.
3777-
- `loggerSink` <[LoggerSink]> Sink for log messages.
3779+
- `logger` <[Logger]> Logger sink for Playwright logging.
37783780
- `timeout` <[number]> Maximum time in milliseconds to wait for the browser instance to start. Defaults to `30000` (30 seconds). Pass `0` to disable timeout.
37793781
- `env` <[Object]> Specify environment variables that will be visible to the browser. Defaults to `process.env`.
37803782
- `devtools` <[boolean]> **Chromium-only** Whether to auto-open a Developer Tools panel for each tab. If this option is `true`, the `headless` option will be set `false`.
@@ -3807,7 +3809,7 @@ const browser = await chromium.launch({ // Or 'firefox' or 'webkit'.
38073809
- `handleSIGINT` <[boolean]> Close the browser process on Ctrl-C. Defaults to `true`.
38083810
- `handleSIGTERM` <[boolean]> Close the browser process on SIGTERM. Defaults to `true`.
38093811
- `handleSIGHUP` <[boolean]> Close the browser process on SIGHUP. Defaults to `true`.
3810-
- `loggerSink` <[LoggerSink]> Sink for log messages.
3812+
- `logger` <[Logger]> Logger sink for Playwright logging.
38113813
- `timeout` <[number]> Maximum time in milliseconds to wait for the browser instance to start. Defaults to `30000` (30 seconds). Pass `0` to disable timeout.
38123814
- `env` <[Object]> Specify environment variables that will be visible to the browser. Defaults to `process.env`.
38133815
- `devtools` <[boolean]> **Chromium-only** Whether to auto-open a Developer Tools panel for each tab. If this option is `true`, the `headless` option will be set `false`.
@@ -3826,7 +3828,7 @@ Launches browser instance that uses persistent storage located at `userDataDir`.
38263828
- `handleSIGINT` <[boolean]> Close the browser process on Ctrl-C. Defaults to `true`.
38273829
- `handleSIGTERM` <[boolean]> Close the browser process on SIGTERM. Defaults to `true`.
38283830
- `handleSIGHUP` <[boolean]> Close the browser process on SIGHUP. Defaults to `true`.
3829-
- `loggerSink` <[LoggerSink]> Sink for log messages.
3831+
- `logger` <[Logger]> Logger sink for Playwright logging.
38303832
- `timeout` <[number]> Maximum time in milliseconds to wait for the browser instance to start. Defaults to `30000` (30 seconds). Pass `0` to disable timeout.
38313833
- `env` <[Object]> Specify environment variables that will be visible to the browser. Defaults to `process.env`.
38323834
- `devtools` <[boolean]> **Chromium-only** Whether to auto-open a Developer Tools panel for each tab. If this option is `true`, the `headless` option will be set `false`.
@@ -3853,7 +3855,7 @@ const { chromium } = require('playwright'); // Or 'webkit' or 'firefox'.
38533855

38543856
Returns browser name. For example: `'chromium'`, `'webkit'` or `'firefox'`.
38553857

3856-
### class: LoggerSink
3858+
### class: Logger
38573859

38583860
Playwright generates a lot of logs and they are accessible via the pluggable logger sink.
38593861

@@ -3862,7 +3864,7 @@ const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
38623864

38633865
(async () => {
38643866
const browser = await chromium.launch({
3865-
loggerSink: {
3867+
logger: {
38663868
isEnabled: (name, severity) => name === 'browser',
38673869
log: (name, severity, message, args) => console.log(`${name} ${message}`)
38683870
}
@@ -3872,18 +3874,18 @@ const { chromium } = require('playwright'); // Or 'firefox' or 'webkit'.
38723874
```
38733875

38743876
<!-- GEN:toc -->
3875-
- [loggerSink.isEnabled(name, severity)](#loggersinkisenabledname-severity)
3876-
- [loggerSink.log(name, severity, message, args, hints)](#loggersinklogname-severity-message-args-hints)
3877+
- [logger.isEnabled(name, severity)](#loggerisenabledname-severity)
3878+
- [logger.log(name, severity, message, args, hints)](#loggerlogname-severity-message-args-hints)
38773879
<!-- GEN:stop -->
38783880

3879-
#### loggerSink.isEnabled(name, severity)
3881+
#### logger.isEnabled(name, severity)
38803882
- `name` <[string]> logger name
38813883
- `severity` <"verbose"|"info"|"warning"|"error">
38823884
- returns: <[boolean]>
38833885

38843886
Determines whether sink is interested in the logger with the given name and severity.
38853887

3886-
#### loggerSink.log(name, severity, message, args, hints)
3888+
#### logger.log(name, severity, message, args, hints)
38873889
- `name` <[string]> logger name
38883890
- `severity` <"verbose"|"info"|"warning"|"error">
38893891
- `message` <[string]|[Error]> log message format
@@ -4247,7 +4249,7 @@ const { chromium } = require('playwright');
42474249
[Frame]: #class-frame "Frame"
42484250
[JSHandle]: #class-jshandle "JSHandle"
42494251
[Keyboard]: #class-keyboard "Keyboard"
4250-
[LoggerSink]: #class-loggersink "LoggerSink"
4252+
[Logger]: #class-logger "Logger"
42514253
[Map]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map "Map"
42524254
[Mouse]: #class-mouse "Mouse"
42534255
[Object]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object "Object"

src/api.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export { Dialog } from './dialog';
2222
export { Download } from './download';
2323
export { ElementHandle } from './dom';
2424
export { FileChooser } from './fileChooser';
25-
export { LoggerSink } from './logger';
25+
export { Logger } from './logger';
2626
export { TimeoutError } from './errors';
2727
export { Frame } from './frames';
2828
export { Keyboard, Mouse } from './input';

src/browser.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { EventEmitter } from 'events';
2020
import { Download } from './download';
2121
import type { BrowserServer } from './server/browserServer';
2222
import { Events } from './events';
23-
import { Logger, Log } from './logger';
23+
import { InnerLogger, Log } from './logger';
2424

2525
export interface Browser extends EventEmitter {
2626
newContext(options?: BrowserContextOptions): Promise<BrowserContext>;
@@ -30,13 +30,13 @@ export interface Browser extends EventEmitter {
3030
close(): Promise<void>;
3131
}
3232

33-
export abstract class BrowserBase extends EventEmitter implements Browser, Logger {
33+
export abstract class BrowserBase extends EventEmitter implements Browser, InnerLogger {
3434
_downloadsPath: string = '';
3535
private _downloads = new Map<string, Download>();
3636
_ownedServer: BrowserServer | null = null;
37-
readonly _logger: Logger;
37+
readonly _logger: InnerLogger;
3838

39-
constructor(logger: Logger) {
39+
constructor(logger: InnerLogger) {
4040
super();
4141
this._logger = logger;
4242
}

src/browserContext.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { Events } from './events';
2424
import { ExtendedEventEmitter } from './extendedEventEmitter';
2525
import { Download } from './download';
2626
import { BrowserBase } from './browser';
27-
import { Log, Logger } from './logger';
27+
import { Log, InnerLogger, Logger, RootLogger } from './logger';
2828

2929
export type BrowserContextOptions = {
3030
viewport?: types.Size | null,
@@ -43,10 +43,11 @@ export type BrowserContextOptions = {
4343
isMobile?: boolean,
4444
hasTouch?: boolean,
4545
colorScheme?: types.ColorScheme,
46-
acceptDownloads?: boolean
46+
acceptDownloads?: boolean,
47+
logger?: Logger,
4748
};
4849

49-
export interface BrowserContext extends Logger {
50+
export interface BrowserContext extends InnerLogger {
5051
setDefaultNavigationTimeout(timeout: number): void;
5152
setDefaultTimeout(timeout: number): void;
5253
pages(): Page[];
@@ -79,11 +80,13 @@ export abstract class BrowserContextBase extends ExtendedEventEmitter implements
7980
readonly _permissions = new Map<string, string[]>();
8081
readonly _downloads = new Set<Download>();
8182
readonly _browserBase: BrowserBase;
83+
private _logger: InnerLogger;
8284

8385
constructor(browserBase: BrowserBase, options: BrowserContextOptions) {
8486
super();
8587
this._browserBase = browserBase;
8688
this._options = options;
89+
this._logger = options.logger ? new RootLogger(options.logger) : browserBase;
8790
this._closePromise = new Promise(fulfill => this._closePromiseFulfill = fulfill);
8891
}
8992

@@ -155,11 +158,11 @@ export abstract class BrowserContextBase extends ExtendedEventEmitter implements
155158
}
156159

157160
_isLogEnabled(log: Log): boolean {
158-
return this._browserBase._isLogEnabled(log);
161+
return this._logger._isLogEnabled(log);
159162
}
160163

161164
_log(log: Log, message: string | Error, ...args: any[]) {
162-
return this._browserBase._log(log, message, ...args);
165+
return this._logger._log(log, message, ...args);
163166
}
164167
}
165168

src/chromium/crBrowser.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import { readProtocolStream } from './crProtocolHelper';
2929
import { Events } from './events';
3030
import { Protocol } from './protocol';
3131
import { CRExecutionContext } from './crExecutionContext';
32-
import { Logger, logError } from '../logger';
32+
import { InnerLogger, logError } from '../logger';
3333

3434
export class CRBrowser extends BrowserBase {
3535
readonly _connection: CRConnection;
@@ -47,7 +47,7 @@ export class CRBrowser extends BrowserBase {
4747
private _tracingPath: string | null = '';
4848
private _tracingClient: CRSession | undefined;
4949

50-
static async connect(transport: ConnectionTransport, isPersistent: boolean, logger: Logger, slowMo?: number): Promise<CRBrowser> {
50+
static async connect(transport: ConnectionTransport, isPersistent: boolean, logger: InnerLogger, slowMo?: number): Promise<CRBrowser> {
5151
const connection = new CRConnection(SlowMoTransport.wrap(transport, slowMo), logger);
5252
const browser = new CRBrowser(connection, logger, isPersistent);
5353
const session = connection.rootSession;
@@ -84,7 +84,7 @@ export class CRBrowser extends BrowserBase {
8484
return browser;
8585
}
8686

87-
constructor(connection: CRConnection, logger: Logger, isPersistent: boolean) {
87+
constructor(connection: CRConnection, logger: InnerLogger, isPersistent: boolean) {
8888
super(logger);
8989
this._connection = connection;
9090
this._session = this._connection.rootSession;

src/chromium/crConnection.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { assert } from '../helper';
1919
import { ConnectionTransport, ProtocolRequest, ProtocolResponse, protocolLog } from '../transport';
2020
import { Protocol } from './protocol';
2121
import { EventEmitter } from 'events';
22-
import { Logger } from '../logger';
22+
import { InnerLogger } from '../logger';
2323

2424
export const ConnectionEvents = {
2525
Disconnected: Symbol('ConnectionEvents.Disconnected')
@@ -35,9 +35,9 @@ export class CRConnection extends EventEmitter {
3535
private readonly _sessions = new Map<string, CRSession>();
3636
readonly rootSession: CRSession;
3737
_closed = false;
38-
private _logger: Logger;
38+
private _logger: InnerLogger;
3939

40-
constructor(transport: ConnectionTransport, logger: Logger) {
40+
constructor(transport: ConnectionTransport, logger: InnerLogger) {
4141
super();
4242
this._transport = transport;
4343
this._logger = logger;

src/chromium/crCoverage.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { Protocol } from './protocol';
2121

2222
import { EVALUATION_SCRIPT_URL } from './crExecutionContext';
2323
import * as types from '../types';
24-
import { logError, Logger } from '../logger';
24+
import { logError, InnerLogger } from '../logger';
2525

2626
type JSRange = {
2727
startOffset: number,
@@ -51,7 +51,7 @@ export class CRCoverage {
5151
private _jsCoverage: JSCoverage;
5252
private _cssCoverage: CSSCoverage;
5353

54-
constructor(client: CRSession, logger: Logger) {
54+
constructor(client: CRSession, logger: InnerLogger) {
5555
this._jsCoverage = new JSCoverage(client, logger);
5656
this._cssCoverage = new CSSCoverage(client, logger);
5757
}
@@ -81,9 +81,9 @@ class JSCoverage {
8181
_eventListeners: RegisteredListener[];
8282
_resetOnNavigation: boolean;
8383
_reportAnonymousScripts = false;
84-
private _logger: Logger;
84+
private _logger: InnerLogger;
8585

86-
constructor(client: CRSession, logger: Logger) {
86+
constructor(client: CRSession, logger: InnerLogger) {
8787
this._client = client;
8888
this._logger = logger;
8989
this._enabled = false;
@@ -175,9 +175,9 @@ class CSSCoverage {
175175
_stylesheetSources: Map<string, string>;
176176
_eventListeners: RegisteredListener[];
177177
_resetOnNavigation: boolean;
178-
private _logger: Logger;
178+
private _logger: InnerLogger;
179179

180-
constructor(client: CRSession, logger: Logger) {
180+
constructor(client: CRSession, logger: InnerLogger) {
181181
this._client = client;
182182
this._logger = logger;
183183
this._enabled = false;

src/firefox/ffBrowser.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import { ConnectionEvents, FFConnection } from './ffConnection';
2727
import { headersArray } from './ffNetworkManager';
2828
import { FFPage } from './ffPage';
2929
import { Protocol } from './protocol';
30-
import { Logger } from '../logger';
30+
import { InnerLogger } from '../logger';
3131

3232
export class FFBrowser extends BrowserBase {
3333
_connection: FFConnection;
@@ -38,14 +38,14 @@ export class FFBrowser extends BrowserBase {
3838
readonly _firstPagePromise: Promise<void>;
3939
private _firstPageCallback = () => {};
4040

41-
static async connect(transport: ConnectionTransport, logger: Logger, attachToDefaultContext: boolean, slowMo?: number): Promise<FFBrowser> {
41+
static async connect(transport: ConnectionTransport, logger: InnerLogger, attachToDefaultContext: boolean, slowMo?: number): Promise<FFBrowser> {
4242
const connection = new FFConnection(SlowMoTransport.wrap(transport, slowMo), logger);
4343
const browser = new FFBrowser(connection, logger, attachToDefaultContext);
4444
await connection.send('Browser.enable', { attachToDefaultContext });
4545
return browser;
4646
}
4747

48-
constructor(connection: FFConnection, logger: Logger, isPersistent: boolean) {
48+
constructor(connection: FFConnection, logger: InnerLogger, isPersistent: boolean) {
4949
super(logger);
5050
this._connection = connection;
5151
this._ffPages = new Map();

src/firefox/ffConnection.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { EventEmitter } from 'events';
1919
import { assert } from '../helper';
2020
import { ConnectionTransport, ProtocolRequest, ProtocolResponse, protocolLog } from '../transport';
2121
import { Protocol } from './protocol';
22-
import { Logger } from '../logger';
22+
import { InnerLogger } from '../logger';
2323

2424
export const ConnectionEvents = {
2525
Disconnected: Symbol('Disconnected'),
@@ -33,7 +33,7 @@ export class FFConnection extends EventEmitter {
3333
private _lastId: number;
3434
private _callbacks: Map<number, {resolve: Function, reject: Function, error: Error, method: string}>;
3535
private _transport: ConnectionTransport;
36-
private _logger: Logger;
36+
private _logger: InnerLogger;
3737
readonly _sessions: Map<string, FFSession>;
3838
_closed: boolean;
3939

@@ -43,7 +43,7 @@ export class FFConnection extends EventEmitter {
4343
removeListener: <T extends keyof Protocol.Events | symbol>(event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this;
4444
once: <T extends keyof Protocol.Events | symbol>(event: T, listener: (payload: T extends symbol ? any : Protocol.Events[T extends keyof Protocol.Events ? T : never]) => void) => this;
4545

46-
constructor(transport: ConnectionTransport, logger: Logger) {
46+
constructor(transport: ConnectionTransport, logger: InnerLogger) {
4747
super();
4848
this._transport = transport;
4949
this._logger = logger;

src/javascript.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import * as types from './types';
1818
import * as dom from './dom';
1919
import { helper } from './helper';
20-
import { Logger } from './logger';
20+
import { InnerLogger } from './logger';
2121

2222
export interface ExecutionContextDelegate {
2323
evaluate(context: ExecutionContext, returnByValue: boolean, pageFunction: string | Function, ...args: any[]): Promise<any>;
@@ -29,9 +29,9 @@ export interface ExecutionContextDelegate {
2929

3030
export class ExecutionContext {
3131
readonly _delegate: ExecutionContextDelegate;
32-
readonly _logger: Logger;
32+
readonly _logger: InnerLogger;
3333

34-
constructor(delegate: ExecutionContextDelegate, logger: Logger) {
34+
constructor(delegate: ExecutionContextDelegate, logger: InnerLogger) {
3535
this._delegate = delegate;
3636
this._logger = logger;
3737
}

0 commit comments

Comments
 (0)