【问题标题】:How to write to log from vscode extension?如何从 vscode 扩展写入日志?
【发布时间】:2016-03-09 04:59:51
【问题描述】:

我正在尝试为 VSCode 开发带有语言服务器的扩展。我试图弄清楚如何从扩展的语言服务器部分编写文本以记录日志。 console.log 什么也没产生

【问题讨论】:

    标签: visual-studio-code vscode-extensions language-server-protocol


    【解决方案1】:

    在服务器端尝试使用 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 对我来说效果很好。

    【讨论】:

    【解决方案2】:

    您必须在客户端扩展代码中的客户端选项上设置outputChannelName 属性:

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

    完成后,您可以使用console.log(),它将显示在 VSCode 扩展输出面板中。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        作为更新,您可以使用vscode.window.createOutputChannel 创建输出容器,然后使用appendLine 方法写入它。

            //Create output channel
            let orange = vscode.window.createOutputChannel("Orange");
        
            //Write to output.
            orange.appendLine("I am a banana.");
        

        【讨论】:

        • 这行得通,但我无法让它在附加行时切换到Orange 频道。其他扩展似乎有办法自动切换频道。
        • 这个回复有点晚了,不过你可以打电话orange.show();让输出通道显示出来。
        • @Kugelblitz 哇,谢谢,我花了好几个小时寻找调试窗口,哈哈
        • 那个躺着的香蕉/橙子! :)
        【解决方案5】:

        只需打开 vscode 并转到菜单“帮助”->“切换开发者工具”,控制台就会显示在右侧窗口中。

        【讨论】:

          【解决方案6】:

          谢谢大家!

          
          
          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);
          

          【讨论】:

          • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
          猜你喜欢
          • 1970-01-01
          • 2017-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多