Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 有没有办法在typescipt程序中获取类的详细信息,以便我可以将这些详细信息传递给记录器(winston)?_Javascript_Typescript_Winston - Fatal编程技术网

Javascript 有没有办法在typescipt程序中获取类的详细信息,以便我可以将这些详细信息传递给记录器(winston)?

Javascript 有没有办法在typescipt程序中获取类的详细信息,以便我可以将这些详细信息传递给记录器(winston)?,javascript,typescript,winston,Javascript,Typescript,Winston,我在winston上编写了一个包装器。为了测试这一点,我还编写了一个“问候类”,其中我调用了logger.info()。我希望我的日志也显示类名。 为此,当我调用logger.info()时,我还必须传递类的名称,以便我的包装器知道调用logger的是哪个类。但问题是,我不希望程序员指定该类。我希望创建一个抽象级别。我的包装器应该是用户友好的。 有办法做到这一点吗? 如果上面提到的问题无法解决,有没有办法获得类及其方法的所有细节 抱歉,如果我没有使用正确的术语,我是javascript和node

我在winston上编写了一个包装器。为了测试这一点,我还编写了一个“问候类”,其中我调用了logger.info()。我希望我的日志也显示类名。 为此,当我调用logger.info()时,我还必须传递类的名称,以便我的包装器知道调用logger的是哪个类。但问题是,我不希望程序员指定该类。我希望创建一个抽象级别。我的包装器应该是用户友好的。 有办法做到这一点吗? 如果上面提到的问题无法解决,有没有办法获得类及其方法的所有细节 抱歉,如果我没有使用正确的术语,我是javascript和node.js新手

包装器:

import "reflect-metadata";
import { injectable } from "inversify";
import { createLogger, format, transports, Logger as Iwinston } from "winston";

const { combine, timestamp, metadata, json, errors, label, printf } = format;

@injectable()
export default class Logger {
  public logger: Iwinston;

  private selfInfo: string;

  constructor() {
    this.selfInfo = "winston version >= 3.x";
    this.logger = createLogger(this.readOptions());
    this.addTransportConsole(this.getTransportConsoleOptions());
  }

  public info(message: string, data?: any): void {
    console.log(data);
    this.logger.info(message,data);
  }

  public error(message: string, data?: any): void {
    this.logger.error(message, data);
  }

  public getCoreVersion(): string {
    return this.selfInfo;
  }

  private readOptions(): Object {
    return {
      format: combine(
        label({ label: process.env.APP_NAME || "Unknown App" }),
        errors({ stack: true }),
        timestamp(),
        json(),
      ),
      transports:[
        new transports.File({filename:'error.log',level:'info'})
      ]
    };
  }

  private getTransportConsoleOptions(): transports.ConsoleTransportOptions {
    return {
      debugStdout: false
    };
  }

  private addTransportConsole(
    options?: transports.ConsoleTransportOptions
  ): void {
    this.logger.add(new transports.Console(options));
  }
}
我的测试:

import Logger from '../lib/component/logger/appLogger/winstonLogger'
let logger:Logger
logger = new Logger()

test('Winston Logger Test',() => {
class Greeter {
  greeting: string;
  constructor(message: string) {
      this.greeting = message;
      logger.info('hello',this)
  }
  greet() {
    console.log(globalThis.Document)
      logger.info('in greet')
      return "Hello, " + this.greeting;
  }
}
let greeter = new Greeter("world");
greeter.greet()
})

//{"level":"info","message":"hello","metadata":{},"label":"Unknown App","timestamp":"2019-11-22T09:30:07.256Z"}

因此,我在这里要做的是,在创建记录器实例时,让它们将类作为参数传递:

const logger = new Logger<Greeter>(Greeter)

test('Winston Logger Test',() => {
class Greeter {
....
这意味着您可以让他们执行
logger.info('hello')
,您可以在logger实例
loggerInstanceName
中为类名添加上下文,将其添加到
logger
中的
info
方法中传递的消息中,而无需他们执行此操作。。很好,嘿

import "reflect-metadata";
import { injectable } from "inversify";
import { createLogger, format, transports, Logger as Iwinston } from "winston";

const { combine, timestamp, metadata, json, errors, label, printf } = format;

@injectable()
export default class Logger<TInstance> {
  public logger: Iwinston;

  private selfInfo: string;

  private loggerInstanceName: string;

  constructor(instance: TInstance) {
    this.selfInfo = "winston version >= 3.x";
    this.logger = createLogger(this.readOptions());
    this.addTransportConsole(this.getTransportConsoleOptions());
    this.loggerInstanceName = this.nameByInstance(instance);

    console.log(this.loggerInstanceName) // Greeter :)
  }

  public info(message: string, data?: any): void {
    console.log(data);
    this.logger.info(message,data);
  }

  public error(message: string, data?: any): void {
    this.logger.error(message, data);
  }

  public getCoreVersion(): string {
    return this.selfInfo;
  }

  private readOptions(): Object {
    return {
      format: combine(
        label({ label: process.env.APP_NAME || "Unknown App" }),
        errors({ stack: true }),
        timestamp(),
        json(),
      ),
      transports:[
        new transports.File({filename:'error.log',level:'info'})
      ]
    };
  }

  private getTransportConsoleOptions(): transports.ConsoleTransportOptions {
    return {
      debugStdout: false
    };
  }

  private addTransportConsole(
    options?: transports.ConsoleTransportOptions
  ): void {
    this.logger.add(new transports.Console(options));
  }

  private nameByInstance(type: TInstance): string {
    return type.prototype["constructor"]["name"];
  }
}