You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jetty 10使用自定义日志时自定义属性换行如何合并到同一行

问题原因

你当前的写法是先调用super.log(request, response),该方法内部会完成默认日志内容的写入,并且自动在末尾追加换行符,你后续再调用writerObj.write()写入自定义内容,自然就会输出到新的一行。

可行实现方案

方案一:利用Jetty原生占位符实现(推荐)

Jetty的CustomRequestLog原生支持读取Request的自定义属性拼接到日志中,不需要手动处理写入逻辑,符合Jetty的设计规范,扩展成本更低。

修改后的代码示例

package net.codejava.javaee;

import org.eclipse.jetty.server.CustomRequestLog;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
import java.io.Writer;

public class MyJettyLogger extends CustomRequestLog
{
    public MyJettyLogger(Writer writer, String logStr)
    {
        super(writer, logStr);
    }

    @Override
    public void log(Request request, Response response)
    {
        // 动态设置自定义属性到Request的Attribute中
        String userId="1234";
        String username = "Ashish";
        String lastName ="Goyanka";
        request.setAttribute("userId", userId);
        request.setAttribute("username", username);
        request.setAttribute("lastName", lastName);
        // 父类会自动按照格式字符串拼接所有内容
        super.log(request, response);
    }
}

初始化日志时调整格式字符串

在你原来的日志格式字符串末尾追加自定义属性的占位符即可,占位符格式为%{属性名}attr。比如你用的默认NCSA扩展格式,调整后的完整格式为:

%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %{userId}attr %{username}attr %{lastName}attr

方案二:拼接完整日志后一次性写入

如果你不想调整日志格式字符串,要保留现有自定义内容拼接逻辑,可以直接调用父类的日志格式化方法拿到默认日志字符串,拼接自定义内容后一次性写入,避免两次写入带来的换行问题。

修改后的代码示例

package net.codejava.javaee;

import org.eclipse.jetty.server.CustomRequestLog;
import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.Response;
import java.io.IOException;
import java.io.Writer;

public class MyJettyLogger extends CustomRequestLog
{
    public MyJettyLogger(Writer writer, String logStr)
    {
        super(writer, logStr);
    }

    @Override
    public void log(Request request, Response response)
    {
        // 仅获取默认日志字符串,不执行写入
        String defaultLog = formatLog(request, response);
        // 拼接自定义属性
        String customSuffix = setCustomAttributesToLog(request);
        // 一次性写入完整日志行,手动追加换行符
        try {
            getWriter().write(defaultLog + customSuffix + System.lineSeparator());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private String setCustomAttributesToLog(Request request){
        StringBuilder logBuffer = new StringBuilder("");
        String userId="1234";
        String username = "Ashish";
        String lastName ="Goyanka";
        String uri = request.getRequestURI();
        String requestMethod = request.getMethod();
        
        logBuffer.append(" ");
        logBuffer.append(userId);
        logBuffer.append(" ");
        logBuffer.append(username);
        logBuffer.append(" ");
        logBuffer.append(lastName);
        logBuffer.append(" ");
        logBuffer.append(uri);
        logBuffer.append(" ");
        logBuffer.append(requestMethod);

        return logBuffer.toString();
    }
}

内容的提问来源于stack exchange,提问作者Ashish Goyanka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:45:05