Java,是否可能 - 自动方法范围跟踪,就像C ++中的宏一样

时间:2013-12-26 21:46:53

标签: java c++

我想知道是否有办法在java中获得自动范围跟踪。

理想情况下,我希望获得类似于以下C ++代码的行为(自动获取函数,缩进级别,在发布模式下没有操作等)。

void bar()
{
    _SCOPE_TRACE(Level_debug);
    _LOG("stuff");
}

void foo()
{
    _SCOPE_TRACE(Level_debug);
    bar();
}

XXX: foo(): entering
XXX:     bar(): entering
XXX:         stuff
XXX:     bar(): leaving, took 400 cycles
XXX: foo(): leaving, took 3000 cycles

#ifdef _DEBUG
#define _SCOPE_TRACE(level) scopelog::ScopeLog CONCAT_MACRO(scope,__LINE__)(level, __PRETTY_FUNCTION__)
#else
#define _SCOPE_TRACE(level) do {} while(0)
#endif

struct ScopeLog {
    ScopeLog(int32_t level, const std::string& scope) : m_level(level), m_indent(false), m_scope(scope.c_str()) { init(); }
    ScopeLog(int32_t level, const char* scope) : m_level(level), m_indent(false), m_scope(scope) { init(); }
    void init()
    {
        if(level < m_level)
        {
            _LOG(m_level, m_scope << ": enter");
            g_indent++;
            m_indent = true;
            m_tickStart = rdtsc_r();
        }
    }
    ~ScopeLog()
    {
        if (g_indent) g_indent--;
        if(level < m_level)
        {
            uint64_t tsc = rdtsc_r();
            _LOG(m_level, m_scope << ": leave, took " << tsc - m_tickStart << " cycles");
        }
    }
    int32_t     m_level;
    bool        m_indent;
    const char* m_scope;
    uint64_t    m_tickStart;
};

1 个答案:

答案 0 :(得分:1)

获得大部分内容的最简单方法是使用%M or %l pattern layout parameters Apache log4j library。正如文档所述,生成方法名称信息确实很慢,所以希望这只用于调试。这不会涵盖您想要的缩进,但可能有一种方法可以使用转换模式来完成它。

我能想到的唯一另一种方法是使用AspectJ创建一个切入点来触发每个方法的日志记录方面,但要做到这一点,你需要使用cglib,我是不确定它会比使用现有的log4j支持快得多。