1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.core.logic.audit;
20
21 import com.fasterxml.jackson.databind.JsonNode;
22 import java.io.Serializable;
23 import org.apache.logging.log4j.core.Filter;
24 import org.apache.logging.log4j.core.Layout;
25 import org.apache.logging.log4j.core.LogEvent;
26 import org.apache.logging.log4j.core.appender.AbstractAppender;
27 import org.apache.logging.log4j.core.config.Property;
28 import org.apache.logging.log4j.core.config.plugins.PluginBuilderFactory;
29 import org.apache.syncope.core.provisioning.api.serialization.POJOHelper;
30 import org.apache.syncope.ext.elasticsearch.client.ElasticsearchIndexManager;
31
32 public class ElasticsearchAppender extends AbstractAppender {
33
34 public static class Builder extends AbstractAppender.Builder<Builder>
35 implements org.apache.logging.log4j.core.util.Builder<ElasticsearchAppender> {
36
37 private ElasticsearchIndexManager elasticsearchIndexManager;
38
39 private String domain;
40
41 public ElasticsearchAppender.Builder setDomain(final String domain) {
42 this.domain = domain;
43 return this;
44 }
45
46 public ElasticsearchAppender.Builder setIndexManager(
47 final ElasticsearchIndexManager elasticsearchIndexManager) {
48
49 this.elasticsearchIndexManager = elasticsearchIndexManager;
50 return this;
51 }
52
53 @Override
54 public ElasticsearchAppender build() {
55 if (domain == null || elasticsearchIndexManager == null) {
56 LOGGER.error("Cannot create ElasticsearchAppender without Domain or IndexManager.");
57 return null;
58 }
59 return new ElasticsearchAppender(
60 getName(), getFilter(), getLayout(), isIgnoreExceptions(), domain, elasticsearchIndexManager);
61 }
62 }
63
64 @PluginBuilderFactory
65 public static Builder newBuilder() {
66 return new Builder();
67 }
68
69 private final String domain;
70
71 protected final ElasticsearchIndexManager elasticsearchIndexManager;
72
73 protected ElasticsearchAppender(
74 final String name,
75 final Filter filter,
76 final Layout<? extends Serializable> layout,
77 final boolean ignoreExceptions,
78 final String domain,
79 final ElasticsearchIndexManager elasticsearchIndexManager) {
80
81 super(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY);
82 this.domain = domain;
83 this.elasticsearchIndexManager = elasticsearchIndexManager;
84 }
85
86 @Override
87 public void append(final LogEvent event) {
88 try {
89 elasticsearchIndexManager.audit(
90 domain,
91 event.getTimeMillis(),
92 POJOHelper.deserialize(event.getMessage().getFormattedMessage(), JsonNode.class));
93 } catch (Exception e) {
94 LOGGER.error("While requesting to index event for appender [{}]", getName(), e);
95 }
96 }
97 }