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