src/vs/workbench/contrib/output/browser/output.contribution.ts/OutputContribution/registerOpenLogFileAction
class OutputContribution:	private registerOpenLogFileAction(): void {
		interface IOutputChannelQuickPickItem extends IQuickPickItem {
			channel: IOutputChannelDescriptor;
		}
		this._register(registerAction2(class extends Action2 {
			constructor() {
				super({
					id: 'workbench.action.openLogFile',
					title: { value: nls.localize('openLogFile', "Open Log File..."), original: 'Open Log File...' },
					category: Categories.Developer,
					menu: {
						id: MenuId.CommandPalette,
					},
				});
			}
			async run(accessor: ServicesAccessor): Promise<void> {
				const outputService = accessor.get(IOutputService);
				const quickInputService = accessor.get(IQuickInputService);
				const instantiationService = accessor.get(IInstantiationService);
				const editorService = accessor.get(IEditorService);

				const entries: IOutputChannelQuickPickItem[] = outputService.getChannelDescriptors().filter(c => c.file && c.log)
					.map(channel => (<IOutputChannelQuickPickItem>{ id: channel.id, label: channel.label, channel }));

				const entry = await quickInputService.pick(entries, { placeHolder: nls.localize('selectlogFile', "Select Log file") });
				if (entry) {
					assertIsDefined(entry.channel.file);
					await editorService.openEditor(instantiationService.createInstance(LogViewerInput, (entry.channel as IFileOutputChannelDescriptor)), { pinned: true });
				}
			}
		}));
	}