在我的应用程序中,有几个Web服务在cxf框架的帮助下实现。我想将每个Web服务的传入请求记录在单独的文件中。 e.g。
requests -> ws1 interface -> incomingWs1.log
requests -> ws2 interface -> incomingWs2.log
目前我知道如何使用日志记录拦截器记录传入和传出的消息。这工作正常,但有interceports我无法定义日志的输出位置。这是使用记录拦截器的示例:
@WebService(endpointInterface = "at.pdts.cxf.HelloWorld")
@InInterceptors(interceptors = "org.apache.cxf.interceptor.LoggingInInterceptor") // this works!
@Logging(limit=16000, inLocation="<stdout>", outLocation="<logger>", pretty=true) // does not work!
public class HelloWorldImpl implements HelloWorld { ...
经过一段时间的研究后发现了一个日志记录注释,它提供了我搜索过的位置设置,如上面的代码示例所示。报废没有效果!我尝试了几个位置选项,比如
file:///c:/log.log
file:c:\log.log
<stdout>
我希望有人能指出我正确的方向。我在版本为2.2.1的grails应用程序中使用了cxf framework 2.7.3。
答案 0 :(得分:1)
outLocation
注释的@Logging
属性可用于实现此目的,但是,提供的文件名必须是绝对文件名。下面提供了一个示例:
@Logging(limit=16000, inLocation="<stdout>", outLocation="/absolute/path/to/file", pretty=true)
public class HelloWorldImpl implements HelloWorld { ...
请注意,只有绝对路径才有效,因为URI
用于在AbstractLoggingInterceptor
类内部创建输出文件,如下所示:
public abstract class AbstractLoggingInterceptor extends AbstractPhaseInterceptor<Message> {
public void setOutputLocation(String s) {
...
} else {
try {
URI uri = new URI(s);
File file = new File(uri);
writer = new PrintWriter(new FileWriter(file, true), true);
} catch (Exception ex) {
getLogger().log(Level.WARNING, "Error configuring log location " + s, ex);
}
}
}
}
如果要使用其名称将在运行时确定的动态文件,可以扩展LoggingOutInterceptor
以实现此目的。
答案 1 :(得分:0)
解决方案非常简单。如果要使用日志记录批注,则必须将其放在服务端点接口中。在上面发布的示例中,注释属于HelloWorld接口:
@Logging(limit=16000, inLocation="<stdout>", outLocation="<logger>", pretty=true)
public interface HelloWorld {
...
使用文件uris在特定文件中记录soap消息,例如文件:/// C:/out.txt