如何从VSCode扩展程序中写入日志?

42

我正在尝试为VSCode开发一个带有语言服务器的扩展。 我正试图弄清楚如何从扩展的语言服务器部分编写文本到日志文件。console.log没有输出任何内容。

6个回答

51

更新一下,您可以使用vscode.window.createOutputChannel来创建输出容器,然后使用appendLine方法向其中写入内容。

    //Create output channel
    let orange = vscode.window.createOutputChannel("Orange");

    //Write to output.
    orange.appendLine("I am a banana.");

创建输出通道的结果。


这个可以工作,但是我无法在添加行时将其切换到“橙色”频道。其他扩展似乎有一种自动切换频道的方法。 - Luke Pighetti
12
回复有点晚了,但您可以调用orange.show();来使输出通道显示出来。 - Kugelblitz
@Kugelblitz 哇,谢谢,我花了几个小时找调试窗口呢。 - Gianfranco Fertino
2
那个说谎的香蕉/橘子! :) - Ani

15

只需打开vscode并转到菜单“Help” ->“Toggle Developer Tools”,控制台就会显示在右窗口上。


上面的输出通道不起作用,但这个可以。 - dudeNumber4

8

在服务器端尝试使用connection.console.log。

// Create a connection for the server. The connection uses 
// stdin / stdout for message passing
let connection: IConnection = createConnection(process.stdin, process.stdout);
connection.console.log(`Console test.`);

这条消息会在客户端的调试控制台上显示。

对于客户端,我喜欢使用简单的console.log。


5
IConnection 是 vscode-languageserver-node 模块的一部分。 - Tomasz Dolny

7

您需要在客户端扩展代码中的客户端选项上设置一个outputChannelName属性:

let clientOptions: LanguageClientOptions = {
  outputChannelName: 'XYZ Language Server',
};

完成上述操作后,您可以使用console.log(),并将其显示在VSCode扩展输出面板中。


3
这有点不清楚:我应该把它放在哪里?为什么要使用它而不是其他答案中的createOutputChannel指令等等。 - ELLIOTTCABLE

1
语言服务器协议支持日志记录,使用通知window/logMessage从服务器发送日志消息,VS Code将在输出面板中显示服务器的日志,在与启动服务器的语言客户端对应的通道中。

1

感谢大家!



export let config: any = {};
export function getConfig() {

    //debug
    config.debug = workspace.getConfiguration().get('VBI.debug');
    config.debugToChannel = workspace.getConfiguration().get('VBI.debugToChannel'); //Instead into dev-tools-console

    return config;
}




/**
 * @param cat Type String --> define Cathegory [info,warn,error]
 * @param o   Rest Parameter, Type Any --> Data to Log
 */
export let info = vscode.window.createOutputChannel("VBI-Info");
export function log(cat: string, ...o: any) {

    function mapObject(obj: any) {

        switch (typeof obj) {
            case 'undefined':
                return 'undefined';

            case 'string':
                return obj;

            case 'number':
                return obj.toString;

            case 'object':
                let ret: string = '';
                for (const [key, value] of Object.entries(obj)) {
                    ret += (`${key}: ${value}\n`);
                }
                return ret;

            default:
                return obj; //function,symbol,boolean

        }

    }

    if (config.debug) {
        if (config.debugToChannel) {

            
            
            switch (cat.toLowerCase()) {
                case 'info':
                    
                    info.appendLine('INFO:');
                    o.map((args: any) => {
                        info.appendLine('' + mapObject(args));
                    });
                    info.show();
                    return;
                    
                case 'warn':
                    info.appendLine('WARN:');
                    o.map((args: any) => {
                        info.appendLine('' + mapObject(args));
                    });
                    info.show();
                    return;

                case 'error':
                    let err:string=''; 
                    info.appendLine('ERROR: ');
                    //err += mapObject(cat) + ": \r\n";
                    o.map((args: any) => {
                        err += mapObject(args);
                    });
                    info.appendLine(err);
                    vscode.window.showErrorMessage(err);//.replace(/(\r\n|\n|\r)/gm,"")
                    info.show();
                    return;
                    
                default:
                    
                    info.appendLine('INFO-Other:');
                    info.appendLine(mapObject(cat));
                    o.map((args: any) => {
                        info.appendLine('' + mapObject(args));
                    });
                    info.show();
                    return;
            }

        }
        else {
            switch (cat.toLowerCase()) {
                case 'info':
                    console.log('INFO:', o);
                    return;
                case 'warn':
                    console.log('WARNING:', o);
                    return;
                case 'error':
                    console.log('ERROR:', o);
                    return;
                default:
                    console.log('log:',cat, o);
                    return;
            }
        }
    }

}

测试:

import * as func from './functions';
import { config } from './functions';
func.getConfig();
let text = `debugToChannel:${config.debugToChannel}\n`;

            func.log('info','vbi-format',text);
            func.log('warn','vbi-format',text);
            func.log('error','vbi-format',text);

3
您的答案可以通过提供更多的支持性信息来改进。请 [编辑] 添加进一步的细节,例如引用或文档,以便他人可以确认您的答案是否正确。您可以在 帮助中心 中找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接