上下文日志

发布者    |      

最近,我们与一位拥有大型项目的客户合作,他们担心Hibernate生成的SQL的可追溯性。他们的问题可能很常见:假设我在Hibernate日志中看到一些错误(例如,一些N+1查询问题),我怎么知道是哪个业务类产生了这个问题?我唯一在Hibernate日志中看到的是org.hibernate.SQL,行号224作为日志消息的来源!

我开始解释Hibernate3如何将注释嵌入到生成的SQL中,这样你就可以至少追踪到特定的HQL查询。但史蒂夫想起了log4j提供了/nested diagnostic context/。我见过很多项目使用log4j,但从未在任何一个地方见过这个功能的使用。我认为这可能是比在所有地方添加日志条目和退出日志更好的选择,因为我们甚至可以在启用/禁用日志条目/退出日志类别的情况下看到这个上下文。这是跟踪Hibernate日志中SQL来源的好方法。你只需要在DAO中调用push()和pop()方法即可。

public List getCustomersByName(String pattern) {
    NDC.push("CustomerDAO.getCustomersByName()");
    try {
        return getSession()
            .createQuery("from Customer c where c.name like :pattern")
            .setString("pattern", pattern)
            .list();
    }
    finally {
        NDC.pop();
    }
}

如果我把我的模式设置正确

log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m (%x)%n

我会得到这样的日志消息

20:59:38,249 DEBUG [=>SQL:244] - select .... like ? (CustomerDAO.getCustomersByName())

只是想提一下,以防有人需要。


返回顶部