Skip to content

Commit 2e504b4

Browse files
committed
Migrate from NCSARequestLog to CustomRequestLog
Closes gh-16416
1 parent f1786c3 commit 2e504b4

File tree

5 files changed

+144
-165
lines changed

5 files changed

+144
-165
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/ServerProperties.java

Lines changed: 44 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,7 @@
2525
import java.util.ArrayList;
2626
import java.util.HashMap;
2727
import java.util.List;
28-
import java.util.Locale;
2928
import java.util.Map;
30-
import java.util.TimeZone;
3129

3230
import io.undertow.UndertowOptions;
3331

@@ -890,6 +888,17 @@ public static class Accesslog {
890888
*/
891889
private boolean enabled = false;
892890

891+
/**
892+
* Log format.
893+
*/
894+
private FORMAT format = FORMAT.NCSA;
895+
896+
/**
897+
* Custom log format, see org.eclipse.jetty.server.CustomRequestLog. If
898+
* defined, overrides the "format" configuration key.
899+
*/
900+
private String customFormat;
901+
893902
/**
894903
* Log filename. If not specified, logs redirect to "System.err".
895904
*/
@@ -910,47 +919,6 @@ public static class Accesslog {
910919
*/
911920
private boolean append;
912921

913-
/**
914-
* Enable extended NCSA format.
915-
*/
916-
private boolean extendedFormat;
917-
918-
/**
919-
* Timestamp format of the request log.
920-
*/
921-
private String dateFormat = "dd/MMM/yyyy:HH:mm:ss Z";
922-
923-
/**
924-
* Locale of the request log.
925-
*/
926-
private Locale locale;
927-
928-
/**
929-
* Timezone of the request log.
930-
*/
931-
private TimeZone timeZone = TimeZone.getTimeZone("GMT");
932-
933-
/**
934-
* Enable logging of the request cookies.
935-
*/
936-
private boolean logCookies;
937-
938-
/**
939-
* Enable logging of the request hostname.
940-
*/
941-
private boolean logServer;
942-
943-
/**
944-
* Enable logging of request processing time.
945-
*/
946-
private boolean logLatency;
947-
948-
/**
949-
* Whether to log IP address from the "X-Forwarded-For" header rather than the
950-
* one from the connection.
951-
*/
952-
private boolean preferProxiedForAddress = false;
953-
954922
/**
955923
* Request paths that should not be logged.
956924
*/
@@ -964,6 +932,22 @@ public void setEnabled(boolean enabled) {
964932
this.enabled = enabled;
965933
}
966934

935+
public FORMAT getFormat() {
936+
return this.format;
937+
}
938+
939+
public void setFormat(FORMAT format) {
940+
this.format = format;
941+
}
942+
943+
public String getCustomFormat() {
944+
return this.customFormat;
945+
}
946+
947+
public void setCustomFormat(String customFormat) {
948+
this.customFormat = customFormat;
949+
}
950+
967951
public String getFilename() {
968952
return this.filename;
969953
}
@@ -996,76 +980,30 @@ public void setAppend(boolean append) {
996980
this.append = append;
997981
}
998982

999-
public boolean isExtendedFormat() {
1000-
return this.extendedFormat;
1001-
}
1002-
1003-
public void setExtendedFormat(boolean extendedFormat) {
1004-
this.extendedFormat = extendedFormat;
1005-
}
1006-
1007-
public String getDateFormat() {
1008-
return this.dateFormat;
1009-
}
1010-
1011-
public void setDateFormat(String dateFormat) {
1012-
this.dateFormat = dateFormat;
1013-
}
1014-
1015-
public Locale getLocale() {
1016-
return this.locale;
1017-
}
1018-
1019-
public void setLocale(Locale locale) {
1020-
this.locale = locale;
1021-
}
1022-
1023-
public TimeZone getTimeZone() {
1024-
return this.timeZone;
1025-
}
1026-
1027-
public void setTimeZone(TimeZone timeZone) {
1028-
this.timeZone = timeZone;
1029-
}
1030-
1031-
public boolean isLogCookies() {
1032-
return this.logCookies;
1033-
}
1034-
1035-
public void setLogCookies(boolean logCookies) {
1036-
this.logCookies = logCookies;
1037-
}
1038-
1039-
public boolean isLogServer() {
1040-
return this.logServer;
1041-
}
1042-
1043-
public void setLogServer(boolean logServer) {
1044-
this.logServer = logServer;
1045-
}
1046-
1047-
public boolean isLogLatency() {
1048-
return this.logLatency;
983+
public List<String> getIgnorePaths() {
984+
return this.ignorePaths;
1049985
}
1050986

1051-
public void setLogLatency(boolean logLatency) {
1052-
this.logLatency = logLatency;
987+
public void setIgnorePaths(List<String> ignorePaths) {
988+
this.ignorePaths = ignorePaths;
1053989
}
1054990

1055-
public boolean isPreferProxiedForAddress() {
1056-
return this.preferProxiedForAddress;
1057-
}
991+
/**
992+
* Log format for Jetty access logs.
993+
*/
994+
public enum FORMAT {
1058995

1059-
public void setPreferProxiedForAddress(boolean preferProxiedForAddress) {
1060-
this.preferProxiedForAddress = preferProxiedForAddress;
1061-
}
996+
/**
997+
* NCSA format, as defined in CustomRequestLog#NCSA_FORMAT.
998+
*/
999+
NCSA,
10621000

1063-
public List<String> getIgnorePaths() {
1064-
return this.ignorePaths;
1065-
}
1001+
/**
1002+
* Extended NCSA format, as defined in
1003+
* CustomRequestLog#EXTENDED_NCSA_FORMAT.
1004+
*/
1005+
EXTENDED_NCSA
10661006

1067-
public void setIgnorePaths(List<String> ignorePaths) {
1068-
this.ignorePaths = ignorePaths;
10691007
}
10701008

10711009
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/embedded/JettyWebServerFactoryCustomizer.java

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,10 @@
2121

2222
import org.eclipse.jetty.server.AbstractConnector;
2323
import org.eclipse.jetty.server.ConnectionFactory;
24+
import org.eclipse.jetty.server.CustomRequestLog;
2425
import org.eclipse.jetty.server.Handler;
2526
import org.eclipse.jetty.server.HttpConfiguration;
26-
import org.eclipse.jetty.server.NCSARequestLog;
27+
import org.eclipse.jetty.server.RequestLogWriter;
2728
import org.eclipse.jetty.server.Server;
2829
import org.eclipse.jetty.server.handler.ContextHandler;
2930
import org.eclipse.jetty.server.handler.HandlerCollection;
@@ -149,36 +150,35 @@ else if (handler instanceof HandlerCollection) {
149150
private void customizeAccessLog(ConfigurableJettyWebServerFactory factory,
150151
ServerProperties.Jetty.Accesslog properties) {
151152
factory.addServerCustomizers((server) -> {
152-
NCSARequestLog log = new NCSARequestLog();
153+
RequestLogWriter logWriter = new RequestLogWriter();
154+
String format = getLogFormat(properties);
155+
CustomRequestLog log = new CustomRequestLog(logWriter, format);
156+
if (!CollectionUtils.isEmpty(properties.getIgnorePaths())) {
157+
log.setIgnorePaths(properties.getIgnorePaths().toArray(new String[0]));
158+
}
153159
if (properties.getFilename() != null) {
154-
log.setFilename(properties.getFilename());
160+
logWriter.setFilename(properties.getFilename());
155161
}
156162
if (properties.getFileDateFormat() != null) {
157-
log.setFilenameDateFormat(properties.getFileDateFormat());
158-
}
159-
log.setRetainDays(properties.getRetentionPeriod());
160-
log.setAppend(properties.isAppend());
161-
log.setExtended(properties.isExtendedFormat());
162-
if (properties.getDateFormat() != null) {
163-
log.setLogDateFormat(properties.getDateFormat());
164-
}
165-
if (properties.getLocale() != null) {
166-
log.setLogLocale(properties.getLocale());
167-
}
168-
if (properties.getTimeZone() != null) {
169-
log.setLogTimeZone(properties.getTimeZone().getID());
170-
}
171-
log.setLogCookies(properties.isLogCookies());
172-
log.setLogServer(properties.isLogServer());
173-
log.setLogLatency(properties.isLogLatency());
174-
log.setPreferProxiedForAddress(properties.isPreferProxiedForAddress());
175-
if (!CollectionUtils.isEmpty(properties.getIgnorePaths())) {
176-
log.setIgnorePaths(properties.getIgnorePaths().toArray(new String[0]));
163+
logWriter.setFilenameDateFormat(properties.getFileDateFormat());
177164
}
165+
logWriter.setRetainDays(properties.getRetentionPeriod());
166+
logWriter.setAppend(properties.isAppend());
178167
server.setRequestLog(log);
179168
});
180169
}
181170

171+
private String getLogFormat(ServerProperties.Jetty.Accesslog properties) {
172+
if (properties.getCustomFormat() != null) {
173+
return properties.getCustomFormat();
174+
}
175+
else if (ServerProperties.Jetty.Accesslog.FORMAT.EXTENDED_NCSA
176+
.equals(properties.getFormat())) {
177+
return CustomRequestLog.EXTENDED_NCSA_FORMAT;
178+
}
179+
return CustomRequestLog.NCSA_FORMAT;
180+
}
181+
182182
private static class MaxHttpHeaderSizeCustomizer implements JettyServerCustomizer {
183183

184184
private final int maxHttpHeaderSize;

spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,55 @@
2929
"level": "error"
3030
}
3131
},
32+
{
33+
"name": "server.jetty.accesslog.date-format",
34+
"deprecation": {
35+
"replacement": "server.jetty.accesslog.custom-format",
36+
"level": "error"
37+
}
38+
},
39+
{
40+
"name": "server.jetty.accesslog.extended-format",
41+
"deprecation": {
42+
"replacement": "server.jetty.accesslog.format",
43+
"level": "error"
44+
}
45+
},
46+
{
47+
"name": "server.jetty.accesslog.locale",
48+
"deprecation": {
49+
"replacement": "server.jetty.accesslog.custom-format",
50+
"level": "error"
51+
}
52+
},
53+
{
54+
"name": "server.jetty.accesslog.log-cookies",
55+
"deprecation": {
56+
"replacement": "server.jetty.accesslog.custom-format",
57+
"level": "error"
58+
}
59+
},
60+
{
61+
"name": "server.jetty.accesslog.log-latency",
62+
"deprecation": {
63+
"replacement": "server.jetty.accesslog.custom-format",
64+
"level": "error"
65+
}
66+
},
67+
{
68+
"name": "server.jetty.accesslog.log-server",
69+
"deprecation": {
70+
"replacement": "server.jetty.accesslog.custom-format",
71+
"level": "error"
72+
}
73+
},
74+
{
75+
"name": "server.jetty.accesslog.time-zone",
76+
"deprecation": {
77+
"replacement": "server.jetty.accesslog.custom-format",
78+
"level": "error"
79+
}
80+
},
3281
{
3382
"name": "server.compression.enabled",
3483
"description": "Whether response compression is enabled.",

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/web/ServerPropertiesTests.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ public void testCustomizeJettyAccessLog() {
231231
map.put("server.jetty.accesslog.file-date-format", "yyyymmdd");
232232
map.put("server.jetty.accesslog.retention-period", "4");
233233
map.put("server.jetty.accesslog.append", "true");
234-
map.put("server.jetty.accesslog.prefer-proxied-for-address", "true");
234+
map.put("server.jetty.accesslog.custom-format", "{client}a - %u %t \"%r\" %s %O");
235235
map.put("server.jetty.accesslog.ignore-paths", "/a/path,/b/path");
236236
bind(map);
237237
ServerProperties.Jetty jetty = this.properties.getJetty();
@@ -240,7 +240,8 @@ public void testCustomizeJettyAccessLog() {
240240
assertThat(jetty.getAccesslog().getFileDateFormat()).isEqualTo("yyyymmdd");
241241
assertThat(jetty.getAccesslog().getRetentionPeriod()).isEqualTo(4);
242242
assertThat(jetty.getAccesslog().isAppend()).isTrue();
243-
assertThat(jetty.getAccesslog().isPreferProxiedForAddress()).isTrue();
243+
assertThat(jetty.getAccesslog().getCustomFormat())
244+
.isEqualTo("{client}a - %u %t \"%r\" %s %O");
244245
assertThat(jetty.getAccesslog().getIgnorePaths()).containsExactly("/a/path",
245246
"/b/path");
246247
}

0 commit comments

Comments
 (0)