下面列出了怎么用org.apache.logging.log4j.message.StructuredDataMessage的API类实例代码及写法,或者点击链接到github查看源代码。
public Message convertEvent(final String message, final Object[] objects, final Throwable throwable) {
try {
final EventData data = objects != null && objects[0] instanceof EventData ?
(EventData) objects[0] : new EventData(message);
final StructuredDataMessage msg =
new StructuredDataMessage(data.getEventId(), data.getMessage(), data.getEventType());
for (final Map.Entry<String, Object> entry : data.getEventMap().entrySet()) {
final String key = entry.getKey();
if (EventData.EVENT_TYPE.equals(key) || EventData.EVENT_ID.equals(key)
|| EventData.EVENT_MESSAGE.equals(key)) {
continue;
}
msg.put(key, String.valueOf(entry.getValue()));
}
return msg;
} catch (final Exception ex) {
return new ParameterizedMessage(message, objects, throwable);
}
}
@Test
public void testMultiple() throws IOException {
for (int i = 0; i < 10; ++i) {
final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Multiple " + i, "Test");
EventLogger.logEvent(msg);
}
for (int i = 0; i < 10; ++i) {
final Event event = primary.poll();
Assert.assertNotNull(event);
final String body = getBody(event);
final String expected = "Test Multiple " + i;
Assert.assertTrue("Channel contained event, but not expected message. Received: " + body,
body.endsWith(expected));
}
}
@Test
public void testMultiple() throws IOException {
for (int i = 0; i < 10; ++i) {
final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Multiple " + i, "Test");
EventLogger.logEvent(msg);
}
for (int i = 0; i < 10; ++i) {
final Event event = primary.poll();
Assert.assertNotNull("Event should not be null", event);
final String body = getBody(event);
final String expected = "Test Multiple " + i;
Assert.assertTrue("Channel contained event, but not expected message. Received: " + body,
body.endsWith(expected));
}
}
@Test
public void testMultiple() {
for (int i = 0; i < 10; ++i) {
final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Multiple " + i, "Test");
msg.put("counter", Integer.toString(i));
EventLogger.logEvent(msg);
}
final boolean[] fields = new boolean[10];
for (int i = 0; i < 10; ++i) {
final Event event = primary.poll();
Assert.assertNotNull("Received " + i + " events. Event " + (i + 1) + " is null", event);
final String value = event.getHeaders().get("counter");
Assert.assertNotNull("Missing 'counter' in map " + event.getHeaders() + ", i = " + i, value);
final int counter = Integer.parseInt(value);
if (fields[counter]) {
Assert.fail("Duplicate event");
} else {
fields[counter] = true;
}
}
for (int i = 0; i < 10; ++i) {
Assert.assertTrue("Channel contained event, but not expected message " + i, fields[i]);
}
}
@Test
public void testStructuredDataMessageLookup() {
// GIVEN: A StructuredDataMessage object
final StructuredDataMessage message = new StructuredDataMessage("id", "msg", "type");
message.put("A", "a");
message.put("B", "b");
message.put("C", "c");
// AND: An event with that message
final LogEvent event = Log4jLogEvent.newBuilder().setLevel(Level.DEBUG).setMessage(message).build();
// AND: A MapMessageLookup object
final MapMessageLookup lookup = new MapMessageLookup();
// WHEN: Lookup is performed
final String a = lookup.lookup(event, "A");
final String b = lookup.lookup(event, "B");
final String c = lookup.lookup(event, "C");
// THEN: The looked up values are correct
assertEquals("a", a);
assertEquals("b", b);
assertEquals("c", c);
}
protected Result filter(final StructuredDataMessage message) {
boolean match = false;
final IndexedReadOnlyStringMap map = getStringMap();
for (int i = 0; i < map.size(); i++) {
final StringBuilder toMatch = getValue(message, map.getKeyAt(i));
if (toMatch != null) {
match = listContainsValue((List<String>) map.getValueAt(i), toMatch);
} else {
match = false;
}
if ((!isAnd() && match) || (isAnd() && !match)) {
break;
}
}
return match ? onMatch : onMismatch;
}
private StringBuilder getValue(final StructuredDataMessage data, final String key) {
final StringBuilder sb = getStringBuilder();
if (key.equalsIgnoreCase("id")) {
data.getId().formatTo(sb);
return sb;
} else if (key.equalsIgnoreCase("id.name")) {
return appendOrNull(data.getId().getName(), sb);
} else if (key.equalsIgnoreCase("type")) {
return appendOrNull(data.getType(), sb);
} else if (key.equalsIgnoreCase("message")) {
data.formatTo(sb);
return sb;
} else {
return appendOrNull(data.get(key), sb);
}
}
private void appendMessage(final StringBuilder buffer, final LogEvent event) {
final Message message = event.getMessage();
// This layout formats StructuredDataMessages instead of delegating to the Message itself.
final String text = (message instanceof StructuredDataMessage || message instanceof MessageCollectionMessage)
? message.getFormat() : message.getFormattedMessage();
if (text != null && text.length() > 0) {
buffer.append(' ').append(escapeNewlines(text, escapeNewLine));
}
if (exceptionFormatters != null && event.getThrown() != null) {
final StringBuilder exception = new StringBuilder(LF);
for (final PatternFormatter formatter : exceptionFormatters) {
formatter.format(event, exception);
}
buffer.append(escapeNewlines(exception.toString(), escapeNewLine));
}
if (includeNewLine) {
buffer.append(LF);
}
}
@Test
public void rewriteTest() {
final StructuredDataMessage msg = new StructuredDataMessage("Test", "This is a test", "Service");
msg.put("Key1", "Value1");
msg.put("Key2", "Value2");
EventLogger.logEvent(msg);
final List<LogEvent> list = app.getEvents();
assertNotNull("No events generated", list);
assertTrue("Incorrect number of events. Expected 1, got " + list.size(), list.size() == 1);
final LogEvent event = list.get(0);
final Message m = event.getMessage();
assertTrue("Message is not a StringMapMessage: " + m.getClass(), m instanceof StructuredDataMessage);
final StructuredDataMessage message = (StructuredDataMessage) m;
final Map<String, String> map = message.getData();
assertNotNull("No Map", map);
assertTrue("Incorrect number of map entries, expected 3 got " + map.size(), map.size() == 3);
final String value = map.get("Key1");
assertEquals("Apache", value);
}
@Test
public void addTest() {
final MapRewritePolicy addPolicy = MapRewritePolicy.createPolicy("Add", rewrite);
LogEvent rewritten = addPolicy.rewrite(logEvent0);
compareLogEvents(logEvent0, rewritten);
assertEquals("Simple log message changed", logEvent0.getMessage(), rewritten.getMessage());
rewritten = addPolicy.rewrite(logEvent1);
compareLogEvents(logEvent1, rewritten);
checkAdded(((StringMapMessage)rewritten.getMessage()).getData());
rewritten = addPolicy.rewrite(logEvent2);
compareLogEvents(logEvent2, rewritten);
checkAdded(((StructuredDataMessage)rewritten.getMessage()).getData());
rewritten = addPolicy.rewrite(logEvent3);
compareLogEvents(logEvent3, rewritten);
checkAdded(((StringMapMessage)rewritten.getMessage()).getData());
}
@Test
public void updateTest() {
final MapRewritePolicy updatePolicy = MapRewritePolicy.createPolicy("Update", rewrite);
LogEvent rewritten = updatePolicy.rewrite(logEvent0);
compareLogEvents(logEvent0, rewritten);
assertEquals("Simple log message changed", logEvent0.getMessage(), rewritten.getMessage());
rewritten = updatePolicy.rewrite(logEvent1);
compareLogEvents(logEvent1, rewritten);
checkUpdated(((StringMapMessage)rewritten.getMessage()).getData());
rewritten = updatePolicy.rewrite(logEvent2);
compareLogEvents(logEvent2, rewritten);
checkUpdated(((StructuredDataMessage)rewritten.getMessage()).getData());
rewritten = updatePolicy.rewrite(logEvent3);
compareLogEvents(logEvent3, rewritten);
checkUpdated(((StringMapMessage)rewritten.getMessage()).getData());
}
@Test
public void defaultIsAdd() {
final MapRewritePolicy addPolicy = MapRewritePolicy.createPolicy(null, rewrite);
LogEvent rewritten = addPolicy.rewrite(logEvent0);
compareLogEvents(logEvent0, rewritten);
assertEquals("Simple log message changed", logEvent0.getMessage(), rewritten.getMessage());
rewritten = addPolicy.rewrite(logEvent1);
compareLogEvents(logEvent1, rewritten);
checkAdded(((StringMapMessage)rewritten.getMessage()).getData());
rewritten = addPolicy.rewrite(logEvent2);
compareLogEvents(logEvent2, rewritten);
checkAdded(((StructuredDataMessage)rewritten.getMessage()).getData());
rewritten = addPolicy.rewrite(logEvent3);
compareLogEvents(logEvent3, rewritten);
checkAdded(((StringMapMessage)rewritten.getMessage()).getData());
}
@Issue("JENKINS-54088")
@Test
public void testUserCreationAndLoginFromRealm() throws Exception {
assertEventCount(app.getEvents(), 0);
HudsonPrivateSecurityRealm realm = new HudsonPrivateSecurityRealm(false, false, null);
j.jenkins.setSecurityRealm(realm);
User u1 = realm.createAccount("charlie", USERS.get("charlie"));
u1.save();
client.login("charlie", USERS.get("charlie"));
// verify the audit event log messages as user creation and user login events
StructuredDataMessage logMessageOne = (StructuredDataMessage) app.getEvents().get(0).getMessage();
StructuredDataMessage logMessageTwo = (StructuredDataMessage) app.getEvents().get(1).getMessage();
assertTrue(logMessageOne.toString().contains("createUser"));
assertTrue(logMessageTwo.toString().contains("login"));
// verify a login event occurred
client.executeOnServer(() -> {
Authentication a = Jenkins.getAuthentication();
assertEquals("charlie", a.getName());
return null;
});
assertEventCount(app.getEvents(), 2);
}
@Issue("JENKINS-54087")
@Test
public void testValidUsernameInMessageLogged() throws Exception {
assertEventCount(app.getEvents(), 0);
client.login("debbie", "debbie");
logout(client);
StructuredDataMessage logMessage = (StructuredDataMessage) app.getEvents().get(1).getMessage();
assertEventCount(app.getEvents(), 2);
assertTrue(logMessage.toString().contains("logout"));
assertEquals("debbie", logMessage.get("userId"));
}
@Issue("JENKINS-54087")
@Test
public void testValidUsernameInMessageLogged() throws Exception {
assertEventCount(app.getEvents(), 0);
client.login("debbie", "debbie");
StructuredDataMessage logMessage = (StructuredDataMessage) app.getEvents().get(0).getMessage();
assertEventCount(app.getEvents(), 1);
assertTrue(logMessage.toString().contains("login"));
assertEquals("debbie", logMessage.get("userId"));
}
@SuppressWarnings("unchecked")
private void setProperty(Method method, Object[] objects) {
String name = NamingUtils.lowerFirst(NamingUtils.getMethodShortName(method.getName()));
if (objects == null || objects[0] == null) {
throw new IllegalArgumentException("No value to be set for " + name);
}
StringBuilder errors = new StringBuilder();
Annotation[] annotations = method.getDeclaredAnnotations();
for (Annotation annotation : annotations) {
if (annotation instanceof Constraints) {
Constraints constraints = (Constraints) annotation;
validateConstraints(false, constraints.value(), name, objects[0].toString(),
errors);
} else if (annotation instanceof Constraint) {
Constraint constraint = (Constraint) annotation;
constraintPlugins.validateConstraint(false, constraint.constraintType(),
name, objects[0].toString(), constraint.constraintValue(), errors);
}
}
if (errors.length() > 0) {
throw new ConstraintValidationException(errors.toString());
}
String result;
if (objects[0] instanceof List) {
result = StringUtils.join(objects, ", ");
} else if (objects[0] instanceof Map) {
StructuredDataMessage extra = new StructuredDataMessage(name, null, null);
extra.putAll((Map) objects[0]);
msg.addContent(name, extra);
return;
} else {
result = objects[0].toString();
}
msg.put(name, result);
}
@Test
public void structuredData() {
ThreadContext.put("loginId", "JohnDoe");
ThreadContext.put("ipAddress", "192.168.0.120");
ThreadContext.put("locale", Locale.US.getDisplayName());
final StructuredDataMessage msg = new StructuredDataMessage("[email protected]", "Transfer Complete", "Audit");
msg.put("ToAccount", "123456");
msg.put("FromAccount", "123457");
msg.put("Amount", "200.00");
EventLogger.logEvent(msg);
ThreadContext.clearMap();
assertEquals(1, results.size());
final String expected = "EVENT OFF Audit [[email protected] Amount=\"200.00\" FromAccount=\"123457\" ToAccount=\"123456\"] Transfer Complete";
assertThat("Incorrect structured data", results.get(0), startsWith(expected));
}
@Test
public void structuredData() {
ThreadContext.put("loginId", "JohnDoe");
ThreadContext.put("ipAddress", "192.168.0.120");
ThreadContext.put("locale", Locale.US.getDisplayName());
final StructuredDataMessage msg = new StructuredDataMessage("[email protected]", "Transfer Complete", "Transfer");
msg.put("ToAccount", "123456");
msg.put("FromAccount", "123457");
msg.put("Amount", "200.00");
logger.info(MarkerManager.getMarker("EVENT"), msg);
ThreadContext.clearMap();
assertEquals(1, results.size());
assertThat("Incorrect structured data: ", results.get(0), startsWith(
"EVENT INFO Transfer [[email protected] Amount=\"200.00\" FromAccount=\"123457\" ToAccount=\"123456\"] Transfer Complete"));
}
@Test
public void testStructured() throws IOException {
final Agent[] agents = new Agent[] { Agent.createAgent("localhost",
testPort) };
final FlumeAppender avroAppender = FlumeAppender.createAppender(agents,
null, null, "false", "Avro", null, "1000", "1000", "1", "1000",
"avro", "false", null, null, null, "ReqCtx_", null, "true",
"1", null, null, null, null);
avroAppender.start();
final Logger eventLogger = (Logger) LogManager.getLogger("EventLogger");
Assert.assertNotNull(eventLogger);
eventLogger.addAppender(avroAppender);
eventLogger.setLevel(Level.ALL);
final StructuredDataMessage msg = new StructuredDataMessage("Transfer",
"Success", "Audit");
msg.put("memo", "This is a memo");
msg.put("acct", "12345");
msg.put("amount", "100.00");
ThreadContext.put("id", UUID.randomUUID().toString());
ThreadContext.put("memo", null);
ThreadContext.put("test", "123");
EventLogger.logEvent(msg);
final Transaction transaction = channel.getTransaction();
transaction.begin();
final Event event = channel.take();
Assert.assertNotNull(event);
Assert.assertTrue("Channel contained event, but not expected message", getBody(event).endsWith("Success"));
transaction.commit();
transaction.close();
eventSource.stop();
eventLogger.removeAppender(avroAppender);
avroAppender.stop();
}
@Test
public void testLog4Event() throws IOException {
final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Log4j", "Test");
EventLogger.logEvent(msg);
final Event event = primary.poll();
Assert.assertNotNull(event);
final String body = getBody(event);
Assert.assertTrue("Channel contained event, but not expected message. Received: " + body,
body.endsWith("Test Log4j"));
}
@Test
public void testPerformance() throws Exception {
final long start = System.currentTimeMillis();
final int count = 10000;
for (int i = 0; i < count; ++i) {
final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Primary " + i, "Test");
msg.put("counter", Integer.toString(i));
EventLogger.logEvent(msg);
}
final long elapsed = System.currentTimeMillis() - start;
System.out.println("Time to log " + count + " events " + elapsed + "ms");
}
@Test
public void testLog4Event() throws IOException {
final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Log4j", "Test");
EventLogger.logEvent(msg);
final Event event = primary.poll();
Assert.assertNotNull("Event should not be null", event);
final String body = getBody(event);
Assert.assertTrue("Channel contained event, but not expected message. Received: " + body,
body.endsWith("Test Log4j"));
}
@Test
@Ignore
public void testHeaderAddedByInterceptor() {
final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Log4j", "Test");
EventLogger.logEvent(msg);
final Event event = primary.poll();
Assert.assertNotNull("Event should not be null", event);
final String environmentHeader = event.getHeaders().get("environment");
Assert.assertEquals("local", environmentHeader);
}
@Test
@Ignore
public void testPerformance() throws Exception {
final long start = System.currentTimeMillis();
final int count = 10000;
for (int i = 0; i < count; ++i) {
final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Primary " + i, "Test");
msg.put("counter", Integer.toString(i));
EventLogger.logEvent(msg);
}
final long elapsed = System.currentTimeMillis() - start;
System.out.println("Time to log " + count + " events " + elapsed + "ms");
}
@Test
public void testLog4Event() throws IOException {
final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Log4j", "Test");
EventLogger.logEvent(msg);
final Event event = primary.poll();
Assert.assertNotNull(event);
final String body = getBody(event);
Assert.assertTrue("Channel contained event, but not expected message. Received: " + body,
body.endsWith("Test Log4j"));
}
@Test
public void testRFC5424Layout() throws IOException {
final StructuredDataMessage msg = new StructuredDataMessage("Test", "Test Log4j", "Test");
EventLogger.logEvent(msg);
final Event event = primary.poll();
Assert.assertNotNull(event);
final String body = getBody(event);
Assert.assertTrue("Structured message does not contain @EID: " + body,
body.contains("[email protected]"));
}
@Override
public void run() {
for (int i = start; i < stop; ++i) {
final StructuredDataMessage msg = new StructuredDataMessage(
"Test", "Test Multiple " + i, "Test");
msg.put("counter", Integer.toString(i));
EventLogger.logEvent(msg);
}
}
@SuppressWarnings("unchecked")
public static <T extends AuditEvent> T getEvent(final Class<T> intrface) {
final String eventId = NamingUtils.lowerFirst(intrface.getSimpleName());
final StructuredDataMessage msg = new StructuredDataMessage(eventId, null, "Audit");
return (T)Proxy.newProxyInstance(intrface
.getClassLoader(), new Class<?>[]{intrface}, new AuditProxy(msg, intrface));
}
/**
* Looks up the value for the key using the data in the LogEvent.
* @param event The current LogEvent.
* @param key the key to be looked up, may be null
* @return The value associated with the key.
*/
@Override
public String lookup(final LogEvent event, final String key) {
if (event == null || !(event.getMessage() instanceof StructuredDataMessage)) {
return null;
}
final StructuredDataMessage msg = (StructuredDataMessage) event.getMessage();
if (key.equalsIgnoreCase("id")) {
return msg.getId().getName();
} else if (key.equalsIgnoreCase("type")) {
return msg.getType();
}
return msg.get(key);
}
@Override
public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
final Throwable t) {
if (msg instanceof StructuredDataMessage) {
return filter((StructuredDataMessage) msg);
}
return Result.NEUTRAL;
}