1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.filter;
18
19 import javax.script.SimpleBindings;
20
21 import org.apache.logging.log4j.Level;
22 import org.apache.logging.log4j.Marker;
23 import org.apache.logging.log4j.core.Filter;
24 import org.apache.logging.log4j.core.LogEvent;
25 import org.apache.logging.log4j.core.Logger;
26 import org.apache.logging.log4j.core.config.Configuration;
27 import org.apache.logging.log4j.core.config.Node;
28 import org.apache.logging.log4j.core.config.plugins.Plugin;
29 import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
30 import org.apache.logging.log4j.core.config.plugins.PluginConfiguration;
31 import org.apache.logging.log4j.core.config.plugins.PluginElement;
32 import org.apache.logging.log4j.core.config.plugins.PluginFactory;
33 import org.apache.logging.log4j.core.script.AbstractScript;
34 import org.apache.logging.log4j.core.script.ScriptRef;
35 import org.apache.logging.log4j.message.Message;
36 import org.apache.logging.log4j.message.ObjectMessage;
37 import org.apache.logging.log4j.message.SimpleMessage;
38 import org.apache.logging.log4j.status.StatusLogger;
39
40
41
42
43 @Plugin(name = "ScriptFilter", category = Node.CATEGORY, elementType = Filter.ELEMENT_TYPE, printObject = true)
44 public final class ScriptFilter extends AbstractFilter {
45
46 private static final long serialVersionUID = 1L;
47 private static org.apache.logging.log4j.Logger logger = StatusLogger.getLogger();
48
49 private final AbstractScript script;
50 private final Configuration configuration;
51
52 private ScriptFilter(final AbstractScript script, final Configuration configuration, final Result onMatch,
53 final Result onMismatch) {
54 super(onMatch, onMismatch);
55 this.script = script;
56 this.configuration = configuration;
57 if (!(script instanceof ScriptRef)) {
58 configuration.getScriptManager().addScript(script);
59 }
60 }
61
62 @Override
63 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
64 final Object... params) {
65 SimpleBindings bindings = new SimpleBindings();
66 bindings.put("logger", logger);
67 bindings.put("level", level);
68 bindings.put("marker", marker);
69 bindings.put("message", new SimpleMessage(msg));
70 bindings.put("parameters", params);
71 bindings.put("throwable", null);
72 bindings.putAll(configuration.getProperties());
73 bindings.put("substitutor", configuration.getStrSubstitutor());
74 Object object = configuration.getScriptManager().execute(script.getName(), bindings);
75 return object == null || !Boolean.TRUE.equals(object) ? onMismatch : onMatch;
76 }
77
78 @Override
79 public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg,
80 final Throwable t) {
81 SimpleBindings bindings = new SimpleBindings();
82 bindings.put("logger", logger);
83 bindings.put("level", level);
84 bindings.put("marker", marker);
85 bindings.put("message", msg instanceof String ? new SimpleMessage((String)msg) : new ObjectMessage(msg));
86 bindings.put("parameters", null);
87 bindings.put("throwable", t);
88 bindings.putAll(configuration.getProperties());
89 bindings.put("substitutor", configuration.getStrSubstitutor());
90 Object object = configuration.getScriptManager().execute(script.getName(), bindings);
91 return object == null || !Boolean.TRUE.equals(object) ? onMismatch : onMatch;
92 }
93
94 @Override
95 public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
96 final Throwable t) {
97 SimpleBindings bindings = new SimpleBindings();
98 bindings.put("logger", logger);
99 bindings.put("level", level);
100 bindings.put("marker", marker);
101 bindings.put("message", msg);
102 bindings.put("parameters", null);
103 bindings.put("throwable", t);
104 bindings.putAll(configuration.getProperties());
105 bindings.put("substitutor", configuration.getStrSubstitutor());
106 Object object = configuration.getScriptManager().execute(script.getName(), bindings);
107 return object == null || !Boolean.TRUE.equals(object) ? onMismatch : onMatch;
108 }
109
110 @Override
111 public Result filter(final LogEvent event) {
112 SimpleBindings bindings = new SimpleBindings();
113 bindings.put("logEvent", event);
114 bindings.putAll(configuration.getProperties());
115 bindings.put("substitutor", configuration.getStrSubstitutor());
116 Object object = configuration.getScriptManager().execute(script.getName(), bindings);
117 return object == null || !Boolean.TRUE.equals(object) ? onMismatch : onMatch;
118 }
119
120 @Override
121 public String toString() {
122 return script.getName();
123 }
124
125
126
127
128
129
130
131
132
133
134 @PluginFactory
135 public static ScriptFilter createFilter(
136 @PluginElement("Script") final AbstractScript script,
137 @PluginAttribute("onMatch") final Result match,
138 @PluginAttribute("onMismatch") final Result mismatch,
139 @PluginConfiguration final Configuration configuration) {
140
141 if (script == null) {
142 LOGGER.error("A Script, ScriptFile or ScriptRef element must be provided for this ScriptFilter");
143 return null;
144 }
145 if (script instanceof ScriptRef) {
146 if (configuration.getScriptManager().getScript(script.getName()) == null) {
147 logger.error("No script with name {} has been declared.", script.getName());
148 return null;
149 }
150 }
151
152 return new ScriptFilter(script, configuration, match, mismatch);
153 }
154
155 }