Skip to content

Commit 07ab6ac

Browse files
authored
CBL-7125: c4Log sometimes does not log anything (#2302)
Refactor c4log_writeToCallback and c4log_setCallbackLevel so that they function independently of each other. In particular, calling setCallbackLevel with LevelNone won't remove the default logCallback. The new behavior matches with that of the pair of writeToBinary and setBinaryFileLevel.
1 parent 9bf748f commit 07ab6ac

1 file changed

Lines changed: 17 additions & 12 deletions

File tree

C/c4Log.cc

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -184,17 +184,17 @@ static bool sDefaultLogCallbackPreformatted;
184184

185185
// LCOV_EXCL_START
186186
void c4log_writeToCallback(C4LogLevel level, C4LogCallback callback, bool preformatted) noexcept {
187-
if ( !callback ) level = kC4LogNone;
187+
if ( !callback ) return;
188+
188189
if ( sDefaultLogCallback ) {
189190
c4log_removeObserver(sDefaultLogCallback);
190191
c4logobserver_release(sDefaultLogCallback);
191192
sDefaultLogCallback = nullptr;
192193
}
193-
if ( level != kC4LogNone ) {
194-
auto obs = make_retained<LogCallback>(callback, preformatted);
195-
LogObserver::add(obs, LogLevel(level));
196-
sDefaultLogCallback = toExternal(std::move(obs));
197-
}
194+
auto obs = make_retained<LogCallback>(callback, preformatted);
195+
LogObserver::add(obs, LogLevel(level));
196+
sDefaultLogCallback = toExternal(std::move(obs));
197+
198198
sDefaultLogCallbackLevel = level;
199199
sDefaultLogCallbackPreformatted = preformatted;
200200
}
@@ -204,8 +204,14 @@ C4LogCallback c4log_getCallback() noexcept { return sDefaultLogCallbackFn; }
204204
C4LogLevel c4log_callbackLevel() noexcept { return sDefaultLogCallbackLevel; } // LCOV_EXCL_LINE
205205

206206
void c4log_setCallbackLevel(C4LogLevel level) noexcept {
207-
if ( level != sDefaultLogCallbackLevel && sDefaultLogCallback )
208-
c4log_writeToCallback(level, sDefaultLogCallbackFn, sDefaultLogCallbackPreformatted);
207+
if ( level != sDefaultLogCallbackLevel && sDefaultLogCallback ) {
208+
if ( level == kC4LogNone ) c4log_removeObserver(sDefaultLogCallback);
209+
else {
210+
auto logCallback = toInternal(sDefaultLogCallback);
211+
LogObserver::remove(logCallback);
212+
LogObserver::add(logCallback, LogLevel(level));
213+
}
214+
}
209215
sDefaultLogCallbackLevel = level;
210216
}
211217

@@ -270,10 +276,9 @@ C4LogLevel c4log_binaryFileLevel() noexcept { return sDefaultLogFilesLevel; }
270276

271277
void c4log_setBinaryFileLevel(C4LogLevel level) noexcept {
272278
if ( sDefaultLogFiles && level != sDefaultLogFilesLevel ) {
273-
if ( level == kC4LogNone ) {
274-
if ( sDefaultLogFiles ) { c4log_removeObserver(sDefaultLogFiles); }
275-
} else {
276-
auto logFiles = dynamic_cast<LogFiles*>(toInternal(sDefaultLogFiles));
279+
if ( level == kC4LogNone ) c4log_removeObserver(sDefaultLogFiles);
280+
else {
281+
auto logFiles = toInternal(sDefaultLogFiles);
277282
LogObserver::remove(logFiles);
278283
LogObserver::add(logFiles, LogLevel(level));
279284
}

0 commit comments

Comments
 (0)