据我所知,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中运行。
答案 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);
}
}