Revert "Renderer file logging through IPC" (#7393)

This reverts commit 48db54ec9e.
This commit is contained in:
Sebastian Malton authored and GitHub committed 2023-03-21 16:13:27 -04:00
1 parent 48db54ec9e
commit 5409324236
24 files changed
+72 -832

No files matched your search

@@ -1,21 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import ipcFileLoggerInjectable from "./ipc-file-logger.injectable";
import { getMessageChannelListenerInjectable } from "../../common/utils/channel/message-channel-listener-injection-token";
import {
closeIpcFileLoggerChannel,
} from "../../common/logger/ipc-file-logger-channel";
const closeIpcFileLoggingListenerInjectable = getMessageChannelListenerInjectable({
id: "close-ipc-file-logging",
channel: closeIpcFileLoggerChannel,
handler: (di) => {
const ipcFileLogger = di.inject(ipcFileLoggerInjectable);
return (fileId) => ipcFileLogger.close(fileId);
},
});
export default closeIpcFileLoggingListenerInjectable;
@@ -1,18 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import type { transports } from "winston";
import { getGlobalOverride } from "@k8slens/test-utils";
import { noop } from "@k8slens/utilities";
import createIpcFileLoggerTransportInjectable from "./create-ipc-file-transport.injectable";
export default getGlobalOverride(
createIpcFileLoggerTransportInjectable,
() => () =>
({
log: noop,
close: noop,
} as typeof transports.File),
);
@@ -1,28 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { transports } from "winston";
import directoryForLogsInjectable from "../../common/app-paths/directory-for-logs.injectable";
const createIpcFileLoggerTransportInjectable = getInjectable({
id: "create-ipc-file-logger-transport",
instantiate: (di) => {
const options = {
dirname: di.inject(directoryForLogsInjectable),
maxsize: 1024 * 1024,
maxFiles: 2,
tailable: true,
};
return (fileId: string) =>
new transports.File({
...options,
filename: `lens-${fileId}.log`,
});
},
causesSideEffects: true,
});
export default createIpcFileLoggerTransportInjectable;
@@ -7,8 +7,8 @@ import { transports } from "winston";
import directoryForLogsInjectable from "../../common/app-paths/directory-for-logs.injectable";
import { loggerTransportInjectionToken } from "../../common/logger/transports";
const fileLoggerTransportInjectable = getInjectable({
id: "file-logger-transport",
const fileLoggerTranportInjectable = getInjectable({
id: "file-logger-tranport",
instantiate: (di) => new transports.File({
handleExceptions: false,
level: "debug",
@@ -26,4 +26,4 @@ const fileLoggerTransportInjectable = getInjectable({
decorable: false,
});
export default fileLoggerTransportInjectable;
export default fileLoggerTranportInjectable;
@@ -1,55 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { getOrInsertWith } from "@k8slens/utilities";
import type { LogEntry, transports } from "winston";
import createIpcFileLoggerTransportInjectable from "./create-ipc-file-transport.injectable";
export interface IpcFileLogger {
log: (fileLog: { fileId: string; entry: LogEntry }) => void;
close: (fileId: string) => void;
closeAll: () => void;
}
const ipcFileLoggerInjectable = getInjectable({
id: "ipc-file-logger",
instantiate: (di): IpcFileLogger => {
const createIpcFileTransport = di.inject(createIpcFileLoggerTransportInjectable);
const fileTransports = new Map<string, transports.FileTransportInstance>();
function log({ fileId, entry }: { fileId: string; entry: LogEntry }) {
const transport = getOrInsertWith(
fileTransports,
fileId,
() => createIpcFileTransport(fileId),
);
transport?.log?.(entry, () => {});
}
function close(fileId: string) {
const transport = fileTransports.get(fileId);
if (transport) {
transport.close?.();
fileTransports.delete(fileId);
}
}
function closeAll() {
for (const fileId of fileTransports.keys()) {
close(fileId);
}
}
return {
log,
close,
closeAll,
};
},
});
export default ipcFileLoggerInjectable;
@@ -1,160 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getDiForUnitTesting } from "../getDiForUnitTesting";
import createIpcFileLoggerTransportInjectable from "./create-ipc-file-transport.injectable";
import type { IpcFileLogger } from "./ipc-file-logger.injectable";
import ipcFileLoggerInjectable from "./ipc-file-logger.injectable";
describe("ipc file logger in main", () => {
let logMock: jest.Mock;
let closeMock: jest.Mock;
let createFileTransportMock: jest.Mock;
let logger: IpcFileLogger;
beforeEach(() => {
logMock = jest.fn();
closeMock = jest.fn();
createFileTransportMock = jest.fn(() => ({
log: logMock,
close: closeMock,
}));
const di = getDiForUnitTesting();
di.override(createIpcFileLoggerTransportInjectable, () => createFileTransportMock);
logger = di.inject(ipcFileLoggerInjectable);
});
it("creates a transport for new log file", () => {
logger.log({
fileId: "some-log-file",
entry: { level: "irrelevant", message: "irrelevant" },
});
expect(createFileTransportMock).toHaveBeenCalledWith("some-log-file");
});
it("uses existing transport for log file", () => {
logger.log({
fileId: "some-log-file",
entry: { level: "irrelevant", message: "irrelevant" },
});
logger.log({
fileId: "some-log-file",
entry: { level: "irrelevant", message: "irrelevant" },
});
logger.log({
fileId: "some-log-file",
entry: { level: "irrelevant", message: "irrelevant" },
});
expect(createFileTransportMock).toHaveBeenCalledTimes(1);
expect(createFileTransportMock).toHaveBeenCalledWith("some-log-file");
});
it("creates separate transport for each log file", () => {
logger.log({
fileId: "some-log-file",
entry: { level: "irrelevant", message: "irrelevant" },
});
logger.log({
fileId: "some-other-log-file",
entry: { level: "irrelevant", message: "irrelevant" },
});
logger.log({
fileId: "some-yet-another-log-file",
entry: { level: "irrelevant", message: "irrelevant" },
});
expect(createFileTransportMock).toHaveBeenCalledTimes(3);
expect(createFileTransportMock).toHaveBeenCalledWith("some-log-file");
expect(createFileTransportMock).toHaveBeenCalledWith("some-other-log-file");
expect(createFileTransportMock).toHaveBeenCalledWith("some-yet-another-log-file");
});
it("logs using file transport", () => {
logger.log({
fileId: "some-log-file",
entry: { level: "irrelevant", message: "some-log-message" },
});
expect(logMock.mock.calls[0][0]).toEqual({
level: "irrelevant",
message: "some-log-message",
});
});
it("logs to correct files", () => {
const someLogMock = jest.fn();
const someOthertLogMock = jest.fn();
createFileTransportMock.mockImplementation((fileId: string) => {
if (fileId === "some-log-file") {
return { log: someLogMock };
}
if (fileId === "some-other-log-file") {
return { log: someOthertLogMock };
}
return null;
});
logger.log({
fileId: "some-log-file",
entry: { level: "irrelevant", message: "some-log-message" },
});
logger.log({
fileId: "some-other-log-file",
entry: { level: "irrelevant", message: "some-other-log-message" },
});
expect(someLogMock).toHaveBeenCalledTimes(1);
expect(someLogMock.mock.calls[0][0]).toEqual({
level: "irrelevant",
message: "some-log-message",
});
expect(someOthertLogMock).toHaveBeenCalledTimes(1);
expect(someOthertLogMock.mock.calls[0][0]).toEqual({
level: "irrelevant",
message: "some-other-log-message",
});
});
it("closes transport (to ensure no file handles are left open)", () => {
logger.log({
fileId: "some-log-file",
entry: { level: "irrelevant", message: "irrelevant" },
});
logger.close("some-log-file");
expect(closeMock).toHaveBeenCalled();
});
it("creates a new transport once needed after closing previous", () => {
logger.log({
fileId: "some-log-file",
entry: { level: "irrelevant", message: "irrelevant" },
});
logger.close("some-log-file");
logger.log({
fileId: "some-log-file",
entry: { level: "irrelevant", message: "irrelevant" },
});
expect(createFileTransportMock).toHaveBeenCalledTimes(2);
expect(logMock).toHaveBeenCalledTimes(2);
});
});
@@ -1,39 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import ipcFileLoggerInjectable from "./ipc-file-logger.injectable";
import { getMessageChannelListenerInjectable } from "../../common/utils/channel/message-channel-listener-injection-token";
import type { IpcFileLogObject } from "../../common/logger/ipc-file-logger-channel";
import { ipcFileLoggerChannel } from "../../common/logger/ipc-file-logger-channel";
import { MESSAGE } from "triple-beam";
/**
* Winston uses symbol property for the actual message.
*
* For that to get through IPC, use the internalMessage property instead
*/
export function deserializeLogFromIpc(ipcFileLogObject: IpcFileLogObject) {
const { internalMessage, ...standardEntry } = ipcFileLogObject.entry;
return {
...ipcFileLogObject,
entry: {
...standardEntry,
[MESSAGE]: internalMessage,
},
};
}
const ipcFileLoggingListenerInjectable = getMessageChannelListenerInjectable({
id: "ipc-file-logging",
channel: ipcFileLoggerChannel,
handler: (di) => {
const logger = di.inject(ipcFileLoggerInjectable);
return (ipcFileLogObject) =>
logger.log(deserializeLogFromIpc(ipcFileLogObject));
},
});
export default ipcFileLoggingListenerInjectable;
@@ -1,31 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { MESSAGE } from "triple-beam";
import { deserializeLogFromIpc } from "./ipc-logging-listener.injectable";
describe("Ipc log deserialization", () => {
it("fills in the unique symbol message property Winston transports use internally", () => {
const logObject = {
fileId: "irrelevant",
entry: {
level: "irrelevant",
message: "some public message",
internalMessage: "some internal message",
someProperty: "irrelevant",
},
};
expect(deserializeLogFromIpc(logObject)).toEqual({
entry: {
level: "irrelevant",
message: "some public message",
[MESSAGE]: "some internal message",
someProperty: "irrelevant",
},
fileId: "irrelevant",
});
});
});
@@ -1,27 +0,0 @@
/**
* Copyright (c) OpenLens Authors. All rights reserved.
* Licensed under MIT License. See LICENSE in root directory for more information.
*/
import { getInjectable } from "@ogre-tools/injectable";
import { beforeQuitOfFrontEndInjectionToken } from "../start-main-application/runnable-tokens/phases";
import ipcFileLoggerInjectable from "./ipc-file-logger.injectable";
const stopIpcLoggingInjectable = getInjectable({
id: "stop-ipc-logging",
instantiate: (di) => {
const ipcFileLogger = di.inject(ipcFileLoggerInjectable);
return {
run: () => {
ipcFileLogger.closeAll();
return undefined;
},
};
},
injectionToken: beforeQuitOfFrontEndInjectionToken,
});
export default stopIpcLoggingInjectable;