undertow

undertow 如何像tomcat一样开启localhost_access_log

评论区

JFinal

2019-07-03 15:59

下载 jfinal demo for maven, 里头有一个 jfinal.sh 文件,里头有一个被注掉的启动命令行,可以将输出到控制台的信息定向输出到指定的文件,可能就是你想要的功能

如果你是希望将所有请求 URL 都输出到日志,做一个 Handler ,将 String target 参数的内容送入日志文件即可

chcode

2019-07-03 16:04

@JFinal undertow 没有类似的功能吗?需要自己写?

JFinal

2019-07-03 16:45

@chcode 可能有,翻一翻 undertow 的官方文档,然后用一下 jfinal undertow 项目中的 UndertowServer 中提供一些方法配置一下 undertow

具体的配置方法见文档:
https://www.jfinal.com/doc/1-4

注意看第 11、12 小节的配置样例代码

chcode

2019-07-03 20:51

@JFinal 谢谢波总 ,解决了,参考springboot里面对undertow access log 的实现完成,不过单独靠
UndertowServer.create(JFinalConfig.class)
.onStart( builder -> {
builder.setServerOption(UndertowOptions.参数名, 参数值);
})
.start();
这样好像无法解决,
AccessLogHandler日志处理类 的构造方法为
public AccessLogHandler(HttpHandler next, AccessLogReceiver accessLogReceiver, String formatString, ClassLoader classLoader) {
this(next, accessLogReceiver, formatString, classLoader, Predicates.truePredicate());
}
lambda表达式 内无法获取HttpHandler 对象所以无法构造日志对象,最后还是覆盖了写一个类继承UndertowServer覆盖了configHttp()方法完成了,代码如下
Xnio xnio = Xnio.getInstance(Undertow.class.getClassLoader());
XnioWorker worker = null;
try {
worker = xnio.createWorker(OptionMap.builder().set(Options.THREAD_DAEMON, true).getMap());
} catch (IOException e) {
e.printStackTrace();
}
DefaultAccessLogReceiver accessLogReceiver = new DefaultAccessLogReceiver(worker,
new File(System.getProperty("logPath")), "undertow_access_log.", "log", true);
builder.addHttpListener(config.getPort(), config.getHost())
.setHandler(pathHandler).setHandler(new AccessLogHandler(httpHandler, accessLogReceiver,
"common", Undertow.class.getClassLoader()));
不知道波总有没有更好的建议,希望在下一个版本添加对访问日志配置的支持,因为这个功能还是挺实用的

alian

2020-07-28 09:36

@chcode 我也有这样的需求,不知道现在有没有这个功能?

zlsj80

2023-02-15 09:43

@chcode 等保原因,我现在也有这样的需求,搜到您这个解决方案,看的不是很明白,这个AccessLogHandler日志处理类是io.undertow.server.handlers.accesslog里是已经有了,pathHandler,httpHandler类具体实现能贴出来吗

chcode

2023-02-15 09:51

@zlsj80 主要抄springboot相关的实现

热门反馈

扫码入社