3

を使用して、typescript プログラム全体でロギングをセットアップしようとしていますlog4javascript

ただし、(手動で入力するのではなく) リフレクションを使用して関数名を取得する方法がわかりません。

理想的には、私がしていることをエミュレートしたいC#:

public class Foo 
{
    private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(typeof(Foo));

    public Foo()
    {
    }

    public FooMethod()
    {
        try {
            logger.Logger.Log(this.GetType(), log4net.Core.Level.Trace, "Entering" + MethodBase.GetCurrentMethod().Name, null);
            // code
        }
        catch (e) {
            logger.Logger.Log(this.GetType(), log4net.Core.Level.Debug, ex.Message, null);
        }
        finally {
            logger.Logger.Log(this.GetType(), log4net.Core.Level.Trace, "Exiting" + MethodBase.GetCurrentMethod().Name, null);
        }
    }
}

でこれを行うにはどうすればよいTypescriptですか? 私ができることは、クラス名を取得することだけです。

class Foo {
    private static logger: log4javascript.Logger = log4javascript.getLogger(getName(Foo));

    constructor() {
    }

    FooFunction() {
        try {
            SymDataSource.logger.trace("Entering: " + getName(Foo.prototype.FooFunction));
            // code
        } catch (e) {
            SymDataSource.logger.debug("Exception: " + getName(Foo.prototype.FooFunction), e);
        } finally {
            SymDataSource.logger.trace("Exiting: " + getName(Foo.prototype.FooFunction));
        }
    }
}

function getName(obj: any): string {
   if (obj.name) {
       return obj.name;
   }
   var funcNameRegex = /function (.{1,})\(/;
   var results = (funcNameRegex).exec((<any> obj).constructor.toString());
   return (results && results.length > 1) ? results[1] : "";
}

クラス名は正しく返されますが、関数は「関数」として返されます。

4

2 に答える 2

1

私は2つの機能を作ることになりました。スタック内の現在のトップ メソッドの場合は 1、型名の場合は other。

  export function getName(): string {
     var result: string = "";
     var error: any = new Error("getStack");
     var stack: string[] = error.stack
        .replace(/^[^\(]+?[\n$]/gm, '') // Remove first useless line
        .replace(/^\s+at\s+/gm, '') // Remove 'at'
        .replace(/^Object.<anonymous>\s*\(/gm, '{anonymous}()@') // Replace Object.<anon> with {anon}
        .replace(/\s\(.*:[0-9]+:[0-9]+\)/gm, '') // Remove filename, col and row
        .split('\n');
     return stack[1]; // Previous method
  }

  export function getType(obj: any): string {
     if (obj.name) {
        return obj.name;
     }
     var results = /function (.{1,})\(/.exec(obj.constructor.toString());
     return (results && results.length > 1) ? results[1] : "";
  }
于 2013-10-01T13:45:34.423 に答える