49
49
import eu .cloudnetservice .node .config .Configuration ;
50
50
import eu .cloudnetservice .node .impl .command .source .DriverCommandSource ;
51
51
import eu .cloudnetservice .node .impl .config .JsonConfiguration ;
52
+ import eu .cloudnetservice .node .impl .log .QueuedConsoleLogAppender ;
52
53
import eu .cloudnetservice .node .service .CloudServiceManager ;
53
54
import eu .cloudnetservice .utils .base .StringUtil ;
54
55
import eu .cloudnetservice .utils .base .concurrent .TaskUtil ;
57
58
import jakarta .inject .Singleton ;
58
59
import jakarta .validation .Valid ;
59
60
import java .nio .charset .StandardCharsets ;
61
+ import java .util .Locale ;
60
62
import java .util .Map ;
61
63
import java .util .concurrent .atomic .AtomicInteger ;
62
64
import java .util .concurrent .atomic .AtomicReference ;
@@ -77,6 +79,7 @@ public final class V3HttpHandlerNode {
77
79
private final NodeServerProvider nodeServerProvider ;
78
80
private final CloudServiceManager cloudServiceManager ;
79
81
private final ServiceTaskProvider serviceTaskProvider ;
82
+ private final QueuedConsoleLogAppender consoleLogAppender ;
80
83
private final GroupConfigurationProvider groupConfigurationProvider ;
81
84
82
85
@ Inject
@@ -90,6 +93,7 @@ public V3HttpHandlerNode(
90
93
@ NonNull NodeServerProvider nodeServerProvider ,
91
94
@ NonNull CloudServiceManager cloudServiceManager ,
92
95
@ NonNull ServiceTaskProvider serviceTaskProvider ,
96
+ @ NonNull QueuedConsoleLogAppender consoleLogAppender ,
93
97
@ NonNull GroupConfigurationProvider groupConfigurationProvider
94
98
) {
95
99
this .logger = logger ;
@@ -101,6 +105,7 @@ public V3HttpHandlerNode(
101
105
this .nodeServerProvider = nodeServerProvider ;
102
106
this .cloudServiceManager = cloudServiceManager ;
103
107
this .serviceTaskProvider = serviceTaskProvider ;
108
+ this .consoleLogAppender = consoleLogAppender ;
104
109
this .groupConfigurationProvider = groupConfigurationProvider ;
105
110
}
106
111
@@ -211,6 +216,28 @@ public V3HttpHandlerNode(
211
216
return HttpResponseCode .SWITCHING_PROTOCOLS ;
212
217
}
213
218
219
+ @ RequestHandler (path = "/api/v3/node/logLines" )
220
+ @ Authentication (providers = "jwt" , scopes = {"cloudnet_rest:node_read" , "cloudnet_rest:node_log_lines" })
221
+ public @ NonNull IntoResponse <?> handleLogLinesRequest (
222
+ @ NonNull @ Optional @ FirstRequestQueryParam (value = "format" , def = "raw" ) String formatType
223
+ ) {
224
+ return switch (formatType .toLowerCase (Locale .ROOT )) {
225
+ case "raw" -> {
226
+ var lines = this .consoleLogAppender .cachedLogEntries ().stream ()
227
+ .map (ILoggingEvent ::getFormattedMessage )
228
+ .toList ();
229
+ yield JsonResponse .builder ().body (Map .of ("lines" , lines ));
230
+ }
231
+ case "ansi" -> JsonResponse .builder ().body (Map .of ("lines" , this .consoleLogAppender .formattedCachedLogLines ()));
232
+ default -> ProblemDetail .builder ()
233
+ .type ("console-invalid-formatting-type" )
234
+ .title ("Console Invalid Formatting Type" )
235
+ .status (HttpResponseCode .BAD_REQUEST )
236
+ .detail ("The cached log lines do not support the format " + formatType )
237
+ .build ();
238
+ };
239
+ }
240
+
214
241
private void reloadConfig () {
215
242
this .configuration .reloadFrom (JsonConfiguration .loadFromFile ());
216
243
this .serviceTaskProvider .reload ();
0 commit comments