记录器和java.lang.SecurityManager

时间:2012-12-27 11:39:33

标签: java logging code-access-security

据我所知,java.lang.SecurityManager用于根据特定场景检查和约束类访问或文件访问。

我需要识别Log4J Helper类的调用者,它需要根据调用Helper类的Class返回Logger实例。

有两种方法可以做到这一点。

使用主题

public static Logger getLogger() {
    final Throwable thread = new Throwable();
    final StackTraceElement callerMethod = thread .getStackTrace()[1];
    final Logger logger = Logger.getLogger(callerMethod .getClassName());
    return logger;
}

这是一个性能瓶颈,因为它涉及获取每次调用getLogger的当前堆栈跟踪

第二种方法

记录助手以扩展java.lang.SecurityManager,在这种情况下我可以使用

getClassContext()[2].getName();

获取用于实例化Logger的绝对类名。

考虑到它的使用,扩展SecurityManager的LoggingHelper似乎不是一个好的设计原则。

我是否有任何理由可以将SecurityManager扩展到日志实用程序,还是有更好的方法?

注意:应用程序将在app server instance中运行。

1 个答案:

答案 0 :(得分:1)

如果您使用的是Java EE 6,则可以使用CDI注入记录器。

public class LoggerProducer {

    @Produces 
    public Log createLogger(final InjectionPoint injectionPoint) {
        final String name = injectionPoint.getMember().getDeclaringClass().getName(); 
        return Logger.getLogger(name);
    }
}