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.init;
20
21 import java.util.List;
22 import java.util.Optional;
23 import javax.sql.DataSource;
24 import org.apache.logging.log4j.Level;
25 import org.apache.logging.log4j.LogManager;
26 import org.apache.logging.log4j.core.Appender;
27 import org.apache.logging.log4j.core.LoggerContext;
28 import org.apache.logging.log4j.core.config.LoggerConfig;
29 import org.apache.syncope.common.lib.types.AuditLoggerName;
30 import org.apache.syncope.core.logic.audit.AuditAppender;
31 import org.apache.syncope.core.persistence.api.SyncopeCoreLoader;
32 import org.apache.syncope.core.spring.security.AuthContextUtils;
33
34 public class AuditLoader implements SyncopeCoreLoader {
35
36 protected static final String ROOT_LOGGER = "ROOT";
37
38 public static void addAppenderToLoggerContext(
39 final LoggerContext ctx,
40 final AuditAppender auditAppender,
41 final LoggerConfig eventLogConf) {
42
43 Appender targetAppender = Optional.ofNullable(
44 ctx.getConfiguration().getAppender(auditAppender.getTargetAppenderName())).map(Appender.class::cast).
45 orElseGet(() -> auditAppender.getTargetAppender());
46 targetAppender.start();
47 ctx.getConfiguration().addAppender(targetAppender);
48
49 auditAppender.getRewriteAppender().ifPresentOrElse(
50 rewriteAppender -> {
51 rewriteAppender.start();
52 eventLogConf.addAppender(rewriteAppender, Level.DEBUG, null);
53 },
54 () -> eventLogConf.addAppender(targetAppender, Level.DEBUG, null));
55
56 ctx.updateLoggers();
57 }
58
59 protected final AuditAccessor auditAccessor;
60
61 protected final List<AuditAppender> auditAppenders;
62
63 public AuditLoader(final AuditAccessor auditAccessor, final List<AuditAppender> auditAppenders) {
64 this.auditAccessor = auditAccessor;
65 this.auditAppenders = auditAppenders;
66 }
67
68 @Override
69 public int getOrder() {
70 return 500;
71 }
72
73 @Override
74 public void load(final String domain, final DataSource datasource) {
75 LoggerContext logCtx = (LoggerContext) LogManager.getContext(false);
76
77 auditAppenders.forEach(auditAppender -> auditAppender.getEvents().stream().
78 map(event -> AuditLoggerName.getAuditEventLoggerName(domain, event.toAuditKey())).
79 forEach(domainAuditLoggerName -> {
80 LoggerConfig eventLogConf = logCtx.getConfiguration().getLoggerConfig(domainAuditLoggerName);
81 boolean isRootLogConf = LogManager.ROOT_LOGGER_NAME.equals(eventLogConf.getName());
82
83 if (isRootLogConf) {
84 eventLogConf = new LoggerConfig(domainAuditLoggerName, null, false);
85 }
86 eventLogConf.setLevel(Level.DEBUG);
87
88 addAppenderToLoggerContext(logCtx, auditAppender, eventLogConf);
89
90 if (isRootLogConf) {
91 logCtx.getConfiguration().addLogger(domainAuditLoggerName, eventLogConf);
92 }
93 }));
94
95 AuthContextUtils.callAsAdmin(domain, () -> {
96 auditAccessor.synchronizeLoggingWithAudit();
97 return null;
98 });
99 }
100 }