第 14 章接收者

**除非您有勇气忘记海岸,否则您无法游泳到新视野.

—WILLIAM FAULKNER**

什么是接收器?

  • receiver *是一个 Logback 组件,它从远程附加程序接收日志事件,并根据本地策略记录每个接收到的事件。通过使用基于套接字的附加器和接收器的组合,可以构建复杂的拓扑,以便在网络上分发应用程序日志记录事件。

接收者扩展了ch.qos.logback.classic.net.ReceiverBase类。通过接收者扩展此类,接收者参与 Logback 组件LifeCycle,而接收者为ContextAware

过去,SocketAppender和相应的SimpleSocketServer支持通过 Logback 通过网络连接记录事件传递。附加程序充当 Client 端,启动与服务器应用程序的网络连接,并通过网络连接传递日志记录事件。接收器组件和相应的附加程序支持提供了更大的灵 Active。

与其他任何 logback 组件一样,在* logback.xml 中配置了接收器组件。这样就可以在配置接收器组件时利用Joran的全部功能。而且, any *应用程序可以通过简单地配置一个或多个接收器组件来接收来自远程附加程序的日志事件。

附加方和接收方之间的连接启动可以在任一方向上进行。接收者可以充当服务器的角色,被动地侦听来自远程附加 Client 端的连接。替代地,接收者可以充当 Client 端角色,以发起到与充当服务器角色的远程附加程序的连接。无论附加器和接收器的各自作用如何,记录事件始终从附加器流向接收器

在某些情况下,允许接收方启动与附加程序的连接的灵 Active 特别有用:

  • 出于安全原因,中央日志记录服务器可能位于不允许进入连接的网络防火墙后面。使用充当 Client 端角色的接收器组件,中央日志记录服务器(在防火墙内部)可以启动与目标应用程序的连接(在防火墙外部)。

  • 开发人员工具(例如 IDE 插件)和企业 Management 应用程序通常希望能够访问正在运行的应用程序的日志事件流。传统上,Logback 通过要求收件人应用程序(例如,在 IDE 中运行的开发人员工具)充当服务器角色来支持此功能(例如在 Logback Beagle 中),从而被动地侦听来自远程附加程序的连接。事实证明,这很难 Management,尤其是对于在开发人员工作站上运行的工具(可能确实是移动设备)而言。但是,现在可以使用充当 Client 端角色的 Logback 接收器组件,启动与远程附加程序的连接以接收用于本地显示,过滤和警报的日志记录事件,来实现此类工具。

logback配置可以包括以服务器或 Client 端角色的任何组合形式起作用的任意数量的接收器组件。唯一的限制是,充当服务器角色的每个接收者都必须侦听一个不同的端口,并且充当 Client 端角色的每个接收者都将恰好连接到一个远程附加程序。

扮演服务器角色的接收者

配置为充当服务器角色的接收器可以被动地侦听来自远程附加程序的传入连接。这在功能上等同于使用独立的SimpleSocketServer应用程序,除了使用接收器组件,使用 Logback Classic 的* any 应用程序可以通过简单地在 logback.xml *中配置接收器来接收来自远程附加程序的日志事件。

Logback 包括两个充当服务器角色的接收方组件; ServerSocketReceiver及其启用 SSL 的子类型SSLServerSocketReceiver。这两个接收器组件均设计为接受来自传入SocketAppender(或SSLSocketAppender)Client 端的连接。

ServerSocketReceiver组件提供以下可配置的属性:

Property NameTypeDescription
addressString接收方将在其上侦听的本地网络接口地址。如果未指定此属性,则接收方将在所有网络接口上进行侦听。
portint接收方将在其上侦听的 TCP 端口。如果未指定此属性,则将使用默认值。
sslSSLConfiguration仅支持SSLServerSocketReceiver,此属性提供接收方将使用的 SSL 配置,如Using SSL中所述。

Using ServerSocketReceiver

以下配置使用的ServerSocketReceiver组件具有最少的本地附加程序和 Logger 配置。从远程附加程序接收到的日志记录事件将由 rootLogger 进行匹配,并传递给本地控制台附加程序。

示例:ServerSocketReceiver 基本配置(logback-examples/src/main/resources/chapters/receivers/socket/receiver1.xml)

观看为.groovy

<configuration debug="true">

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="CONSOLE" />
  </root>

  <receiver class="ch.qos.logback.classic.net.server.ServerSocketReceiver">
    <port>${port}</port>
  </receiver>

</configuration>

请注意,接收方组件的* class *属性标识了我们希望使用的接收方子类型。在此示例中,我们使用ServerSocketReceiver

