22
22
import com .mongodb .connection .ClusterId ;
23
23
import com .mongodb .connection .ConnectionDescription ;
24
24
import com .mongodb .event .CommandListener ;
25
- import com .mongodb .internal .logging .StructuredLogMessage ;
26
- import com .mongodb .internal .logging .StructuredLogMessage .Entry ;
25
+ import com .mongodb .internal .logging .LogMessage ;
26
+ import com .mongodb .internal .logging .LogMessage .Entry ;
27
27
import com .mongodb .internal .logging .StructuredLogger ;
28
28
import com .mongodb .lang .Nullable ;
29
29
import org .bson .BsonDocument ;
33
33
import org .bson .json .JsonMode ;
34
34
import org .bson .json .JsonWriter ;
35
35
import org .bson .json .JsonWriterSettings ;
36
- import org .bson .types .ObjectId ;
37
36
38
37
import java .io .StringWriter ;
38
+
39
39
import java .util .ArrayList ;
40
40
import java .util .List ;
41
41
import java .util .Set ;
42
+ import java .util .function .Consumer ;
42
43
43
44
import static com .mongodb .assertions .Assertions .assertNotNull ;
44
45
import static com .mongodb .internal .connection .ProtocolHelper .sendCommandFailedEvent ;
45
46
import static com .mongodb .internal .connection .ProtocolHelper .sendCommandStartedEvent ;
46
47
import static com .mongodb .internal .connection .ProtocolHelper .sendCommandSucceededEvent ;
47
- import static com .mongodb .internal .logging .StructuredLogMessage .Component .COMMAND ;
48
- import static com .mongodb .internal .logging .StructuredLogMessage .Level .DEBUG ;
48
+ import static com .mongodb .internal .logging .LogMessage .Component .COMMAND ;
49
+ import static com .mongodb .internal .logging .LogMessage .Entry .Name .COMMAND_CONTENT ;
50
+ import static com .mongodb .internal .logging .LogMessage .Entry .Name .COMMAND_NAME ;
51
+ import static com .mongodb .internal .logging .LogMessage .Entry .Name .DATABASE_NAME ;
52
+ import static com .mongodb .internal .logging .LogMessage .Entry .Name .DRIVER_CONNECTION_ID ;
53
+ import static com .mongodb .internal .logging .LogMessage .Entry .Name .DURATION_MS ;
54
+ import static com .mongodb .internal .logging .LogMessage .Entry .Name .OPERATION_ID ;
55
+ import static com .mongodb .internal .logging .LogMessage .Entry .Name .REPLY ;
56
+ import static com .mongodb .internal .logging .LogMessage .Entry .Name .REQUEST_ID ;
57
+ import static com .mongodb .internal .logging .LogMessage .Entry .Name .SERVER_CONNECTION_ID ;
58
+ import static com .mongodb .internal .logging .LogMessage .Entry .Name .SERVER_HOST ;
59
+ import static com .mongodb .internal .logging .LogMessage .Entry .Name .SERVER_PORT ;
60
+ import static com .mongodb .internal .logging .LogMessage .Entry .Name .SERVICE_ID ;
61
+ import static com .mongodb .internal .logging .LogMessage .Level .DEBUG ;
49
62
50
63
class LoggingCommandEventSender implements CommandEventSender {
51
64
private static final double NANOS_PER_MILLI = 1_000_000.0d ;
52
-
53
65
private final ConnectionDescription description ;
54
- @ Nullable private final CommandListener commandListener ;
66
+ @ Nullable
67
+ private final CommandListener commandListener ;
55
68
private final RequestContext requestContext ;
56
69
private final OperationContext operationContext ;
57
70
private final StructuredLogger logger ;
@@ -84,17 +97,14 @@ class LoggingCommandEventSender implements CommandEventSender {
84
97
@ Override
85
98
public void sendStartedEvent () {
86
99
if (loggingRequired ()) {
87
- List <Entry > entries = new ArrayList <>();
88
- StringBuilder builder = new StringBuilder ("Command \" %s\" started on database %s" );
89
- entries .add (new Entry ("commandName" , commandName ));
90
- entries .add (new Entry ("databaseName" , message .getNamespace ().getDatabaseName ()));
91
-
92
- appendCommonLogFragment (entries , builder );
93
-
94
- builder .append (" Command: %s" );
95
- entries .add (new Entry ("command" , redactionRequired ? "{}" : getTruncatedJsonCommand (commandDocument )));
96
-
97
- logger .log (new StructuredLogMessage (COMMAND , DEBUG , "Command started" , getClusterId (), entries ), builder .toString ());
100
+ String messagePrefix = "Command \" {}\" started on database {}" ;
101
+ String command = redactionRequired ? "{}" : getTruncatedJsonCommand (commandDocument );
102
+
103
+ logEventMessage (messagePrefix , "Command started" , null , entries -> {
104
+ entries .add (new Entry (COMMAND_NAME , commandName ));
105
+ entries .add (new Entry (DATABASE_NAME , message .getNamespace ().getDatabaseName ()));
106
+ },
107
+ entries -> entries .add (new Entry (COMMAND_CONTENT , command )));
98
108
}
99
109
100
110
if (eventRequired ()) {
@@ -121,15 +131,14 @@ public void sendFailedEvent(final Throwable t) {
121
131
long elapsedTimeNanos = System .nanoTime () - startTimeNanos ;
122
132
123
133
if (loggingRequired ()) {
124
- List <Entry > entries = new ArrayList <>();
125
- StringBuilder builder = new StringBuilder ("Command \" %s\" failed in %.2f ms" );
126
- entries .add (new Entry ("commandName" , commandName ));
127
- entries .add (new Entry ("durationMS" , elapsedTimeNanos / NANOS_PER_MILLI ));
128
-
129
- appendCommonLogFragment (entries , builder );
130
-
131
- logger .log (new StructuredLogMessage (COMMAND , DEBUG , "Command failed" , getClusterId (), commandEventException , entries ),
132
- builder .toString ());
134
+ String messagePrefix = "Command \" {}\" failed in {} ms" ;
135
+
136
+ logEventMessage (messagePrefix , "Command failed" , commandEventException ,
137
+ entries -> {
138
+ entries .add (new Entry (COMMAND_NAME , commandName ));
139
+ entries .add (new Entry (DURATION_MS , elapsedTimeNanos / NANOS_PER_MILLI ));
140
+ },
141
+ entries -> entries .add (new Entry (COMMAND_CONTENT , null )));
133
142
}
134
143
135
144
if (eventRequired ()) {
@@ -152,20 +161,19 @@ private void sendSucceededEvent(final BsonDocument reply) {
152
161
long elapsedTimeNanos = System .nanoTime () - startTimeNanos ;
153
162
154
163
if (loggingRequired ()) {
155
- List <Entry > entries = new ArrayList <>();
156
- StringBuilder builder = new StringBuilder ("Command \" %s\" succeeded in %.2f ms" );
157
- entries .add (new Entry ("commandName" , commandName ));
158
- entries .add (new Entry ("durationMS" , elapsedTimeNanos / NANOS_PER_MILLI ));
164
+ String format = "Command \" {}\" succeeded in {} ms using a connection with driver-generated ID {}"
165
+ + "[ and server-generated ID {}] to {}:{}[ with service ID {}]. The request ID is {}"
166
+ + " and the operation ID is {}. Command reply: {}" ;
159
167
160
- appendCommonLogFragment (entries , builder );
161
-
162
- builder .append (" Command reply: %s" );
163
168
BsonDocument responseDocumentForEvent = redactionRequired ? new BsonDocument () : reply ;
164
169
String replyString = redactionRequired ? "{}" : getTruncatedJsonCommand (responseDocumentForEvent );
165
- entries .add (new Entry ("reply" , replyString ));
166
170
167
- logger .log (new StructuredLogMessage (COMMAND , DEBUG , "Command succeeded" , getClusterId (), entries ),
168
- builder .toString ());
171
+ logEventMessage ("Command succeeded" , null ,
172
+ entries -> {
173
+ entries .add (new Entry (COMMAND_NAME , commandName ));
174
+ entries .add (new Entry (DURATION_MS , elapsedTimeNanos / NANOS_PER_MILLI ));
175
+ },
176
+ entries -> entries .add (new Entry (REPLY , replyString )), format );
169
177
}
170
178
171
179
if (eventRequired ()) {
@@ -188,29 +196,30 @@ private boolean eventRequired() {
188
196
return commandListener != null ;
189
197
}
190
198
191
- private void appendCommonLogFragment (final List <Entry > entries , final StringBuilder builder ) {
192
- builder .append (" using a connection with driver-generated ID %d" );
193
- entries .add (new Entry ("driverConnectionId" , description .getConnectionId ().getLocalValue ()));
194
-
195
- Integer connectionServerValue = description .getConnectionId ().getServerValue ();
196
- if (connectionServerValue != null ) {
197
- builder .append (" and server-generated ID %d" );
198
- entries .add (new Entry ("serverConnectionId" , connectionServerValue ));
199
- }
200
-
201
- builder .append (" to %s:%s" );
202
- entries .add (new Entry ("serverHost" , description .getServerAddress ().getHost ()));
203
- entries .add (new Entry ("serverPort" , description .getServerAddress ().getPort ()));
204
-
205
- ObjectId descriptionServiceId = description .getServiceId ();
206
- if (descriptionServiceId != null ) {
207
- builder .append (" with service ID %s" );
208
- entries .add (new Entry ("serviceId" , descriptionServiceId ));
209
- }
199
+ private void logEventMessage (final String messagePrefix , final String messageId , @ Nullable final Throwable exception ,
200
+ final Consumer <List <Entry >> prefixEntriesMutator ,
201
+ final Consumer <List <Entry >> suffixEntriesMutator ) {
202
+ String format = messagePrefix + " using a connection with driver-generated ID {}"
203
+ + "[ and server-generated ID {}] to {}:{}[ with service ID {}]. The request ID is {}"
204
+ + " and the operation ID is {}.[ Command: {}]" ;
205
+ logEventMessage (messageId , exception , prefixEntriesMutator , suffixEntriesMutator , format );
206
+ }
210
207
211
- builder .append (". The request ID is %s and the operation ID is %s." );
212
- entries .add (new Entry ("requestId" , message .getId ()));
213
- entries .add (new Entry ("operationId" , operationContext .getId ()));
208
+ private void logEventMessage (final String messageId , final @ Nullable Throwable exception ,
209
+ final Consumer <List <Entry >> prefixEntriesMutator ,
210
+ final Consumer <List <Entry >> suffixEntriesMutator ,
211
+ final String format ) {
212
+ List <Entry > entries = new ArrayList <>();
213
+ prefixEntriesMutator .accept (entries );
214
+ entries .add (new Entry (DRIVER_CONNECTION_ID , description .getConnectionId ().getLocalValue ()));
215
+ entries .add (new Entry (SERVER_CONNECTION_ID , description .getConnectionId ().getServerValue ()));
216
+ entries .add (new Entry (SERVER_HOST , description .getServerAddress ().getHost ()));
217
+ entries .add (new Entry (SERVER_PORT , description .getServerAddress ().getPort ()));
218
+ entries .add (new Entry (SERVICE_ID , description .getServiceId ()));
219
+ entries .add (new Entry (REQUEST_ID , message .getId ()));
220
+ entries .add (new Entry (OPERATION_ID , operationContext .getId ()));
221
+ suffixEntriesMutator .accept (entries );
222
+ logger .log (new LogMessage (COMMAND , DEBUG , messageId , getClusterId (), exception , entries , format ));
214
223
}
215
224
216
225
private String getTruncatedJsonCommand (final BsonDocument commandDocument ) {
0 commit comments