Hook with FB logger

Summary:
This change replaces the existing logging infra with the one defined and exposed in flipper-server-core.

Functionality remains the same with the addition of having support for Scribe.

Reviewed By: aigoncharov

Differential Revision: D48515246

fbshipit-source-id: 7970f6ad069821ee4f15136adc8da40d0b1fb0c7
This commit is contained in:
Lorenzo Blasa
2023-08-24 06:18:39 -07:00
committed by Facebook GitHub Bot
parent 87bf73f1d5
commit 6405a7bfdd
3 changed files with 35 additions and 90 deletions

View File

@@ -20,6 +20,7 @@ export * from './server/startFlipperServer';
export * from './server/startServer'; export * from './server/startServer';
export * from './server/utilities'; export * from './server/utilities';
export {isFBBuild} from './fb-stubs/constants'; export {isFBBuild} from './fb-stubs/constants';
export {initializeLogger} from './fb-stubs/Logger';
export {WEBSOCKET_MAX_MESSAGE_SIZE} from './app-connectivity/ServerWebSocket'; export {WEBSOCKET_MAX_MESSAGE_SIZE} from './app-connectivity/ServerWebSocket';

View File

@@ -144,10 +144,17 @@ async function shutdown() {
} }
async function start() { async function start() {
console.info('[flipper-server][bootstrap] Booting up');
const t0 = performance.now(); const t0 = performance.now();
const enhanceLogger = await initializeLogger(staticPath); const isProduction =
process.env.NODE_ENV !== 'development' && process.env.NODE_ENV !== 'test';
const environmentInfo = await getEnvironmentInfo(
rootPath,
isProduction,
true,
);
await initializeLogger(environmentInfo, staticPath);
const t1 = performance.now(); const t1 = performance.now();
const loggerInitializedMS = t1 - t0; const loggerInitializedMS = t1 - t0;
@@ -180,15 +187,6 @@ async function start() {
`[flipper-server][bootstrap] Keytar loaded (${keytarLoadedMS} ms)`, `[flipper-server][bootstrap] Keytar loaded (${keytarLoadedMS} ms)`,
); );
const isProduction =
process.env.NODE_ENV !== 'development' && process.env.NODE_ENV !== 'test';
const environmentInfo = await getEnvironmentInfo(
rootPath,
isProduction,
true,
);
if (await checkPortInUse(argv.port)) { if (await checkPortInUse(argv.port)) {
console.warn(`[flipper-server] Port ${argv.port} is already in use`); console.warn(`[flipper-server] Port ${argv.port} is already in use`);
if (!argv.replace) { if (!argv.replace) {
@@ -237,10 +235,6 @@ async function start() {
await flipperServer.close(); await flipperServer.close();
}); });
enhanceLogger((logEntry) => {
flipperServer.emit('server-log', logEntry);
});
const companionEnv = await initCompanionEnv(flipperServer); const companionEnv = await initCompanionEnv(flipperServer);
const t6 = performance.now(); const t6 = performance.now();

View File

@@ -9,11 +9,11 @@
import path from 'path'; import path from 'path';
import { import {
addLogTailer,
EnvironmentInfo,
LoggerExtractError, LoggerExtractError,
LoggerFormat, LoggerFormat,
LoggerInfo,
LoggerTypes, LoggerTypes,
Logger,
setLoggerInstance, setLoggerInstance,
} from 'flipper-common'; } from 'flipper-common';
// @ts-expect-error // @ts-expect-error
@@ -21,81 +21,21 @@ import fsRotator from 'file-stream-rotator';
import {ensureFile} from 'fs-extra'; import {ensureFile} from 'fs-extra';
import {access} from 'fs/promises'; import {access} from 'fs/promises';
import {constants} from 'fs'; import {constants} from 'fs';
import {initializeLogger as initLogger} from 'flipper-server-core';
export const loggerOutputFile = 'flipper-server-log.out'; export const loggerOutputFile = 'flipper-server-log.out';
const logTypes: LoggerTypes[] = ['debug', 'info', 'warn', 'error']; export async function initializeLogger(
environmentInfo: EnvironmentInfo,
function createLogger(): Logger { staticDir: string,
return { ) {
track(..._args: [any, any, any?, any?]) {
// TODO: only if verbose console.debug(...args);
// console.warn('(skipper track)', args);
},
trackTimeSince(..._args: [any, any, any?]) {
// TODO: only if verbose console.debug(...args);
// console.warn('(skipped trackTimeSince)', args);
},
debug(...args: any[]) {
console.debug(...args);
},
error(...args: any[]) {
console.error(...args);
},
warn(...args: any[]) {
console.warn(...args);
},
info(...args: any[]) {
console.info(...args);
},
};
}
type FlipperLogProxy = (entry: LoggerInfo) => void;
const consoleProxy = (proxy: FlipperLogProxy) => {
function log(level: LoggerTypes, ...data: Array<any>): void {
const logInfo = LoggerFormat(level, ...data);
proxy(logInfo);
if (level === 'error') {
const {
message,
error: {stack, interaction, name},
} = LoggerExtractError(data);
const logInfo = LoggerFormat(level, {
name,
stack,
interaction,
message,
});
proxy(logInfo);
}
}
for (const method of logTypes) {
const originalConsole: {[key: string]: any} = console;
const originalMethod = originalConsole[method];
const overrideMethod = (...args: Array<unknown>) => {
const result = originalMethod(...args);
log(method, ...args);
return result;
};
originalConsole[method] = overrideMethod;
}
};
export async function initializeLogger(staticDir: string) {
// Suppress stdout debug messages, but keep writing them to the file. // Suppress stdout debug messages, but keep writing them to the file.
console.debug = function () {}; console.debug = function () {};
const logger = createLogger(); const logger = initLogger(environmentInfo);
setLoggerInstance(logger); setLoggerInstance(logger);
let onConsoleEntry: ((entry: LoggerInfo) => void) | undefined;
const logFilename = path.join(staticDir, loggerOutputFile); const logFilename = path.join(staticDir, loggerOutputFile);
let logStream: NodeJS.WriteStream | undefined = undefined; let logStream: NodeJS.WriteStream | undefined = undefined;
try { try {
await ensureFile(logFilename); await ensureFile(logFilename);
@@ -112,12 +52,22 @@ export async function initializeLogger(staticDir: string) {
console.warn('initializeLogger -> cannot write logs to FS', e); console.warn('initializeLogger -> cannot write logs to FS', e);
} }
consoleProxy((entry: LoggerInfo) => { addLogTailer((level: LoggerTypes, ...data: Array<any>) => {
logStream?.write(`${JSON.stringify(entry)}\n`); const logInfo = LoggerFormat(level, ...data);
onConsoleEntry?.(entry); logStream?.write(`${JSON.stringify(logInfo)}\n`);
});
return (newOnConsoleEntry: (entry: LoggerInfo) => void) => { if (level === 'error') {
onConsoleEntry = newOnConsoleEntry; const {
}; message,
error: {stack, interaction, name},
} = LoggerExtractError(data);
const logInfo = LoggerFormat(level, {
name,
stack,
interaction,
message,
});
logStream?.write(`${JSON.stringify(logInfo)}\n`);
}
});
} }