2016-10-30 19 views
0

raw Websocketを使用するSpringアプリケーション(クラスTextWebSocketHandlerを拡張することにより)では、Webソケットイベントの処理中にスローされた例外により、接続はステータス1011で終了します。私のログには表示されません(log4jバージョン2を使用)。このアクションをどこかに記録させる例外を引き起こす簡単な方法はありますか?私は単にロギングオプションをどこかで変更する必要があるのですか、それとも動作させるためにソケットハンドラの周りに例外処理ラッパーを書く必要がありますか?または、私の設定で今すぐ適用できるラッパーはすでにありますか?Spring websocket(生ハンドラ、STOMP/SockJSではありません)例外ログ

編集した設定の詳細を追加する:私のpom.xmlファイルの

関連セクション:

<properties> 
    <java.version>1.8</java.version> 
    <spring.version>4.3.3.RELEASE</spring.version> 
    <log4j.version>2.7</log4j.version> 
</properties> 
<dependencies> 
    <!-- Spring core & mvc --> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>${spring.version}</version> 
     <exclusions> 
      <exclusion> <!-- exclude commons logging so we can use SLF4J --> 
       <groupId>commons-logging</groupId> 
       <artifactId>commons-logging</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-websocket</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <!-- Logging --> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>${log4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>${log4j.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-web</artifactId> 
     <version>${log4j.version}</version> 
     <scope>runtime</scope> 
    </dependency> 
    <dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-slf4j-impl</artifactId> 
     <version>${log4j.version}</version> 
    </dependency> 
    <!-- Logging: SLF4J --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>${slf4j.version}</version> 
     <scope>compile</scope> 
    </dependency> 
    <!-- Logging: SLF4J implementation of JCL API (required by Spring) --> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>jcl-over-slf4j</artifactId> 
     <version>${slf4j.version}</version> 
     <scope>runtime</scope> 
    </dependency> 
    ... 

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="WARN"> 
    <Appenders> 
    <Console name="Console" target="SYSTEM_OUT"> 
     <PatternLayout pattern="%d{yyMMdd'T'HHmmss} %highlight{[%t] %level{1} %logger{1.} - %msg%n%rEx{10}}"/> 
    </Console> 
    </Appenders> 
    <Loggers> 
    <Root level="info"> 
     <AppenderRef ref="Console"/> 
    </Root> 
    </Loggers> 
</Configuration> 

サーブレットのcontext.xml(のみ関連するセクション):

<context:annotation-config /> 
<mvc:annotation-driven /> 

<!-- websocket handlers --> 
<bean id="roomServerSocketHandler" class="${package}.websocket.RoomServerSocketHandler"> 
    <!-- (properties removed) --> 
</bean> 

<!-- websocket handler mapping --> 
<websocket:handlers allowed-origins="http://localhost:63342"> 
    <websocket:mapping path="/connect" handler="roomServerSocketHandler" /> 
</websocket:handlers> 

編集2:プロジェクトのログAPIとしてcommons-loggingよりもSLF4Jに切り替えたので、上記のmaven設定を更新しました。これまでは、Springからのデフォルトのcommons-logging 1.2依存関係を使用していました。しかし、これは問題を変えていません。

+1

ロギングの方法に関する現在のlog4jとコードのコードを追加できますか? – developer

+0

@javaguy - 私は現在どのようなロギングも行っていません。私は、単一のWebソケットハンドラを持つ基本的な春のMVCプロジェクトを持っており、クラスパス上にlog4j-api、log4j-core、log4j-webを持っています。これまでに起こっている唯一のログは、デフォルトのSpringロギングです。 –

答えて

0

春にはログが利用できますが、ログレベルは「デバッグ」に設定されています。そのため、次の行は、ちょうど<Root>ロガー宣言の上、log4j2.xmlファイルに必要とされる:ウェブソケットがクローズさせることが

<Logger name="org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator" level="debug" /> 

例外は、例えば、今ログインしています

161030T130445 D o.s.w.s.h.ExceptionWebSocketHandlerDecorator - Closing due to exception for StandardWebSocketSession[id=1, uri=/roomserver/connect] 
java.lang.IllegalStateException: The WebSocket session [0] has been closed and no method (apart from close()) may be called on a closed session 
    at org.apache.tomcat.websocket.WsSession.checkState(WsSession.java:803) ~[tomcat-websocket.jar:8.5.6] 
    at org.apache.tomcat.websocket.WsSession.getBasicRemote(WsSession.java:446) ~[tomcat-websocket.jar:8.5.6] 
    at org.springframework.web.socket.adapter.standard.StandardWebSocketSession.sendTextMessage(StandardWebSocketSession.java:197) ~[spring-websocket-4.3.3.RELEASE.jar:4.3.3.RELEASE] 
    .... 
関連する問題