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
相关产品推荐
相关产品推荐

