Skip to content

Commit fd5a5ca

Browse files
authored
[RKOTLIN-1038] Implement new log category for RealmLogger (#1692)
1 parent 52ad45b commit fd5a5ca

File tree

45 files changed

+787
-699
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+787
-699
lines changed

CHANGELOG.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
## 1.17.0-SNAPSHOT (YYYY-MM-DD)
1+
## 2.0.0-SNAPSHOT (YYYY-MM-DD)
22

33
[!NOTE]
44
This release will bump the Realm file format from version 23 to 24. Opening a file with an older format will automatically upgrade it from file format v10. If you want to upgrade from an earlier file format version you will have to use Realm Kotlin v1.13.1 or earlier. Downgrading to a previous file format is not possible.
55

66
### Breaking changes
7-
* None.
7+
* Removed property `RealmLog.level`. Log levels can be set with `RealmLog.setLevel`. (Issue [#1691](https://github.com/realm/realm-kotlin/issues/1691) [JIRA](https://jira.mongodb.org/browse/RKOTLIN-1038))
8+
* Removed `LogConfiguration`. Log levels and custom loggers can be set with `RealmLog`. (Issue [#1691](https://github.com/realm/realm-kotlin/issues/1691) [JIRA](https://jira.mongodb.org/browse/RKOTLIN-1038))
89

910
### Enhancements
1011
* Support for RealmLists and RealmDictionaries in `RealmAny`. (Issue [#1434](https://github.com/realm/realm-kotlin/issues/1434))
1112
* Optimized `RealmList.indexOf()` and `RealmList.contains()` using Core implementation of operations instead of iterating elements and comparing them in Kotlin. (Issue [#1625](https://github.com/realm/realm-kotlin/pull/1666) [RKOTLIN-995](https://jira.mongodb.org/browse/RKOTLIN-995)).
13+
* Add support for filtering logs by category. (Issue [#1691](https://github.com/realm/realm-kotlin/issues/1691) [JIRA](https://jira.mongodb.org/browse/RKOTLIN-1038))
1214

1315
### Fixed
1416
* None.

buildSrc/src/main/kotlin/Config.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ val HOST_OS: OperatingSystem = findHostOs()
6262

6363
object Realm {
6464
val ciBuild = (System.getenv("CI") != null)
65-
const val version = "1.17.0-SNAPSHOT"
65+
const val version = "2.0.0-SNAPSHOT"
6666
const val group = "io.realm.kotlin"
6767
const val projectUrl = "https://realm.io"
6868
const val pluginPortalId = "io.realm.kotlin"

packages/cinterop/src/commonMain/kotlin/io/realm/kotlin/internal/interop/Callback.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ interface SyncSessionTransferCompletionCallback {
4343

4444
interface LogCallback {
4545
// Passes core log levels as shorts to avoid unnecessary jumping between the SDK and JNI
46-
fun log(logLevel: Short, category: String?, message: String?)
46+
fun log(logLevel: Short, categoryValue: String, message: String?)
4747
}
4848

4949
interface SyncBeforeClientResetHandler {

packages/cinterop/src/commonMain/kotlin/io/realm/kotlin/internal/interop/RealmInterop.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,12 @@ expect object RealmInterop {
617617

618618
fun realm_set_log_level(level: CoreLogLevel)
619619

620+
fun realm_set_log_level_category(category: String, level: CoreLogLevel)
621+
622+
fun realm_get_log_level_category(category: String): CoreLogLevel
623+
624+
fun realm_get_category_names(): List<String>
625+
620626
fun realm_app_config_set_metadata_mode(
621627
appConfig: RealmAppConfigurationPointer,
622628
metadataMode: MetadataMode

packages/cinterop/src/jvm/jni/java_class_global_def.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ class JavaClassGlobalDef {
4545
JavaClassGlobalDef(JNIEnv* env)
4646
: m_java_util_hashmap(env, "java/util/HashMap", false)
4747
, m_java_lang_int(env, "java/lang/Integer", false)
48+
, m_java_lang_string(env, "java/lang/String", false)
4849
, m_kotlin_jvm_functions_function0(env, "kotlin/jvm/functions/Function0", false)
4950
, m_kotlin_jvm_functions_function1(env, "kotlin/jvm/functions/Function1", false)
5051
, m_io_realm_kotlin_internal_interop_sync_network_transport(env, "io/realm/kotlin/internal/interop/sync/NetworkTransport", false)
@@ -74,6 +75,7 @@ class JavaClassGlobalDef {
7475

7576
jni_util::JavaClass m_java_util_hashmap;
7677
jni_util::JavaClass m_java_lang_int;
78+
jni_util::JavaClass m_java_lang_string;
7779
jni_util::JavaClass m_kotlin_jvm_functions_function0;
7880
jni_util::JavaClass m_kotlin_jvm_functions_function1;
7981
jni_util::JavaClass m_io_realm_kotlin_internal_interop_sync_network_transport;
@@ -133,6 +135,11 @@ class JavaClassGlobalDef {
133135
return env->NewObject(instance()->m_java_lang_int, init, value);
134136
}
135137

138+
inline static const jni_util::JavaClass& java_lang_string()
139+
{
140+
return instance()->m_java_lang_string;
141+
}
142+
136143
inline static const jni_util::JavaClass& network_transport_class()
137144
{
138145
return instance()->m_io_realm_kotlin_internal_interop_sync_network_transport;

packages/cinterop/src/jvm/kotlin/io/realm/kotlin/internal/interop/RealmInterop.kt

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1365,9 +1365,21 @@ actual object RealmInterop {
13651365
realmc.realm_set_log_level(level.priority)
13661366
}
13671367

1368+
actual fun realm_set_log_level_category(category: String, level: CoreLogLevel) {
1369+
realmc.realm_set_log_level_category(category, level.priority)
1370+
}
1371+
1372+
actual fun realm_get_log_level_category(category: String): CoreLogLevel =
1373+
CoreLogLevel.valueFromPriority(realmc.realm_get_log_level_category(category).toShort())
1374+
1375+
actual fun realm_get_category_names(): List<String> {
1376+
val names: Array<String> = realmc.realm_get_log_category_names() as Array<String>
1377+
return names.asList()
1378+
}
1379+
13681380
actual fun realm_app_config_set_metadata_mode(
13691381
appConfig: RealmAppConfigurationPointer,
1370-
metadataMode: MetadataMode
1382+
metadataMode: MetadataMode,
13711383
) {
13721384
realmc.realm_app_config_set_metadata_mode(
13731385
appConfig.cptr(),

packages/cinterop/src/nativeDarwin/kotlin/io/realm/kotlin/internal/interop/RealmInterop.kt

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
// TODO https://github.com/realm/realm-kotlin/issues/889
1717
@file:Suppress("TooGenericExceptionThrown", "TooGenericExceptionCaught")
18+
@file:OptIn(ExperimentalForeignApi::class)
1819

1920
package io.realm.kotlin.internal.interop
2021

@@ -54,6 +55,7 @@ import kotlinx.cinterop.CPointerVar
5455
import kotlinx.cinterop.CPointerVarOf
5556
import kotlinx.cinterop.CValue
5657
import kotlinx.cinterop.CVariable
58+
import kotlinx.cinterop.ExperimentalForeignApi
5759
import kotlinx.cinterop.LongVar
5860
import kotlinx.cinterop.MemScope
5961
import kotlinx.cinterop.StableRef
@@ -2511,7 +2513,7 @@ actual object RealmInterop {
25112513
realm_wrapper.realm_set_log_callback(
25122514
staticCFunction { userData, category, logLevel, message ->
25132515
val userDataLogCallback = safeUserData<LogCallback>(userData)
2514-
userDataLogCallback.log(logLevel.toShort(), category?.toKString(), message?.toKString())
2516+
userDataLogCallback.log(logLevel.toShort(), category!!.toKString(), message?.toKString())
25152517
},
25162518
StableRef.create(callback).asCPointer(),
25172519
staticCFunction { userData -> disposeUserData<() -> LogCallback>(userData) }
@@ -2522,9 +2524,28 @@ actual object RealmInterop {
25222524
realm_wrapper.realm_set_log_level(level.priority.toUInt())
25232525
}
25242526

2527+
actual fun realm_set_log_level_category(category: String, level: CoreLogLevel) {
2528+
realm_wrapper.realm_set_log_level_category(category, level.priority.toUInt())
2529+
}
2530+
2531+
actual fun realm_get_log_level_category(category: String): CoreLogLevel =
2532+
CoreLogLevel.valueFromPriority(realm_wrapper.realm_get_log_level_category(category).toShort())
2533+
2534+
actual fun realm_get_category_names(): List<String> {
2535+
memScoped {
2536+
val namesCount = realm_wrapper.realm_get_category_names(0u, null)
2537+
val namesBuffer = allocArray<CPointerVar<ByteVar>>(namesCount.toInt())
2538+
realm_wrapper.realm_get_category_names(namesCount, namesBuffer)
2539+
2540+
return List(namesCount.toInt()) {
2541+
namesBuffer[it].safeKString()
2542+
}
2543+
}
2544+
}
2545+
25252546
actual fun realm_app_config_set_metadata_mode(
25262547
appConfig: RealmAppConfigurationPointer,
2527-
metadataMode: MetadataMode
2548+
metadataMode: MetadataMode,
25282549
) {
25292550
realm_wrapper.realm_app_config_set_metadata_mode(
25302551
appConfig.cptr(),

packages/jni-swig-stub/src/main/jni/realm_api_helpers.cpp

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -960,8 +960,8 @@ realm_sync_socket_t* realm_sync_websocket_new(int64_t sync_client_config_ptr, jo
960960
// *** END - WebSocket Client (Platform Networking) *** //
961961

962962
void set_log_callback(jobject log_callback) {
963-
auto jenv = get_env(true);
964-
realm_set_log_callback([](void *userdata, const char* category, realm_log_level_e level, const char *message) {
963+
auto jenv = get_env(false);
964+
realm_set_log_callback([](void *userdata, const char *category, realm_log_level_e level, const char *message) {
965965
auto log_callback = static_cast<jobject>(userdata);
966966
auto jenv = get_env(true);
967967

@@ -970,7 +970,7 @@ realm_set_log_callback([](void *userdata, const char* category, realm_log_level_
970970
static JavaMethod log_method(jenv,
971971
JavaClassGlobalDef::log_callback(),
972972
"log",
973-
"(SLjava/lang/String;Ljava/lang/String;)V");
973+
"(SLjava/lang/String;Ljava/lang/String;)V");
974974

975975
push_local_frame(jenv, 2);
976976
jenv->CallVoidMethod(log_callback, log_method, java_level, to_jstring(jenv, category), to_jstring(jenv, message));
@@ -1370,3 +1370,23 @@ realm_class_info_t_cleanup(realm_class_info_t * value) {
13701370
delete[] value->primary_key;
13711371
delete[] value->name;
13721372
}
1373+
1374+
jobjectArray realm_get_log_category_names() {
1375+
JNIEnv* env = get_env(true);
1376+
1377+
size_t namesCount = realm_get_category_names(0, nullptr);
1378+
1379+
const char** category_names = new const char*[namesCount];
1380+
realm_get_category_names(namesCount, category_names);
1381+
1382+
auto array = env->NewObjectArray(namesCount, JavaClassGlobalDef::java_lang_string(), nullptr);
1383+
1384+
for(size_t i = 0; i < namesCount; i++) {
1385+
jstring string = env->NewStringUTF(category_names[i]);
1386+
env->SetObjectArrayElement(array, i, string);
1387+
}
1388+
1389+
delete[] category_names;
1390+
1391+
return array;
1392+
}

packages/jni-swig-stub/src/main/jni/realm_api_helpers.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ realm_http_transport_t*
5151
realm_network_transport_new(jobject network_transport);
5252

5353
void
54-
set_log_callback(jobject log_callbac);
54+
set_log_callback(jobject log_callback);
5555

5656
realm_scheduler_t*
5757
realm_create_scheduler(jobject dispatchScheduler);
@@ -161,4 +161,6 @@ bool realm_sync_websocket_message(int64_t observer_ptr, jbyteArray data, size_t
161161

162162
void realm_sync_websocket_closed(int64_t observer_ptr, bool was_clean, int error_code, const char* reason);
163163

164+
jobjectArray realm_get_log_category_names();
165+
164166
#endif //TEST_REALM_API_HELPERS_H

packages/library-base/src/androidMain/kotlin/io/realm/kotlin/internal/platform/LogCatLogger.kt

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,14 @@
1616
package io.realm.kotlin.internal.platform
1717

1818
import android.util.Log
19+
import io.realm.kotlin.internal.messageWithCategory
20+
import io.realm.kotlin.log.LogCategory
1921
import io.realm.kotlin.log.LogLevel
2022
import io.realm.kotlin.log.RealmLogger
2123
import java.io.PrintWriter
2224
import java.io.StringWriter
2325
import java.util.Locale
26+
import kotlin.math.min
2427

2528
/**
2629
* Create a logger that outputs to Android LogCat.
@@ -29,13 +32,22 @@ import java.util.Locale
2932
* for message creation and formatting
3033
*/
3134
internal class LogCatLogger(
32-
override val tag: String = "REALM",
33-
override val level: LogLevel
35+
private val tag: String,
3436
) : RealmLogger {
3537

36-
override fun log(level: LogLevel, throwable: Throwable?, message: String?, vararg args: Any?) {
38+
override fun log(
39+
category: LogCategory,
40+
level: LogLevel,
41+
throwable: Throwable?,
42+
message: String?,
43+
vararg args: Any?,
44+
) {
3745
val priority: Int = level.priority
38-
val logMessage: String = prepareLogMessage(throwable, message, *args)
46+
val logMessage: String = prepareLogMessage(
47+
throwable = throwable,
48+
message = messageWithCategory(category, message),
49+
args = *args
50+
)
3951

4052
// Short circuit if message can fit into a single line in LogCat
4153
if (logMessage.length < MAX_LOG_LENGTH) {
@@ -50,7 +62,7 @@ internal class LogCatLogger(
5062
var newline = logMessage.indexOf('\n', i)
5163
newline = if (newline != -1) newline else length
5264
do {
53-
val end = Math.min(newline, i + MAX_LOG_LENGTH)
65+
val end = min(newline, i + MAX_LOG_LENGTH)
5466
val part = logMessage.substring(i, end)
5567
printMessage(priority, part)
5668
i = end

0 commit comments

Comments
 (0)