Skip to content

[XDebug Bridge] Add --quiet and --verbose options in bridge #2436

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 12 commits into
base: trunk
Choose a base branch
from
Open
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ The `server` command supports the following optional arguments:
- `--login`: Automatically log the user in as an administrator.
- `--skip-wordpress-setup`: Do not download or install WordPress. Useful if you are mounting a full WordPress directory.
- `--skip-sqlite-setup`: Do not set up the SQLite database integration.
- `--quiet`: Do not output logs and progress messages.
- `--verbosity`: Output logs and progress messages. Defaults to 'normal'.
- `--debug`: Print the PHP error log if an error occurs during boot.

## Need some help with the CLI?
Expand Down
18 changes: 9 additions & 9 deletions packages/php-wasm/logger/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -64,15 +64,15 @@
"lintFilePatterns": ["packages/php-wasm/logger/**/*.ts"],
"maxWarnings": 0
}
}
},
"typecheck": {
"executor": "nx:run-commands",
"options": {
"commands": [
"tsc -p packages/php-wasm/logger/tsconfig.lib.json --noEmit",
"tsc -p packages/php-wasm/logger/tsconfig.spec.json --noEmit"
]
},
"typecheck": {
"executor": "nx:run-commands",
"options": {
"commands": [
"tsc -p packages/php-wasm/logger/tsconfig.lib.json --noEmit",
"tsc -p packages/php-wasm/logger/tsconfig.spec.json --noEmit"
]
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import type { UniversalPHP, PHPRequestErrorEvent } from '../types';
import type { Logger } from '../logger';
import { type Logger, LogPrefix, LogSeverity } from '../logger';

let lastPHPLogLength = 0;
export const errorLogPath = '/wordpress/wp-content/debug.log';
Expand Down Expand Up @@ -32,6 +32,7 @@ export const collectPhpLogs = (
const currentLog = log.substring(lastPHPLogLength);
loggerInstance.logMessage({
message: currentLog,
severity: LogSeverity.Log,
raw: true,
});
lastPHPLogLength = log.length;
Expand All @@ -42,8 +43,9 @@ export const collectPhpLogs = (
if (event.error) {
loggerInstance.logMessage({
message: `${event.error.message} ${event.error.stack}`,
severity: 'Fatal',
prefix: event.source === 'request' ? 'PHP' : 'WASM Crash',
severity: LogSeverity.Fatal,
prefix:
event.source === 'request' ? LogPrefix.PHP : LogPrefix.WASM,
});
loggerInstance.dispatchEvent(
new CustomEvent(loggerInstance.fatalErrorEvent, {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { Logger } from '../logger';
import { type Logger, LogSeverity } from '../logger';

/**
* Log Windows errors.
Expand All @@ -9,7 +9,7 @@ import type { Logger } from '../logger';
const logWindowErrorEvent = (loggerInstance: Logger, event: ErrorEvent) => {
loggerInstance.logMessage({
message: `${event.message} in ${event.filename} on line ${event.lineno}:${event.colno}`,
severity: 'Error',
severity: LogSeverity.Error,
});
};

Expand All @@ -30,7 +30,7 @@ const logPromiseRejection = (
const message = event?.reason.stack ?? event.reason;
loggerInstance.logMessage({
message,
severity: 'Error',
severity: LogSeverity.Error,
});
};

Expand Down
3 changes: 1 addition & 2 deletions packages/php-wasm/logger/src/lib/handlers/log-event.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import type { LogHandler } from '../log-handlers';
import type { Log } from '../logger';
import { logger } from '../logger';
import { type Log, logger } from '../logger';

export const logEventType = 'playground-log';

Expand Down
13 changes: 6 additions & 7 deletions packages/php-wasm/logger/src/lib/handlers/log-to-console.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import type { LogHandler } from '../log-handlers';
import type { Log } from '../logger';
import { prepareLogMessage } from '../logger';
import { type Log, LogSeverity, prepareLogMessage } from '../logger';

/**
* Log message to the console.
Expand All @@ -23,19 +22,19 @@ export const logToConsole: LogHandler = (log: Log, ...args: any[]): void => {
}
/* eslint-disable no-console */
switch (log.severity) {
case 'Debug':
case LogSeverity.Debug:
console.debug(log.message, ...args);
break;
case 'Info':
case LogSeverity.Info:
console.info(log.message, ...args);
break;
case 'Warn':
case LogSeverity.Warn:
console.warn(log.message, ...args);
break;
case 'Error':
case LogSeverity.Error:
console.error(log.message, ...args);
break;
case 'Fatal':
case LogSeverity.Fatal:
console.error(log.message, ...args);
break;
default:
Expand Down
7 changes: 3 additions & 4 deletions packages/php-wasm/logger/src/lib/handlers/log-to-memory.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import type { LogHandler } from '../log-handlers';
import type { Log } from '../logger';
import { formatLogEntry } from '../logger';
import { formatLogEntry, type Log, LogPrefix } from '../logger';

const prepareLogMessage = (logMessage: object): string => {
if (logMessage instanceof Error) {
Expand All @@ -26,8 +25,8 @@ export const logToMemory: LogHandler = (log: Log): void => {
typeof log.message === 'object'
? prepareLogMessage(log.message)
: log.message,
log.severity ?? 'Info',
log.prefix ?? 'JavaScript'
log.severity,
log.prefix ?? LogPrefix.JS
);
addToLogArray(message);
}
Expand Down
92 changes: 72 additions & 20 deletions packages/php-wasm/logger/src/lib/logger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,54 @@ export { errorLogPath } from './collectors/collect-php-logs';

export type Log = {
message: any;
severity?: LogSeverity;
severity: LogSeverity;
prefix?: LogPrefix;
raw?: boolean;
};

/**
* Log verbosity levels
*/
export const LogVerbosity = {
Normal: 'normal',
Quiet: 'quiet',
Debug: 'debug',
} as const;
Comment on lines +23 to +27
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's not distinguish between verbosity and severity at the logger level. One concept is enough. We can decide what each verbosity means in the CLI args parser when we let the user decide. All internal methods could use severities for filtering.


export type LogVerbosity = (typeof LogVerbosity)[keyof typeof LogVerbosity];

/**
* Log severity levels.
*/
export type LogSeverity = 'Debug' | 'Info' | 'Warn' | 'Error' | 'Fatal';
export const LogSeverity = {
Log: { name: 'log', level: 1 },
Info: { name: 'info', level: 1 },
Warn: { name: 'warn', level: 1 },
Error: { name: 'error', level: 1 },
Fatal: { name: 'fatal', level: 1 },
Debug: { name: 'debug', level: 2 },
} as const;
Comment on lines +34 to +41
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's give each severity a unique level, e.g.

export const LogSeverity = {
	Fatal: { name: 'fatal', level: 0 },
	Error: { name: 'error', level: 1 },
	Warn: { name: 'warn', level: 2 },
	Log: { name: 'log', level: 3 },
	Info: { name: 'info', level: 4 },
	Debug: { name: 'debug', level: 5 },
} as const;


export type LogSeverity = (typeof LogSeverity)[keyof typeof LogSeverity];

/**
* Log prefix.
*/
export type LogPrefix = 'WASM Crash' | 'PHP' | 'JavaScript';
export const LogPrefix = {
WASM: 'Wasm Crash',
PHP: 'PHP',
JS: 'JavaScript',
} as const;

export type LogPrefix = (typeof LogPrefix)[keyof typeof LogPrefix];

/**
* A logger for Playground.
*/
export class Logger extends EventTarget {
public readonly fatalErrorEvent = 'playground-fatal-error';
private readonly handlers: LogHandler[];
private handlers: LogHandler[];
private verbosity = 1;

// constructor
constructor(
Expand Down Expand Up @@ -62,14 +89,39 @@ export class Logger extends EventTarget {
/**
* Log message with severity.
*
* @param message any
* @param severity LogSeverity
* @param raw boolean
* @param log Log
* @param args any
*/
public logMessage(log: Log, ...args: any[]): void {
public logMessage(
log: Omit<Log, 'severity'> & { severity?: LogSeverity },
...args: any[]
): void {
const logWithSeverity: Log = {
...log,
severity: log.severity ?? LogSeverity.Log,
};
for (const handler of this.handlers) {
handler(log, ...args);
if (logWithSeverity.severity.level <= this.verbosity) {
handler(logWithSeverity, ...args);
}
}
}

/**
* Filter message based on verbosiy
* @param verbosity LogVerbosity
*/
public filterByVerbosity(verbosity: LogVerbosity): void {
switch (verbosity) {
case LogVerbosity.Quiet:
this.verbosity = 0;
break;
case LogVerbosity.Normal:
this.verbosity = 1;
break;
case LogVerbosity.Debug:
this.verbosity = 2;
break;
}
}

Expand All @@ -83,8 +135,8 @@ export class Logger extends EventTarget {
this.logMessage(
{
message,
severity: undefined,
prefix: 'JavaScript',
severity: LogSeverity.Log,
prefix: LogPrefix.JS,
raw: false,
},
...args
Expand All @@ -101,8 +153,8 @@ export class Logger extends EventTarget {
this.logMessage(
{
message,
severity: 'Debug',
prefix: 'JavaScript',
severity: LogSeverity.Debug,
prefix: LogPrefix.JS,
raw: false,
},
...args
Expand All @@ -119,8 +171,8 @@ export class Logger extends EventTarget {
this.logMessage(
{
message,
severity: 'Info',
prefix: 'JavaScript',
severity: LogSeverity.Info,
prefix: LogPrefix.JS,
raw: false,
},
...args
Expand All @@ -137,8 +189,8 @@ export class Logger extends EventTarget {
this.logMessage(
{
message,
severity: 'Warn',
prefix: 'JavaScript',
severity: LogSeverity.Warn,
prefix: LogPrefix.JS,
raw: false,
},
...args
Expand All @@ -155,8 +207,8 @@ export class Logger extends EventTarget {
this.logMessage(
{
message,
severity: 'Error',
prefix: 'JavaScript',
severity: LogSeverity.Error,
prefix: LogPrefix.JS,
raw: false,
},
...args
Expand Down Expand Up @@ -209,7 +261,7 @@ export const formatLogEntry = (
}).format(date);
const now = formattedDate + ' ' + formattedTime;
message = prepareLogMessage(message);
return `[${now}] ${prefix} ${severity}: ${message}`;
return `[${now}] ${prefix} ${severity.name}: ${message}`;
};

/**
Expand Down
Loading
Loading