Spring-AOP 和 SLF4J
我使用 Spring-AOP 来建议一个 spring 托管 bean,它扩展了一个实现 3 个接口的抽象类。继承层次结构中还有其他 spring 管理的 bean。
我正在尝试采用侵入性最小的方法,使用 spring-LTW:
<context:component-scan base-package="com.foo.aop"/>
<!-- ... -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<context:load-time-weaver/>
使用厨房水槽方法尝试进行日志记录:
@Aspect
@Component
public class ForStackOverflow {
private final Log commons = LogFactory.getLog(ForStackOverflow.class);
private final org.apache.log4j.Logger log4j = org.apache.log4j.Logger.getLogger(ForStackOverflow.class);
private final Logger jul = Logger.getLogger(ForStackOverflow.class.getSimpleName());
private final org.slf4j.Logger slf4j = org.slf4j.LoggerFactory.getLogger(ForStackOverflow.class);
@Pointcut(value="within(com.foo.aop.AbstractClass+) " +
"&& execution(* advisedMethod(com.foo.SomeType)) " +
"&& args(someType)")
private void adviseMe(SomeType someType){}
@After(value="adviseMe(com.foo.SomeType) && args(someType)", argNames = "someType")
public void itWorked(SomeType someType) {
String msg = "DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG";
logIt(msg);
IsNotNull(someType, "someType");
String message = "SomeType [ " + someType + "] loaded.";
status(message);
logIt(msg);
}
void status(String message) {
logIt(message);
}
private void logIt(String msg){
System.out.println("STDOUT: " + msg);
System.err.println("STDERR: " + msg);
commons.warn("COMMONS: " + msg);
log4j.warn("LOG4J: " + msg );
jul.warning("JUL: " + msg);
slf4j.warn("SLF4J: " + msg );
}
}
我有证据表明我的方法正在被建议,因为我可以从那里抛出并看到堆栈跟踪在适当的位置弹出。
但日志记录却难以捉摸。
(我将 log4j 和 commons-logging 桥接到 slf4j。该应用程序需要 java utillogging 作为其底层实现。)
I'm using Spring-AOP to advise a spring managed bean that extends an abstract class which implements 3 interfaces. There are other spring-managed beans around in the inheritance hierarchy.
I'm trying to take the least-invasive approach, using spring-LTW:
<context:component-scan base-package="com.foo.aop"/>
<!-- ... -->
<aop:aspectj-autoproxy proxy-target-class="true"/>
<context:load-time-weaver/>
Using the kitchen-sink approach to try to get logging to happen:
@Aspect
@Component
public class ForStackOverflow {
private final Log commons = LogFactory.getLog(ForStackOverflow.class);
private final org.apache.log4j.Logger log4j = org.apache.log4j.Logger.getLogger(ForStackOverflow.class);
private final Logger jul = Logger.getLogger(ForStackOverflow.class.getSimpleName());
private final org.slf4j.Logger slf4j = org.slf4j.LoggerFactory.getLogger(ForStackOverflow.class);
@Pointcut(value="within(com.foo.aop.AbstractClass+) " +
"&& execution(* advisedMethod(com.foo.SomeType)) " +
"&& args(someType)")
private void adviseMe(SomeType someType){}
@After(value="adviseMe(com.foo.SomeType) && args(someType)", argNames = "someType")
public void itWorked(SomeType someType) {
String msg = "DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG DEBUG";
logIt(msg);
IsNotNull(someType, "someType");
String message = "SomeType [ " + someType + "] loaded.";
status(message);
logIt(msg);
}
void status(String message) {
logIt(message);
}
private void logIt(String msg){
System.out.println("STDOUT: " + msg);
System.err.println("STDERR: " + msg);
commons.warn("COMMONS: " + msg);
log4j.warn("LOG4J: " + msg );
jul.warning("JUL: " + msg);
slf4j.warn("SLF4J: " + msg );
}
}
I have evidence that my method is being advised, because I can throw from there and see the stack trace pop out in the appropriate place.
But logging is elusive.
(I'm bridging log4j and commons-logging to slf4j. The application requires java util logging as its underlying implementation.)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
很可能您忘记添加 jvm 参数 -javagent
或者
您的应用程序类路径中未包含 META-INF\aop.xml 文件,
请参阅下面的答案了解详细信息
Spring 加载时编织未检测到用 @configurable 注释的类
most likely you have forgotten to add jvm parameter -javagent
or
you are not including META-INF\aop.xml file on your application classpath
please refer below answer for details
Spring load time weaving not detecting class annotated with @configurable