1212use Stackify \Log \Entities \Api \LogMsgGroup ;
1313use Stackify \Log \Entities \Agent \AgentMessage ;
1414use Stackify \Exceptions \InitializationException ;
15+ use Stackify \Log \Filters \LogMsg \ErrorStackTraceMaskFilter ;
16+ use Stackify \Log \Filters \LogMsgFilterable ;
17+ use Stackify \Log \Transport \Config \Agent ;
1518
1619class MessageBuilder implements BuilderInterface
1720{
@@ -20,8 +23,20 @@ class MessageBuilder implements BuilderInterface
2023 protected $ appName ;
2124 protected $ environmentName ;
2225 protected $ logServerVariables ;
26+ /**
27+ * Log message filters
28+ *
29+ * @var LogMsgFilterable[]
30+ */
31+ protected $ logMessageFilters ;
32+ /**
33+ * Agent config
34+ *
35+ * @var Agent
36+ */
37+ protected $ agentConfig ;
2338
24- public function __construct ($ loggerName , $ appName , $ environmentName = null , $ logServerVariables = false )
39+ public function __construct ($ loggerName , $ appName , $ environmentName = null , $ logServerVariables = false , $ config = null )
2540 {
2641 if (!function_exists ('json_encode ' )) {
2742 throw new InitializationException ('JSON extension is required for Stackify logger ' );
@@ -32,6 +47,10 @@ public function __construct($loggerName, $appName, $environmentName = null, $log
3247 $ this ->logServerVariables = $ logServerVariables ;
3348 // set state for environment details
3449 EnvironmentDetail::getInstance ()->init ($ appName , $ environmentName );
50+ $ this ->agentConfig = !empty ($ config ) ? $ config : Agent::getInstance ();
51+ $ this ->logMessageFilters = array ();
52+
53+ $ this ->addLogMessageFiltersFromConfig ();
3554 }
3655
3756 public function getAgentMessage (LogMsg $ logMsg )
@@ -64,6 +83,7 @@ public function createLogMsg(LogEntryInterface $logEntry)
6483 $ logEntry ->getMessage (),
6584 $ logEntry ->getMilliseconds ()
6685 );
86+
6787 $ errorWrapper = null ;
6888 if ($ exception = $ logEntry ->getException ()) {
6989 $ errorWrapper = new ErrorWrapper ($ exception );
@@ -72,16 +92,19 @@ public function createLogMsg(LogEntryInterface $logEntry)
7292 } elseif ($ logEntry ->isErrorLevel ()) {
7393 $ errorWrapper = new ErrorWrapper ($ logEntry );
7494 }
95+
7596 if (null !== $ errorWrapper ) {
7697 $ error = new StackifyError ($ this ->appName , $ this ->environmentName , $ this ->logServerVariables );
7798 $ error ->OccurredEpochMillis = $ logEntry ->getMilliseconds ();
7899 $ error ->Error = $ this ->getErrorItem ($ errorWrapper );
79100 $ logMsg ->setError ($ error );
80101 }
102+
81103 if (null !== $ logEntry ->getContext ()) {
82104 $ logMsg ->data = $ this ->encodeJSON ($ logEntry ->getContext ());
83105 }
84- return $ logMsg ;
106+
107+ return $ this ->filterMessage ($ logMsg );
85108 }
86109
87110 /**
@@ -127,4 +150,78 @@ protected function validateNotEmpty($name, $value)
127150 return $ result ;
128151 }
129152
153+ /**
154+ * Filter log message
155+ *
156+ * @param LogMsg $logMsg Log message instance
157+ *
158+ * @return LogMsg
159+ */
160+ protected function filterMessage (LogMsg $ logMsg )
161+ {
162+ if (count ($ this ->logMessageFilters )) {
163+ foreach ($ this ->logMessageFilters as $ filterable ) {
164+ $ logMsg = $ filterable ->filter ($ logMsg );
165+ }
166+ }
167+
168+ return $ logMsg ;
169+ }
170+
171+ /**
172+ * Add log message filter
173+ *
174+ * @param string $filterClass Filter class string
175+ *
176+ * @return void
177+ */
178+ protected function addLogMessageFilter ($ filterClass )
179+ {
180+ if (!is_string ($ filterClass )) {
181+ return ;
182+ }
183+
184+ if (!class_exists ($ filterClass )) {
185+ return ;
186+ }
187+
188+ if (!is_subclass_of ($ filterClass , LogMsgFilterable::class)) {
189+ return ;
190+ }
191+
192+ $ this ->logMessageFilters [$ filterClass ] = new $ filterClass ();
193+ }
194+
195+ /**
196+ * Add log message filters from config
197+ *
198+ * @return void
199+ */
200+ public function addLogMessageFiltersFromConfig ()
201+ {
202+ if (!$ this ->agentConfig ) {
203+ return ;
204+ }
205+
206+ $ configLogMessageFilters = $ this ->agentConfig ->getLogMessageFilters ();
207+ if ($ configLogMessageFilters && count ($ configLogMessageFilters )) {
208+ foreach ($ configLogMessageFilters as $ filterClass ) {
209+ $ this ->addLogMessageFilter ($ filterClass );
210+ }
211+ }
212+
213+ if ($ this ->agentConfig ->isMaskErrorStackTraceArguments ()) {
214+ $ this ->addLogMessageFilter (ErrorStackTraceMaskFilter::class);
215+ }
216+ }
217+
218+ /**
219+ * Get log message filters
220+ *
221+ * @return LogMsgFilterable[]
222+ */
223+ public function getLogMessageFilters ()
224+ {
225+ return $ this ->logMessageFilters ;
226+ }
130227}
0 commit comments