4
4
import static io .vertx .core .http .HttpMethod .POST ;
5
5
6
6
import java .util .Objects ;
7
-
8
7
import java .util .concurrent .ConcurrentHashMap ;
8
+
9
9
import org .jboss .logmanager .LogContext ;
10
10
11
11
import io .vertx .core .Handler ;
@@ -22,9 +22,19 @@ public class LoggerHandler implements Handler<RoutingContext> {
22
22
private static final String LOGGER_NAME_PARAM = "loggerName" ;
23
23
private static final String LOGGER_LEVEL_PARAM = "loggerLevel" ;
24
24
private static final String LOGGER_DURATION = "duration" ;
25
+ private static final String TEMPORARY_ENABLED = "temporary" ;
26
+
27
+ private final ConcurrentHashMap <String , TemporaryLogState > temporaryStates = new ConcurrentHashMap <>();
25
28
26
- private final ConcurrentHashMap <String , Long > activeTimers = new ConcurrentHashMap <>();
29
+ private static class TemporaryLogState {
30
+ final String originalLevel ;
31
+ long timerId ;
27
32
33
+ TemporaryLogState (String originalLevel , long timerId ) {
34
+ this .originalLevel = originalLevel ;
35
+ this .timerId = timerId ;
36
+ }
37
+ }
28
38
29
39
/**
30
40
* Handles incoming HTTP requests by delegating to appropriate method handlers.
@@ -47,8 +57,8 @@ public void handle(RoutingContext routingContext) {
47
57
}
48
58
49
59
/**
50
- * Handles GET requests to retrieve logger information.
51
- * Returns all loggers if no logger name is specified, or details for a specific logger.
60
+ * Handles GET requests to retrieve logger information. Returns all loggers if no logger name is specified, or
61
+ * details for a specific logger.
52
62
*
53
63
* @param request The HTTP request
54
64
* @param response The HTTP response
@@ -65,8 +75,8 @@ private void handleGet(HttpServerRequest request, HttpServerResponse response) {
65
75
}
66
76
67
77
/**
68
- * Handles POST requests to update logger levels.
69
- * Updates the specified logger with the provided level or removes the level if none specified.
78
+ * Handles POST requests to update logger levels. Updates the specified logger with the provided level or removes
79
+ * the level if none specified.
70
80
*
71
81
* @param request The HTTP request
72
82
* @param response The HTTP response
@@ -80,9 +90,11 @@ private void handlePost(HttpServerRequest request, HttpServerResponse response,
80
90
81
91
String loggerName = request .getFormAttribute (LOGGER_NAME_PARAM );
82
92
String loggerLevel = request .getFormAttribute (LOGGER_LEVEL_PARAM );
83
- String loggerDuration = request .getFormAttribute (LOGGER_DURATION );
84
93
85
- if (loggerDuration != null && !loggerDuration .isEmpty ()) {
94
+ String temporaryEnabled = request .getParam (TEMPORARY_ENABLED );
95
+
96
+ if ("true" .equalsIgnoreCase (temporaryEnabled )) {
97
+ String loggerDuration = request .getFormAttribute (LOGGER_DURATION );
86
98
handleTemporaryPost (loggerName , loggerLevel , loggerDuration , routingContext , response );
87
99
return ;
88
100
}
@@ -96,6 +108,16 @@ private void handlePost(HttpServerRequest request, HttpServerResponse response,
96
108
response .setStatusCode (201 ).end ();
97
109
}
98
110
111
+ /**
112
+ * Handles POST requests to update logger levels temporarily. Updates the specified logger to the provided level
113
+ * for a given duration, then restores the original level automatically.
114
+ *
115
+ * @param loggerName The name of the logger to update
116
+ * @param loggerLevel The new temporary log level
117
+ * @param loggerDuration Duration in seconds for which the temporary level should apply
118
+ * @param routingContext The Vert.x routing context
119
+ * @param response The HTTP response
120
+ */
99
121
private void handleTemporaryPost (
100
122
String loggerName ,
101
123
String loggerLevel ,
@@ -104,50 +126,49 @@ private void handleTemporaryPost(
104
126
HttpServerResponse response ) {
105
127
106
128
if (loggerLevel == null || !LogController .LEVELS .contains (loggerLevel .toUpperCase ())) {
107
- response .setStatusCode (400 ).end ("Invalid Logger level" );
129
+ response .setStatusCode (400 ).end ("{ \" error \" : \" Invalid logger level\" } " );
108
130
return ;
109
131
}
110
132
111
133
if (!LogController .doesLoggerExist (loggerName )) {
112
- response .setStatusCode (404 ).end ("Logger '" + loggerName + "' not found. " );
134
+ response .setStatusCode (404 ).end ("{ \" error \" : \" Logger '" + loggerName + "' not found\" } " );
113
135
return ;
114
136
}
115
137
116
138
int durationSeconds ;
117
-
118
139
try {
119
140
durationSeconds = Integer .parseInt (loggerDuration );
141
+ if (durationSeconds <= 0 )
142
+ throw new NumberFormatException ();
120
143
} catch (NumberFormatException e ) {
121
- response .setStatusCode (400 ).end ("Invalid duration " );
144
+ response .setStatusCode (400 ).end ("{ \" error \" : \" Duration must be a positive integer \" } " );
122
145
return ;
123
146
}
124
147
125
- if (durationSeconds <= 0 ) {
126
- response .setStatusCode (400 ).end ("Duration must be positive" );
148
+ String currentLevel = LogController .getConfiguredLogLevel (LogContext .getLogContext ().getLogger (loggerName ));
149
+ TemporaryLogState previousState = temporaryStates .get (loggerName );
150
+
151
+ if (loggerLevel .equalsIgnoreCase (currentLevel ) && previousState == null ) {
152
+ response .setStatusCode (200 ).end ("{\" message\" :\" Log level already set to " + loggerLevel + "\" }" );
127
153
return ;
128
154
}
129
155
130
- String oldLevel = LogController .getConfiguredLogLevel (
131
- LogContext .getLogContext ().getLogger (loggerName ));
132
-
133
- if (oldLevel != null && oldLevel .equalsIgnoreCase (loggerLevel )) {
134
- response .setStatusCode (200 ).end ("Log level already set to " + loggerLevel );
135
- return ;
156
+ if (previousState != null ) {
157
+ routingContext .vertx ().cancelTimer (previousState .timerId );
136
158
}
137
159
138
- LogController . updateLogLevel ( loggerName , loggerLevel ) ;
160
+ String originalLevel = previousState != null ? previousState . originalLevel : currentLevel ;
139
161
140
- Long previousTimerId = activeTimers .put (loggerName , null );
141
- if (previousTimerId != null ) {
142
- routingContext .vertx ().cancelTimer (previousTimerId );
143
- }
162
+ LogController .updateLogLevel (loggerName , loggerLevel );
144
163
145
164
long timerId = routingContext .vertx ().setTimer (durationSeconds * 1000L , id -> {
146
- LogController .updateLogLevel (loggerName , oldLevel );
147
- activeTimers .remove (loggerName , id );
165
+ LogController .updateLogLevel (loggerName , originalLevel );
166
+ temporaryStates .remove (loggerName );
148
167
});
149
168
150
- activeTimers .put (loggerName , timerId );
151
- response .setStatusCode (201 ).end ("Temporary log level set for " + durationSeconds + " seconds" );
169
+ temporaryStates .put (loggerName , new TemporaryLogState (originalLevel , timerId ));
170
+
171
+ response .setStatusCode (201 )
172
+ .end ("{\" message\" :\" Temporary log level '" + loggerLevel + "' set for " + durationSeconds + " seconds\" }" );
152
173
}
153
174
}
0 commit comments