1

我了解 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 扩展到日志记录实用程序,还是有更好的方法?

注意:应用程序将在应用服务器实例中运行。

4

1 回答 1

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);
    }
}
于 2012-12-29T01:30:54.887 回答