【问题标题】:How to print Tomcat Access Logs to console in the json format in a Spring Boot Application?如何在 Spring Boot 应用程序中以 json 格式将 Tomcat 访问日志打印到控制台?
【发布时间】:2022-10-05 01:07:13
【问题描述】:

我正在使用 log4j2.xml 并且需要在我的 Spring Boot 应用程序中将 Tomcat 访问日志打印到控制台。请帮助如何做到这一点,因为我一直坚持这一点。我尝试在 application.properties 中进行如下配置,但打印的记录器不是 json 格式。

    server.tomcat.accesslog.enabled=true
    server.tomcat.accesslog.directory=/dev
    server.tomcat.accesslog.prefix=stdout
    server.tomcat.accesslog.console.pattern="{\"time\": \"%d\", \"level\": \"%p\", \"correlation-id\": \"%X{X-Correlation-Id}\", \"source\": \"%logger{63}:%L\", \"message\": \"%replace(%m%wEx{6}){'[\r\n]+', '\\n'}%nopex\", \"source\":\"ACCESS_LOGS\"}%n"
    server.tomcat.accesslog.suffix=
    server.tomcat.accesslog.file-date-format=
    server.tomcat.basedir=.

记录器以垃圾字符的形式打印如下:

    "{"time": "???d???", "level": "8080", "correlation-id": "+{X-Correlation-Id}", "source": "-ogger{63}:???L???", "message": "POST /v1/plan/fetchPlans HTTP/1.1eplace(POST???w???Ex{6}){'[]+', '\n'}???n???opex", "source":"ACCESS_LOGS"}???n???"

【问题讨论】:

    标签: java spring-boot log4j2


    【解决方案1】:

    您的模式无效,因为它不是 Tomcat 能够理解的形式。看起来您正在尝试使用 Log4j2 的模式语法。您需要改用Tomcat。您可以了解更多关于 Tomcat's documentation 中支持的语法和模式代码:

    • %a - 远程 IP 地址。另请参阅下面的%{xxx}a
    • %A - 本地 IP 地址
    • %b - 发送的字节数,不包括 HTTP 标头,如果为零,则为“-”
    • %B - 发送的字节数,不包括 HTTP 标头
    • %h - 远程主机名(如果连接器的 enableLookups 为 false,则为 IP 地址)
    • %H - 请求协议
    • %l - 来自 identd 的远程逻辑用户名(总是返回“-”)
    • %m - 请求方法(GET、POST 等)
    • %p - 接收此请求的本地端口。另请参阅下面的 %{xxx}p。
    • %q - 查询字符串(如果存在,则以 '?' 开头)
    • %r - 请求的第一行(方法和请求 URI)
    • %s - 响应的 HTTP 状态码
    • %S - 用户会话 ID
    • %t - 日期和时间,通用日志格式
    • %u - 已通过身份验证的远程用户(如果有),否则为“-”(如果需要,转义)
    • %U - 请求的 URL 路径
    • %v - 本地服务器名称
    • %D - 处理请求所花费的时间,以毫秒为单位。注意:在 httpd %D 中是微秒。行为将与 Tomcat 10 及更高版本中的 httpd 保持一致。
    • %T - 处理请求所用的时间,以秒为单位。注意:此值具有毫秒分辨率,而在 httpd 中它具有秒分辨率。行为将与 Tomcat 10 及更高版本中的 httpd 保持一致。
    • %F - 提交响应所用的时间,以毫秒为单位
    • %I - 当前请求线程名称(可以稍后与堆栈跟踪进行比较)
    • %X - 响应完成时的连接状态:
      • X = 在响应完成之前连接中止。
      • + = 发送响应后连接可能保持活动状态。
      • - = 响应发送后连接将关闭。

    还支持写入信息传入或传出标头、cookie、会话或请求属性和特殊时间戳格式。它以 Apache HTTP Server 日志配置语法为模型。它们中的每一个都可以使用不同的 xxx 键多次使用:

    • %{xxx}a写远程地址(client)(xxx==remote)或连接peer地址(xxx=peer)
    • %{xxx}i 写入名称为 xxx 的传入标头的值(如果需要,请转义)
    • %{xxx}o 写入名为 xxx 的传出标头的值(如果需要,请转义)
    • %{xxx}c 写入名称为 xxx 的 cookie 的值(需要时转义)
    • %{xxx}r 写入名称为 xxx 的 ServletRequest 属性值(需要时转义)
    • %{xxx}s 写入名称为 xxx 的 HttpSession 属性的值(如果需要,请转义)
    • %{xxx}p写本地(服务器)端口(xxx==本地)或远程(客户端)端口(xxx=远程)
    • %{xxx}t 在使用增强的 SimpleDateFormat 模式 xxx 格式化的请求末尾写入时间戳

    【讨论】:

    • 如何使用上述格式之一读取环境变量的值?
    • 您可以在server.tomcat.accesslog.pattern 的值中使用${YOUR_ENV_VAR}。在使用该模式配置 Tomcat 的访问日志之前,它将被替换为 YOUR_ENV_VAR 的值作为配置属性绑定的一部分。
    • @AndyWilkinson 我正在尝试使用自定义标题来打印server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D theader=%{theader}I - 但它说theader=??? - 就像值不存在
    • 实际上%{xxx}I 是错误的 - 它必须是小的i - 然后它可以工作
    猜你喜欢
    • 2019-08-24
    • 1970-01-01
    • 2018-07-28
    • 2019-12-15
    • 2021-03-11
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多