CXF在特定文件中写入日志

时间:2013-03-26 17:51:51

标签: grails cxf grails-2.0

在我的应用程序中,有几个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。

2 个答案:

答案 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