我们的示例服务器应用程序的功能和设计与SimpleSocketServer非常相似。它仅接受 logback 配置文件的路径作为命令行参数,并运行给定的配置。尽管我们的示例有些琐碎,但请记住,您可以在* any *应用程序中配置 logback 的ServerSocketReceiver(或SSLServerSocketReceiver)组件。

从* logback-examples *目录中的 Shell 程序中,我们可以如下运行示例服务器应用程序:

java -Dport = 6000 chapters.receivers.socket.ReceiverExample\src/main/java/chapters/receivers/socket/receiver1.xml

我们可以使用配置了SocketAppender的 Client 端应用程序连接到正在运行的接收器。我们的示例 Client 端应用程序仅加载了一个 logback 配置,该配置会将套接字附加程序连接到我们的示例接收器。然后,它以消息的形式 await 用户的 Importing,该消息将被中继到接收器。我们可以如下运行示例 Client 端应用程序:

java -Dhost = localhost -Dport = 6000[+37+](+38+)\src/main/java/chapters/receivers/socket/appender1.xml

Using SSLServerSocketReceiver

以下配置重复相同的最小追加器和 Logger 配置,但是使用充当服务器角色的启用 SSL 的接收器组件。

示例:基本的 SSLServerSocketReceiver 配置(logback-examples/src/main/resources/chapters/receivers/socket/receiver2.xml)

观看为.groovy

<configuration debug="true">

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="CONSOLE" />
  </root>

  <receiver class="ch.qos.logback.classic.net.server.SSLServerSocketReceiver">
    <port>${port}</port>
    <ssl>
      <keyStore>
        <location>${keystore}</location>
        <password>${password}</password>
      </keyStore>
    </ssl>
  </receiver>

</configuration>

此配置与使用ServerSocketReceiver的上一个示例之间的本质区别是* class *属性中的SSLServerSocketReceiver的规范以及嵌套 ssl 属性的存在,此处用于指定包含接收者的私有密钥存储区的位置和密码密钥和证书,使用替代变量。有关为 Logback 组件配置 SSL 属性的详细信息,请参见Using SSL

我们可以使用相同的示例服务器配置来运行此配置,仅带有几个其他配置属性:

java -Dport = 6001-Dkeystore = file:src/main/java/chapters/appenders/socket/ssl/keystore.jks-Dpassword = changeit\chapters.receivers.socket.ReceiverExample\src/main/java/chapters/receivers/socket/receiver2.xml

请注意,命令行上的* keystore *属性指定了标识密钥库位置的文件 URL。您还可以使用Using SSL中所述的 ClasspathURL。

我们可以使用配置了SSLSocketAppender的 Client 端应用程序连接到正在运行的接收器。我们使用上一个示例中使用的示例示例 Client 端应用程序,以及一个使用启用了 SSL 的附加程序的配置文件。我们运行示例如下:

java -Dhost = localhost -Dport = 6001-Dtruststore = file:src/main/java/chapters/appenders/socket/ssl/truststore.jks-Dpassword = changeit\chapters.receivers.socket.AppenderExample\src/main/java/chapters/receivers/socket/appender2.xml

请注意,我们的示例使用的是仅适用于测试和实验的自签名 X.509 凭据。 在生产环境中,您应该获取适当的 X.509 凭据,以标识启用了 SSL 的logback组件 。有关更多信息,请参见Using SSL

扮演 Client 角色的接收者

配置为充当 Client 端角色的接收方将启动与远程附加程序的连接。远程附加程序必须是服务器类型,例如ServerSocketAppender

Logback 包括两个充当 Client 端角色的接收方组件; SocketReceiver及其启用 SSL 的子类型SSLSocketReceiver。这两个接收器组件均旨在启动与ServerSocketAppender(或SSLServerSocketAppender)的远程附加程序的连接。

SocketReceiver子类型支持以下配置属性:

Property NameTypeDescription
remoteHostString远程服务器套接字附加程序的主机名或地址。
portint远程服务器套接字附加程序的端口号。
reconnectionDelayint一个正整数,表示连接失败后尝试重新连接之前要 await 的毫秒数。默认值为 30000(30 秒)。
sslSSLConfiguration仅支持SSLSocketReceiver,此属性提供将用于此接收器的 SSL 配置,如Using SSL中所述。

Using SocketReceiver

用于SocketReceiver的配置与先前使用ServerSocketReceiver的示例非常相似。差异与以下事实有关:Client 端和服务器的角色相反。 SocketReceiver类型的接收者是 Client 端,远程附加器充当服务器。

示例:基本 SocketReceiver 配置(logback-examples/src/main/resources/chapters/receivers/socket/receiver3.xml)

观看为.groovy

