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 org.apache.logging.log4j.Logger logger = StatusLogger.getLogger();
47
48 private final AbstractScript script;
49 private final Configuration configuration;
50
51 private ScriptFilter(final AbstractScript script, final Configuration configuration, final Result onMatch,
52 final Result onMismatch) {
53 super(onMatch, onMismatch);
54 this.script = script;
55 this.configuration = configuration;
56 if (!(script instanceof ScriptRef)) {
57 configuration.getScriptManager().addScript(script);
58 }
59 }
60
61 @Override
62 public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
63 final Object... params) {
64 final SimpleBindings bindings = new SimpleBindings();
65 bindings.put("logger", logger);
66 bindings.put("level", level);
67 bindings.put("marker", marker);
68 bindings.put("message", new SimpleMessage(msg));
69 bindings.put("parameters", params);
70 bindings.put("throwable", null);
71 bindings.putAll(configuration.getProperties());
72 bindings.put("substitutor", configuration.getStrSubstitutor());
73 final Object object = configuration.getScriptManager().execute(script.getName(), bindings);
74 return object == null || !Boolean.TRUE.equals(object) ? onMismatch : onMatch;
75 }
76
77 @Override
78 public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg,
79 final Throwable t) {
80 final SimpleBindings bindings = new SimpleBindings();
81 bindings.put("logger", logger);
82 bindings.put("level", level);
83 bindings.put("marker", marker);
84 bindings.put("message", msg instanceof String ? new SimpleMessage((String)msg) : new ObjectMessage(msg));
85 bindings.put("parameters", null);
86 bindings.put("throwable", t);
87 bindings.putAll(configuration.getProperties());
88 bindings.put("substitutor", configuration.getStrSubstitutor());
89 final Object object = configuration.getScriptManager().execute(script.getName(), bindings);
90 return object == null || !Boolean.TRUE.equals(object) ? onMismatch : onMatch;
91 }
92
93 @Override
94 public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
95 final Throwable t) {
96 final SimpleBindings bindings = new SimpleBindings();
97 bindings.put("logger", logger);
98 bindings.put("level", level);
99 bindings.put("marker", marker);
100 bindings.put("message", msg);
101 bindings.put("parameters", null);
102 bindings.put("throwable", t);
103 bindings.putAll(configuration.getProperties());
104 bindings.put("substitutor", configuration.getStrSubstitutor());
105 final Object object = configuration.getScriptManager().execute(script.getName(), bindings);
106 return object == null || !Boolean.TRUE.equals(object) ? onMismatch : onMatch;
107 }
108
109 @Override
110 public Result filter(final LogEvent event) {
111 final SimpleBindings bindings = new SimpleBindings();
112 bindings.put("logEvent", event);
113 bindings.putAll(configuration.getProperties());
114 bindings.put("substitutor", configuration.getStrSubstitutor());
115 final Object object = configuration.getScriptManager().execute(script.getName(), bindings);
116 return object == null || !Boolean.TRUE.equals(object) ? onMismatch : onMatch;
117 }
118
119 @Override
120 public String toString() {
121 return script.getName();
122 }
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 }