4

我试图告诉我的 jboss 写一个包含我需要的所有信息的访问日志,并使用每日日志轮换。到目前为止,这不是问题。最终目标是使用 logstash 转发器将所有访问日志条目发送到 elk 堆栈。也没什么大不了的。我现在遇到的问题是定义访问日志名称。

JBoss 提供开箱即用的日志轮换,但为每个日志文件添加了时间戳,因此今天的文件也有时间戳后缀。

我想要实现的是与 tomcat 或 jbosses server.log 相同的行为。这意味着今天的文件应该只命名为 access.log 并且只有在今天的文件变成昨天的文件并因此被轮换到不活动状态时才附加一个后缀。

我的 jboss 配置如下所示:

<subsystem xmlns="urn:jboss:domain:logging:1.3">
    <periodic-rotating-file-handler name="FILE" autoflush="true">
        <formatter>
            <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
        </formatter>
        <file relative-to="jboss.server.log.dir" path="server.log"/>
        <suffix value=".yyyy-MM-dd"/>
        <append value="true"/>
    </periodic-rotating-file-handler>
    <periodic-rotating-file-handler name="ACCESS" autoflush="true">
        <formatter>
            <pattern-formatter pattern="%d{HH:mm:ss,SSS} %-5p [%c] (%t) %s%E%n"/>
        </formatter>
        <file relative-to="jboss.server.log.dir" path="access.log"/>
        <suffix value=".yyyy-MM-dd"/>
        <append value="true"/>
    </periodic-rotating-file-handler>
    <logger category="com.arjuna">
        <level name="WARN"/>
    </logger>
    <logger category="org.apache.tomcat.util.modeler">
        <level name="WARN"/>
    </logger>
    <logger category="org.jboss.as.config">
        <level name="DEBUG"/>
    </logger>
    <logger category="sun.rmi">
        <level name="WARN"/>
    </logger>
    <logger category="jacorb">
        <level name="WARN"/>
    </logger>
    <logger category="jacorb.config">
        <level name="ERROR"/>
    </logger>
    <root-logger>
        <level name="INFO"/>
        <handlers>
            <handler name="FILE"/>
            <handler name="ACCESS"/>
        </handlers>
    </root-logger>
</subsystem>

这是我启用了日志轮换的访问日志配置(具有上述时间戳行为)。当我设置 rotate="false" 时,我得到一个未评级的 access.log。

<subsystem xmlns="urn:jboss:domain:web:1.5" default-virtual-server="default-host" native="false">
    <connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
    <virtual-server name="default-host" enable-welcome-root="true">
        <alias name="localhost"/>
        <alias name="example.com"/>
        <access-log pattern="&quot;%{HOST}i&quot; - %h %t &quot;%m&quot; &quot;%U&quot; - &quot;%q&quot; - &quot;%H&quot; - %s %B &quot;%{User-Agent}i&quot; %T %D &quot;%p&quot;" prefix="access.log" rotate="true">
            <directory path="."/>
        </access-log>
    </virtual-server>
</subsystem>

现在我看到了两种将日志文件发送到我的 elk 堆栈的方法。首先是写入没有时间戳的 access.log 并在轮换时添加时间戳,以便 logstash 转发器始终可以读取 access.log。其次是设置转发器配置以始终检查最新的 access.log 文件。这样,带时间戳的文件名就不会成为问题。但我不知道这是否可能。

我会很感激任何建议。谢谢并恭祝安康。塞巴斯蒂安

4

1 回答 1

3

笔记

  • 以下解决方案在EAP 7.0/Wildfly 10上进行了测试。
  • 下面显示的所有配置都在standalone.xml

JBoss EAP / Wildfly 的 access-log 直接附带的日志轮换是非常基本的,并且有一些限制。在上面的问题中,日志轮换激活如下

<access-log .... rotate="true" />

在我们的案例中,我们通过不使用它并将访问日志发送到通用服务器日志(注use-server-log="true")来解决糟糕的日志轮换问题。

<subsystem xmlns="urn:jboss:domain:undertow:4.0">
  ...
  <server name="default-server">
    <http-listener  name="default" socket-binding="http"  record-request-start-time="true" redirect-socket="https" />
    <https-listener name="https"   socket-binding="https" record-request-start-time="true" security-realm="ApplicationRealm" />
    <host name="default-host" alias="localhost">
      <!-- how to access log see https://access.redhat.com/solutions/2423311 -->
      <!-- access log pattern see http://undertow.io/javadoc/1.3.x/io/undertow/server/handlers/accesslog/AccessLogHandler.html -->
      <!-- Hint: access log is sent to server log (use-server-log="true") in order to add proper log file rolling/purging and set a readable timestamp -->
      <access-log pattern="%h %l %u &quot;%r&quot; %s %b &quot;%{i,Referer}&quot; &quot;%{i,User-Agent}&quot; &quot;%{i,COOKIE}&quot; &quot;%{o,SET-COOKIE}&quot; %S &quot;%I&quot; %T" use-server-log="true"/>
      ...
    </host>
  </server>

重要的是不要忘记,record-request-start-time="true"否则http-listener您将不会得到任何计时日志。

在该<subsystem xmlns="urn:jboss:domain:logging部分中,我们配置访问日志记录如下:

<profile>
    <subsystem xmlns="urn:jboss:domain:logging:3.0">
        ...
        <!-- log rotate access.log by size to avoid disk-full -->
        <size-rotating-file-handler name="ACCESS" autoflush="true">
            <formatter>
                <pattern-formatter pattern="[%d] - %s%n"/>
            </formatter>
            <file relative-to="jboss.server.log.dir" path="access.log"/>
            <rotate-size value="10485760"/>
            <max-backup-index value="5"/>
            <append value="true"/>
        </size-rotating-file-handler>
        ...
        <logger category="io.undertow.accesslog" use-parent-handlers="false">
            <handlers>
                <handler name="ACCESS"/>
            </handlers>
        </logger>
        <root-logger>
            <level name="INFO"/>
            <handlers>
                <handler name="CONSOLE"/>
                <handler name="FILE"/>
            </handlers>
        </root-logger>
        ...
    </subsystem>

这将创建最多 5 个访问日志文件,每个 10MB。还有其他可用的日志处理程序,例如每日滚动。

有关如何配置 JBoss Logging / LogHandlers 的信息:

此处为拥有 RedHat 帐户的用户提供的更多信息:

于 2019-06-17T13:25:56.263 回答