繁体   English   中英

Spring WebSocket(原始处理程序,不是STOMP / SockJS)异常日志记录

[英]Spring websocket (raw handler, not STOMP/SockJS) exception logging

在使用原始websocket的Spring应用程序中(通过扩展类TextWebSocketHandler ),在处理Web套接字事件期间抛出的异常导致连接以状态1011关闭,但未出现在我的日志中(使用log4j版本2)。 是否有一种简单的方法来导致导致将此操作记录在某处的异常? 我是否只需要在某个地方更改日志记录选项,还是必须在套接字处理程序周围编写异常处理包装程序才能使其正常工作? 还是已经有这样的包装程序可以在我的配置中应用了?

编辑以添加配置详细信息:

我的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>

servlet-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:更新了上面的maven配置,因为我已经切换到SLF4J,而不是将commons-logging作为项目的日志记录API。 以前,它使用Spring的默认commons-logging 1.2依赖项。 不过,这并没有改变问题。

Spring具有可用的日志记录,但是其日志记录级别设置为“调试”。 因此,在<Root>记录器声明上方的log4j2.xml文件中,以下行是必需的:

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

现在记录导致Web套接字关闭的异常,例如

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]
    ....

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM