-
-
Save liamcain/3f21f1ee820cb30f18050d2f3ad85f3f to your computer and use it in GitHub Desktop.
declare module "obsidian" { | |
interface App { | |
isMobile: boolean; | |
} | |
} | |
// Call this method inside your plugin's `onLoad` function | |
function monkeyPatchConsole(plugin: Plugin) { | |
if (!plugin.app.isMobile) { | |
return; | |
} | |
const logFile = `${plugin.manifest.dir}/logs.txt`; | |
const logs: string[] = []; | |
const logMessages = (prefix: string) => (...messages: unknown[]) => { | |
logs.push(`\n[${prefix}]`); | |
for (const message of messages) { | |
logs.push(String(message)); | |
} | |
plugin.app.vault.adapter.write(logFile, logs.join(" ")); | |
}; | |
console.debug = logMessages("debug"); | |
console.error = logMessages("error"); | |
console.info = logMessages("info"); | |
console.log = logMessages("log"); | |
console.warn = logMessages("warn"); | |
} |
Here's my slightly modified version. If you import Platform
from obsidian
, you get the isMobile
type declaration:
// Call this method inside your plugin's
// `onload` function like so:
// monkeyPatchConsole(this);
const monkeyPatchConsole = (plugin: Plugin) => {
if (!Platform.isMobile) {
return;
}
const logFile = `${plugin.manifest.dir}/logs.txt`;
const logs: string[] = [];
const logMessages = (prefix: string) => (...messages: unknown[]) => {
logs.push(`\n[${prefix}]`);
for (const message of messages) {
logs.push(String(message));
}
plugin.app.vault.adapter.write(logFile, logs.join(" "));
};
console.debug = logMessages("debug");
console.error = logMessages("error");
console.info = logMessages("info");
console.log = logMessages("log");
console.warn = logMessages("warn");
};
Hiya @liamcain - I was wondering if you're still having luck if and when you ever need this script. I tried adding it to the obsidian-checklist-plugin to try and find why it fails to enable on iOS. If I knock out the platform restriction line and run it on desktop, I generate a log file just fine. Using it with the mobile app (Obsidian 1.1), I don't get a log file.
I've tried using an iCloud vault as well as an Obsidian Sync vault, having the log file saved to the plugin directory as well as a markdown file in the vault. Was hoping I would see a file appear in the Sync console that maybe Sync rejects (the way Sync seems to delete irrelevant files in plugin directories) but there was no trace of a log file being created.
@AndrewNatoli Since this script doesn't run until after the plugin is loaded, it won't help you track down initialization issues. For those, I recommend taking a look at your package dependencies and make sure that all the packages can run in a browser environment (as opposed to a node environment).
If you're still having trouble, another option would be loading this script from a separate plugin. You can do this either by creating an entirely barebones plugin that just calls this script, or making this a startup script with any of the existing plugins that allow for running arbitrary javascript (Templater, Dataview, CustomJS all come to mind).
That way, you can have this script run before trying to enable the plugin you're trying to debug.
@liamcain That suggestion was a huge help, thanks!
Thank you for this! I needed to debug a loading issue on mobile, so I did package this as a plugin:
https://github.com/velebit/obsidian-save-console-log
The plugin eliminates the check for isMobile, since you can just not enable the plugin if you don't want hot patching.
This is beautiful!