Skip to content

Commit bfcc55c

Browse files
[DECO-317] Save logs to logPath provided by VSCode (#225)
VS Code provides a `logPath` for storing logs. We should store our full `logs.json` file over there as well. https://user-images.githubusercontent.com/88345179/201952782-d82a297c-fb48-4277-876a-3def7014ffde.mov
1 parent d8d274a commit bfcc55c

File tree

6 files changed

+99
-77
lines changed

6 files changed

+99
-77
lines changed

packages/databricks-vscode/package.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
"onCommand:databricks.run.runEditorContentsAsWorkflow",
5656
"onCommand:databricks.run.runEditorContents",
5757
"onCommand:databricks.quickstart.open",
58+
"onCommand:databricks.logs.openFolder",
5859
"onView:configurationView",
5960
"onView:clusterView",
6061
"onDebugResolve:databricks",
@@ -163,6 +164,11 @@
163164
"title": "Show Quickstart",
164165
"category": "Databricks"
165166
},
167+
{
168+
"command": "databricks.logs.openFolder",
169+
"title": "Open full logs",
170+
"category": "Databricks"
171+
},
166172
{
167173
"command": "databricks.cluster.start",
168174
"title": "Start Cluster",

packages/databricks-vscode/src/extension.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,10 @@ import {ProjectConfigFileWatcher} from "./configuration/ProjectConfigFileWatcher
1515
import {QuickstartCommands} from "./quickstart/QuickstartCommands";
1616
import {showQuickStartOnFirstUse} from "./quickstart/QuickStart";
1717
import {PublicApi} from "@databricks/databricks-vscode-types";
18-
import {initLoggers} from "./logger";
18+
import {LoggerManager} from "./logger";
1919
import {UtilsCommands} from "./utils/UtilsCommands";
2020
import {NamedLogger} from "@databricks/databricks-sdk/dist/logging";
21+
import {workspaceConfigs} from "./WorkspaceConfigs";
2122

2223
export function activate(context: ExtensionContext): PublicApi | undefined {
2324
if (
@@ -34,7 +35,19 @@ export function activate(context: ExtensionContext): PublicApi | undefined {
3435
*/
3536
return undefined;
3637
}
37-
initLoggers(workspace.workspaceFolders[0].uri.path);
38+
39+
const loggerManager = new LoggerManager(context);
40+
if (!workspaceConfigs.loggingEnabled) {
41+
loggerManager.initLoggers();
42+
}
43+
44+
context.subscriptions.push(
45+
commands.registerCommand(
46+
"databricks.logs.openFolder",
47+
loggerManager.openLogFolder,
48+
loggerManager
49+
)
50+
);
3851

3952
const cli = new CliWrapper(context);
4053
// Configuration group
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import {
2+
NamedLogger,
3+
ExposedLoggers,
4+
} from "@databricks/databricks-sdk/dist/logging";
5+
import {env, ExtensionContext, window} from "vscode";
6+
import {loggers, format, transports} from "winston";
7+
import {getOutputConsoleTransport} from "./outputConsoleTransport";
8+
import {unlink, access} from "fs/promises";
9+
10+
export class LoggerManager {
11+
constructor(readonly context: ExtensionContext) {}
12+
13+
private getFileTransport(filename: string) {
14+
return new transports.File({
15+
format: format.combine(format.timestamp(), format.json()),
16+
filename: filename,
17+
});
18+
}
19+
20+
async initLoggers() {
21+
const outputChannel = window.createOutputChannel("Databricks Logs");
22+
const logFile = `${this.context.logUri.path}/logs.json`;
23+
try {
24+
await access(logFile);
25+
await unlink(logFile);
26+
} catch (e) {}
27+
28+
outputChannel.clear();
29+
30+
NamedLogger.getOrCreate(
31+
ExposedLoggers.SDK,
32+
{
33+
factory: (name) => {
34+
return loggers.add(name, {
35+
level: "debug",
36+
transports: [
37+
getOutputConsoleTransport(outputChannel),
38+
this.getFileTransport(logFile),
39+
],
40+
});
41+
},
42+
},
43+
true
44+
);
45+
46+
/**
47+
This logger collects all the logs in the extension.
48+
49+
TODO Make this logger log to a seperate (or common?) output console in vscode
50+
*/
51+
NamedLogger.getOrCreate(
52+
"Extension",
53+
{
54+
factory: (name) => {
55+
return loggers.add(name, {
56+
level: "error",
57+
transports: [
58+
getOutputConsoleTransport(outputChannel),
59+
this.getFileTransport(logFile),
60+
],
61+
});
62+
},
63+
},
64+
true
65+
);
66+
}
67+
68+
openLogFolder() {
69+
env.openExternal(this.context.logUri);
70+
}
71+
}
72+
73+
export enum Loggers {
74+
// eslint-disable-next-line @typescript-eslint/naming-convention
75+
Extension = "Extension",
76+
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
export * from "./loggers";
1+
export * from "./LoggerManager";
22
export * as loggingUtils from "./utils";

packages/databricks-vscode/src/logger/loggers.ts

Lines changed: 0 additions & 73 deletions
This file was deleted.

packages/databricks-vscode/src/logger/utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {NamedLogger} from "@databricks/databricks-sdk/dist/logging";
2-
import {Loggers} from "./loggers";
2+
import {Loggers} from "./LoggerManager";
33

44
export interface TryAndLogErrorOpts {
55
shouldThrow: boolean;

0 commit comments

Comments
 (0)