1

私のアプリケーションには、cxf フレームワークを使用して実装された Web サービスがいくつかあります。各 Web サービスの着信要求を別々のファイルに記録したいと考えています。例えば

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フレームワーク2.7.3を使用しています。

4

2 に答える 2

1

注釈のoutLocation属性を@Logging使用してこれを実現できますが、提供されるファイル名は絶対ファイル名でなければなりません。以下に例を示します。

@Logging(limit=16000, inLocation="<stdout>", outLocation="/absolute/path/to/file", pretty=true)
public class HelloWorldImpl implements HelloWorld { ...

以下に示すようにURI、クラス内で内部的に出力ファイルを作成するために a が使用されているため、絶対パスのみが機能することに注意してください。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これを実現するために拡張できます。

于 2017-06-23T10:20:22.480 に答える
0

解決策は非常に簡単です。ロギング アノテーションを使用する場合は、サービス エンドポイント インターフェイスに配置する必要があります。上記の例では、アノテーションは HelloWorld インターフェイスに属しています。

@Logging(limit=16000, inLocation="<stdout>", outLocation="<logger>", pretty=true)
public interface HelloWorld {
...

file uris を使用して、特定のファイル (file:///c:/out.txt など) に SOAP メッセージを記録します。

于 2013-04-22T09:17:33.163 に答える