【问题标题】:SocketAppender and PatternLayoutSocketAppender 和 PatternLayout
【发布时间】:2015-01-29 14:22:56
【问题描述】:

我有一个将日志发送到日志服务器存储的记录器。这工作正常,但没有使用 patternlayout。不管有没有,都不会改变任何事情。我相信记得阅读 socketappender 使用的是自己的模式而不是其他模式的地方。

<appender name="LOGSTASH" class="org.apache.log4j.net.SocketAppender"> 
        <param name="Port" value="5000"/>
        <param name="RemoteHost" value="192.168.81.131"/> 
        <param name="ReconnectionDelay" value="5000"/>
        <param name="LocationInfo" value="true" />
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n" />
      </layout>
</appender> 

但是在这个documentation(和其他一些)上使用这个。此文档中的示例:

<appender name="A1" class="org.apache.log4j.net.SocketAppender">
    <param name="RemoteHost" value="localhost"/>
    <param name="Port" value="5000"/>
    <param name="LocationInfo" value="true"/>
    <layout class="org.apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%t %-5p %c{2} - %m%n"/>
    </layout>
    </appender>

那么 socketappender 不能使用个人模式还是我的错?

如果不可能,是否有用于自定义模式的 tcp 日志记录的替代附加程序?

【问题讨论】:

  • 已经找到this subject,但不要帮助我知道其他方法。

标签: logging log4j appender


【解决方案1】:

@myuce 发布的解决方法有效,但您还需要在“标准”OutputStream (OS) 中替换 ObjectOutputStream (OOS)。

您可以在 OOS 内部进行检查 - 它会在输出之前为“接收器”添加一些附加内容。

??t?{"@timestamp":"2018-03-27T14...

所以...我刚刚替换了(在我的情况下是 scala):

oos = new ObjectOutputStream(new Socket(address, port).getOutputStream());oos = new ObjectOutputStream(socket.getOutputStream());

在: stream = new Socket(address, port).getOutputStreamstream = socket.getOutputStream (以及变量名 [当然是每次出现;] 为了清楚起见)。

【讨论】:

    【解决方案2】:

    作为一种解决方法,

    • 对于 Log4j 1.x
    • 将 SocketAppender 代码复制到本地项目中
    • 将“requiresLayout”方法改为

          public boolean requiresLayout() {
                  return true;
          }
      
    • 将附加方法更改为;

       public void append(LoggingEvent event) {
      
          ///......
      
          event.getThrowableStrRep();
      
          if (this.layout == null) {
              errorHandler.error("No layout for appender " + name,
                      null, ErrorCode.MISSING_LAYOUT);
              return;
          }
      
          String message = this.layout.format(event);
      
          oos.writeObject(message);
          ///...... 
       }
      
    • 将此类设置为您的附加程序。

    • 现在,您可以为此附加程序设置任何布局。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      SocketAppender 好像没有使用布局。

      SocketAppenders 不使用布局。他们将序列化的 LoggingEvent 对象发送到服务器端。

      See documentation here


      所以我使用 SyslogAppender 来替换。由于未使用的可能性(如设施和优先级),它并不完美,但工作正常。

      【讨论】:

        猜你喜欢
        • 2011-12-10
        • 2013-07-30
        • 1970-01-01
        • 2019-06-30
        • 2012-07-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多