<configuration debug="true">
    
  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">    
    <encoder>
      <pattern>%date %-5level [%thread] %logger - %message%n</pattern>
    </encoder>
  </appender>

  <root level="DEBUG">
    <appender-ref ref="CONSOLE" />
  </root>  

  <receiver class="ch.qos.logback.classic.net.SocketReceiver">
    <remoteHost>${host}</remoteHost>
    <port>${port}</port>
    <reconnectionDelay>10000</reconnectionDelay>
  </receiver>

</configuration>

此配置将导致 logback 连接到由* host port *替代变量指定的主机和端口上运行的ServerSocketAppender。从远程附加程序接收到的日志记录事件将通过控制台附加程序本地记录(根据此处显示的配置)。

假设您位于* logback-examples/*目录中,则可以使用以下命令运行此示例配置:

该示例加载配置,然后仅 await 来自远程附加程序的日志事件。如果在不运行远程附加程序的情况下运行此示例,则会定期在日志输出中看到“连接被拒绝”消息。接收器将定期尝试重新连接到远程附加器,直到成功或直到 Logger 上下文关闭为止。尝试之间的延迟间隔可以使用 reconnectionDelay 属性进行配置,如示例配置中所示。

java -Dhost = localhost -Dport = 6000\chapters.receivers.socket.ReceiverExample\src/main/java/chapters/receivers/socket/receiver3.xml

我们可以提供一个远程附加器,我们的示例接收器可以连接到该远程附加器,使用先前使用的相同附加器示例。该示例加载一个包含ServerSocketAppender的 logback 配置,然后 await 来自用户的 Importing,该 Importing 包含将发送到连接的接收者的消息。我们可以按如下方式运行示例追加程序应用程序:

java -Dport = 6000\chapters.receivers.socket.AppenderExample\src/main/java/chapters/receivers/socket/appender3.xml

如果 Importing 未连接接收器时要发送的消息,请注意该消息将被简单丢弃。

Using SocketSSLReceiver

SSLSocketReceiver所需的配置与SocketReceiver所使用的配置非常相似。主要区别在于为接收者指定的类以及嵌套 ssl 属性以指定 SSL 配置属性的能力。以下示例说明了基本配置:

示例:基本 SSLSocketReceiver 配置(logback-examples/src/main/resources/chapters/receivers/socket/receiver4.xml)

观看为.groovy

<configuration debug="true">

  <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">    
    <encoder>
      <pattern>%date %-5level [%thread] %logger - %message%n</pattern>
    </encoder>         
  </appender>

  <root level="DEBUG">
    <appender-ref ref="CONSOLE" />
  </root>  
 
  <receiver class="ch.qos.logback.classic.net.SSLSocketReceiver">
    <remoteHost>${host}</remoteHost>
    <port>${port}</port>
    <reconnectionDelay>10000</reconnectionDelay>
    <ssl>
      <trustStore>
        <location>${truststore}</location>
        <password>${password}</password>
      </trustStore>
    </ssl>
  </receiver>

</configuration>

请注意,* class *属性现在指定了SSLSocketReceiver,并且除了上一个示例中显示的配置属性之外,此配置还包含一个 SSL 配置,该配置指定了信任库的位置和密码,将用于验证远程附加程序是否为值得信赖。有关配置 SSL 属性的更多信息,请参见Using SSL

您可以使用以下命令运行此示例配置:

java -Dhost = localhost -Dport = 6001-Dtruststore = file:src/main/java/chapters/appenders/socket/ssl/truststore.jks-Dpassword = changeit\chapters.receivers.socket.ReceiverExample\src/main/java/chapters/receivers/socket/receiver4.xml

一旦启动,接收方将尝试连接到指定的远程附加程序。假定附加器尚未运行,您将看到日志输出中定期出现“拒绝连接”消息;接收器在延迟了由 reconnectionDelay 属性指定的时间后,将定期重试与远程附加程序的连接。

我们可以提供一个远程附加器,我们的示例接收器可以连接到该远程附加器,使用先前使用的相同附加器示例。该示例加载一个包含SSLServerSocketAppender的 logback 配置,然后 await 来自用户的 Importing,该 Importing 包含一条消息,该消息将传递到连接的接收者。我们可以按如下方式运行示例追加程序应用程序:

java -Dport = 6001-Dkeystore = file:src/main/java/chapters/appenders/socket/ssl/keystore.jks-Dpassword = changeit\chapters.receivers.socket.AppenderExample\src/main/java/chapters/receivers/socket/appender4.xml

如果 Importing 未连接接收器时要发送的消息,请注意该消息将被简单丢弃。

再次需要注意的重要一点是,我们的示例使用的是仅适用于测试和实验的自签名 X.509 凭据。 在生产环境中,您应该获取适当的 X.509 凭据,以标识启用了 SSL 的logback组件 。有关更多信息,请参见Using SSL