我想知道是否有办法在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;
};
答案 0 :(得分:1)
获得大部分内容的最简单方法是使用%M or %l pattern layout parameters Apache log4j library。正如文档所述,生成方法名称信息确实很慢,所以希望这只用于调试。这不会涵盖您想要的缩进,但可能有一种方法可以使用转换模式来完成它。
我能想到的唯一另一种方法是使用AspectJ创建一个切入点来触发每个方法的日志记录方面,但要做到这一点,你需要使用cglib,我是不确定它会比使用现有的log4j支持快得多。