Skip to content

Commit 9b4c6fe

Browse files
fix: resolve logging inconsistencies
- Update custom logger initialization in OptimizelyFlutterSdkPlugin - Adjust logger channel setup in onDetachedFromEngine - Refactor LoggerBridge to handle log calls from native Swift/Java code properly - Ensure proper logging when no custom logger is set
1 parent be95ef5 commit 9b4c6fe

File tree

8 files changed

+470
-20
lines changed

8 files changed

+470
-20
lines changed
Lines changed: 378 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,378 @@
1+
/****************************************************************************
2+
* Copyright 2022-2023, Optimizely, Inc. and contributors *
3+
* *
4+
* Licensed under the Apache License, Version 2.0 (the "License"); *
5+
* you may not use this file except in compliance with the License. *
6+
* You may obtain a copy of the License at *
7+
* *
8+
* https://www.apache.org/licenses/LICENSE-2.0 *
9+
* *
10+
* Unless required by applicable law or agreed to in writing, software *
11+
* distributed under the License is distributed on an "AS IS" BASIS, *
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13+
* See the License for the specific language governing permissions and *
14+
* limitations under the License. *
15+
***************************************************************************/
16+
package com.optimizely.optimizely_flutter_sdk;
17+
18+
import android.os.Handler;
19+
import android.os.Looper;
20+
import io.flutter.plugin.common.MethodChannel;
21+
import org.slf4j.Logger;
22+
import org.slf4j.Marker;
23+
import java.util.HashMap;
24+
import java.util.Map;
25+
26+
public class FlutterOptimizelyLogger implements Logger {
27+
static final String LOGGER_CHANNEL = "optimizely_flutter_sdk_logger";
28+
private static MethodChannel loggerChannel;
29+
private final String tag;
30+
31+
public FlutterOptimizelyLogger(String name) {
32+
tag = name;
33+
}
34+
35+
public static void setChannel(MethodChannel channel) {
36+
loggerChannel = channel;
37+
}
38+
39+
@Override
40+
public String getName() {
41+
return "OptimizelyLogger";
42+
}
43+
44+
// Trace methods
45+
@Override
46+
public boolean isTraceEnabled() {
47+
return false;
48+
}
49+
50+
@Override
51+
public void trace(String msg) {
52+
// Not implemented
53+
}
54+
55+
@Override
56+
public void trace(String format, Object arg) {
57+
// Not implemented
58+
}
59+
60+
@Override
61+
public void trace(String format, Object arg1, Object arg2) {
62+
// Not implemented
63+
}
64+
65+
@Override
66+
public void trace(String format, Object... arguments) {
67+
// Not implemented
68+
}
69+
70+
@Override
71+
public void trace(String msg, Throwable t) {
72+
// Not implemented
73+
}
74+
75+
@Override
76+
public boolean isTraceEnabled(Marker marker) {
77+
return false;
78+
}
79+
80+
@Override
81+
public void trace(Marker marker, String msg) {
82+
// Not implemented
83+
}
84+
85+
@Override
86+
public void trace(Marker marker, String format, Object arg) {
87+
// Not implemented
88+
}
89+
90+
@Override
91+
public void trace(Marker marker, String format, Object arg1, Object arg2) {
92+
// Not implemented
93+
}
94+
95+
@Override
96+
public void trace(Marker marker, String format, Object... argArray) {
97+
// Not implemented
98+
}
99+
100+
@Override
101+
public void trace(Marker marker, String msg, Throwable t) {
102+
// Not implemented
103+
}
104+
105+
// Debug methods
106+
@Override
107+
public boolean isDebugEnabled() {
108+
return true;
109+
}
110+
111+
@Override
112+
public void debug(String msg) {
113+
sendLogToFlutter(4, msg);
114+
}
115+
116+
@Override
117+
public void debug(String format, Object arg) {
118+
debug(formatMessage(format, arg));
119+
}
120+
121+
@Override
122+
public void debug(String format, Object arg1, Object arg2) {
123+
debug(formatMessage(format, arg1, arg2));
124+
}
125+
126+
@Override
127+
public void debug(String format, Object... arguments) {
128+
debug(formatMessage(format, arguments));
129+
}
130+
131+
@Override
132+
public void debug(String msg, Throwable t) {
133+
debug(formatThrowable(msg, t));
134+
}
135+
136+
@Override
137+
public boolean isDebugEnabled(Marker marker) {
138+
return true;
139+
}
140+
141+
@Override
142+
public void debug(Marker marker, String msg) {
143+
debug(msg);
144+
}
145+
146+
@Override
147+
public void debug(Marker marker, String format, Object arg) {
148+
debug(format, arg);
149+
}
150+
151+
@Override
152+
public void debug(Marker marker, String format, Object arg1, Object arg2) {
153+
debug(format, arg1, arg2);
154+
}
155+
156+
@Override
157+
public void debug(Marker marker, String format, Object... arguments) {
158+
debug(format, arguments);
159+
}
160+
161+
@Override
162+
public void debug(Marker marker, String msg, Throwable t) {
163+
debug(msg, t);
164+
}
165+
166+
// Info methods
167+
@Override
168+
public boolean isInfoEnabled() {
169+
return true;
170+
}
171+
172+
@Override
173+
public void info(String msg) {
174+
sendLogToFlutter(3, msg);
175+
}
176+
177+
@Override
178+
public void info(String format, Object arg) {
179+
info(formatMessage(format, arg));
180+
}
181+
182+
@Override
183+
public void info(String format, Object arg1, Object arg2) {
184+
info(formatMessage(format, arg1, arg2));
185+
}
186+
187+
@Override
188+
public void info(String format, Object... arguments) {
189+
info(formatMessage(format, arguments));
190+
}
191+
192+
@Override
193+
public void info(String msg, Throwable t) {
194+
info(formatThrowable(msg, t));
195+
}
196+
197+
@Override
198+
public boolean isInfoEnabled(Marker marker) {
199+
return true;
200+
}
201+
202+
@Override
203+
public void info(Marker marker, String msg) {
204+
info(msg);
205+
}
206+
207+
@Override
208+
public void info(Marker marker, String format, Object arg) {
209+
info(format, arg);
210+
}
211+
212+
@Override
213+
public void info(Marker marker, String format, Object arg1, Object arg2) {
214+
info(format, arg1, arg2);
215+
}
216+
217+
@Override
218+
public void info(Marker marker, String format, Object... arguments) {
219+
info(format, arguments);
220+
}
221+
222+
@Override
223+
public void info(Marker marker, String msg, Throwable t) {
224+
info(msg, t);
225+
}
226+
227+
// Warn methods
228+
@Override
229+
public boolean isWarnEnabled() {
230+
return true;
231+
}
232+
233+
@Override
234+
public void warn(String msg) {
235+
sendLogToFlutter(2, msg);
236+
}
237+
238+
@Override
239+
public void warn(String format, Object arg) {
240+
warn(formatMessage(format, arg));
241+
}
242+
243+
@Override
244+
public void warn(String format, Object... arguments) {
245+
warn(formatMessage(format, arguments));
246+
}
247+
248+
@Override
249+
public void warn(String format, Object arg1, Object arg2) {
250+
warn(formatMessage(format, arg1, arg2));
251+
}
252+
253+
@Override
254+
public void warn(String msg, Throwable t) {
255+
warn(formatThrowable(msg, t));
256+
}
257+
258+
@Override
259+
public boolean isWarnEnabled(Marker marker) {
260+
return true;
261+
}
262+
263+
@Override
264+
public void warn(Marker marker, String msg) {
265+
warn(msg);
266+
}
267+
268+
@Override
269+
public void warn(Marker marker, String format, Object arg) {
270+
warn(format, arg);
271+
}
272+
273+
@Override
274+
public void warn(Marker marker, String format, Object arg1, Object arg2) {
275+
warn(format, arg1, arg2);
276+
}
277+
278+
@Override
279+
public void warn(Marker marker, String format, Object... arguments) {
280+
warn(format, arguments);
281+
}
282+
283+
@Override
284+
public void warn(Marker marker, String msg, Throwable t) {
285+
warn(msg, t);
286+
}
287+
288+
// Error methods
289+
@Override
290+
public boolean isErrorEnabled() {
291+
return true;
292+
}
293+
294+
@Override
295+
public void error(String msg) {
296+
sendLogToFlutter(1, msg); // ERROR level = 1
297+
}
298+
299+
@Override
300+
public void error(String format, Object arg) {
301+
error(formatMessage(format, arg));
302+
}
303+
304+
@Override
305+
public void error(String format, Object arg1, Object arg2) {
306+
error(formatMessage(format, arg1, arg2));
307+
}
308+
309+
@Override
310+
public void error(String format, Object... arguments) {
311+
error(formatMessage(format, arguments));
312+
}
313+
314+
@Override
315+
public void error(String msg, Throwable t) {
316+
error(formatThrowable(msg, t));
317+
}
318+
319+
@Override
320+
public boolean isErrorEnabled(Marker marker) {
321+
return true;
322+
}
323+
324+
@Override
325+
public void error(Marker marker, String msg) {
326+
error(msg);
327+
}
328+
329+
@Override
330+
public void error(Marker marker, String format, Object arg) {
331+
error(format, arg);
332+
}
333+
334+
@Override
335+
public void error(Marker marker, String format, Object arg1, Object arg2) {
336+
error(format, arg1, arg2);
337+
}
338+
339+
@Override
340+
public void error(Marker marker, String format, Object... arguments) {
341+
error(format, arguments);
342+
}
343+
344+
@Override
345+
public void error(Marker marker, String msg, Throwable t) {
346+
error(msg, t);
347+
}
348+
349+
// Helper methods
350+
private void sendLogToFlutter(int level, String message) {
351+
if (loggerChannel == null) {
352+
return;
353+
}
354+
355+
// Ensure we're on the main thread when calling Flutter (similar to Swift's DispatchQueue.main.async)
356+
Handler mainHandler = new Handler(Looper.getMainLooper());
357+
mainHandler.post(() -> {
358+
Map<String, Object> arguments = new HashMap<>();
359+
arguments.put("level", level);
360+
arguments.put("message", message);
361+
loggerChannel.invokeMethod("log", arguments);
362+
});
363+
}
364+
365+
private String formatMessage(String format, Object... args) {
366+
try {
367+
// SLF4J uses {} placeholders, replace with %s for String.format
368+
String formatString = format.replace("{}", "%s");
369+
return String.format(formatString, args);
370+
} catch (Exception e) {
371+
return format;
372+
}
373+
}
374+
375+
private String formatThrowable(String msg, Throwable t) {
376+
return msg + " - " + t.getMessage();
377+
}
378+
}

0 commit comments

Comments
 (0)