diff --git a/bindings/java/build.gradle.kts b/bindings/java/build.gradle.kts
index 6a20b4330..21740e35a 100644
--- a/bindings/java/build.gradle.kts
+++ b/bindings/java/build.gradle.kts
@@ -38,7 +38,7 @@ repositories {
}
dependencies {
- implementation("org.slf4j:slf4j-api:1.7.32")
+ compileOnly("org.slf4j:slf4j-api:1.7.32")
errorprone("com.uber.nullaway:nullaway:0.10.26") // maximum version which supports java 8
errorprone("com.google.errorprone:error_prone_core:2.10.0") // maximum version which supports java 8
@@ -46,9 +46,6 @@ dependencies {
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
testImplementation("org.assertj:assertj-core:3.27.0")
-
- testImplementation("ch.qos.logback:logback-classic:1.2.13")
- testImplementation("ch.qos.logback:logback-core:1.2.13")
}
application {
diff --git a/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java b/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java
index 6928c32cc..ee8ae206b 100644
--- a/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java
+++ b/bindings/java/src/main/java/org/github/tursodatabase/JDBC.java
@@ -7,8 +7,8 @@ import org.github.tursodatabase.annotations.Nullable;
import org.github.tursodatabase.annotations.SkipNullableCheck;
import org.github.tursodatabase.core.LimboConnection;
import org.github.tursodatabase.jdbc4.JDBC4Connection;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.github.tursodatabase.utils.Logger;
+import org.github.tursodatabase.utils.LoggerFactory;
public class JDBC implements Driver {
private static final Logger logger = LoggerFactory.getLogger(JDBC.class);
diff --git a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboConnection.java b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboConnection.java
index 34e5692e3..639a2be56 100644
--- a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboConnection.java
+++ b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboConnection.java
@@ -8,8 +8,8 @@ import java.sql.SQLException;
import java.util.Properties;
import org.github.tursodatabase.annotations.NativeInvocation;
import org.github.tursodatabase.utils.LimboExceptionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.github.tursodatabase.utils.Logger;
+import org.github.tursodatabase.utils.LoggerFactory;
public abstract class LimboConnection implements Connection {
private static final Logger logger = LoggerFactory.getLogger(LimboConnection.class);
diff --git a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboDB.java b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboDB.java
index ac3f03b5c..e1d619239 100644
--- a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboDB.java
+++ b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboDB.java
@@ -12,8 +12,8 @@ import org.github.tursodatabase.LimboErrorCode;
import org.github.tursodatabase.annotations.NativeInvocation;
import org.github.tursodatabase.annotations.VisibleForTesting;
import org.github.tursodatabase.utils.LimboExceptionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.github.tursodatabase.utils.Logger;
+import org.github.tursodatabase.utils.LoggerFactory;
/** This class provides a thin JNI layer over the SQLite3 C API. */
public final class LimboDB extends AbstractDB {
diff --git a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboResultSet.java b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboResultSet.java
index 67bc6b8ee..ceb9c6291 100644
--- a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboResultSet.java
+++ b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboResultSet.java
@@ -3,8 +3,8 @@ package org.github.tursodatabase.core;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.github.tursodatabase.annotations.Nullable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.github.tursodatabase.utils.Logger;
+import org.github.tursodatabase.utils.LoggerFactory;
/**
* A table of data representing limbo database result set, which is generated by executing a
diff --git a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboStatement.java b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboStatement.java
index 0fdf243e0..ae33208c7 100644
--- a/bindings/java/src/main/java/org/github/tursodatabase/core/LimboStatement.java
+++ b/bindings/java/src/main/java/org/github/tursodatabase/core/LimboStatement.java
@@ -4,8 +4,8 @@ import java.sql.SQLException;
import org.github.tursodatabase.annotations.NativeInvocation;
import org.github.tursodatabase.annotations.Nullable;
import org.github.tursodatabase.utils.LimboExceptionUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.github.tursodatabase.utils.Logger;
+import org.github.tursodatabase.utils.LoggerFactory;
/**
* By default, only one resultSet object per LimboStatement can be open at
diff --git a/bindings/java/src/main/java/org/github/tursodatabase/utils/Logger.java b/bindings/java/src/main/java/org/github/tursodatabase/utils/Logger.java
new file mode 100644
index 000000000..930658e80
--- /dev/null
+++ b/bindings/java/src/main/java/org/github/tursodatabase/utils/Logger.java
@@ -0,0 +1,14 @@
+package org.github.tursodatabase.utils;
+
+/** A simple internal Logger interface. */
+public interface Logger {
+ void trace(String message, Object... params);
+
+ void debug(String message, Object... params);
+
+ void info(String message, Object... params);
+
+ void warn(String message, Object... params);
+
+ void error(String message, Object... params);
+}
diff --git a/bindings/java/src/main/java/org/github/tursodatabase/utils/LoggerFactory.java b/bindings/java/src/main/java/org/github/tursodatabase/utils/LoggerFactory.java
new file mode 100644
index 000000000..0cc42d143
--- /dev/null
+++ b/bindings/java/src/main/java/org/github/tursodatabase/utils/LoggerFactory.java
@@ -0,0 +1,122 @@
+package org.github.tursodatabase.utils;
+
+import java.util.logging.Level;
+
+/**
+ * A factory for {@link Logger} instances that uses SLF4J if present, falling back on a
+ * java.util.logging implementation otherwise.
+ */
+public class LoggerFactory {
+ static final boolean USE_SLF4J;
+
+ static {
+ boolean useSLF4J;
+ try {
+ Class.forName("org.slf4j.Logger");
+ useSLF4J = true;
+ } catch (Exception e) {
+ useSLF4J = false;
+ }
+ USE_SLF4J = useSLF4J;
+ }
+
+ /**
+ * Get a {@link Logger} instance for the given host class.
+ *
+ * @param hostClass the host class from which log messages will be issued
+ * @return a Logger
+ */
+ public static Logger getLogger(Class> hostClass) {
+ if (USE_SLF4J) {
+ return new SLF4JLogger(hostClass);
+ }
+
+ return new JDKLogger(hostClass);
+ }
+
+ private static class JDKLogger implements Logger {
+ final java.util.logging.Logger logger;
+
+ public JDKLogger(Class> hostClass) {
+ logger = java.util.logging.Logger.getLogger(hostClass.getCanonicalName());
+ }
+
+ @Override
+ public void trace(String message, Object... params) {
+ if (logger.isLoggable(Level.FINEST)) {
+ logger.log(Level.FINEST, String.format(message, params));
+ }
+ }
+
+ @Override
+ public void debug(String message, Object... params) {
+ if (logger.isLoggable(Level.FINE)) {
+ logger.log(Level.FINE, String.format(message, params));
+ }
+ }
+
+ @Override
+ public void info(String message, Object... params) {
+ if (logger.isLoggable(Level.INFO)) {
+ logger.log(Level.INFO, String.format(message, params));
+ }
+ }
+
+ @Override
+ public void warn(String message, Object... params) {
+ if (logger.isLoggable(Level.WARNING)) {
+ logger.log(Level.WARNING, String.format(message, params));
+ }
+ }
+
+ @Override
+ public void error(String message, Object... params) {
+ if (logger.isLoggable(Level.SEVERE)) {
+ logger.log(Level.SEVERE, String.format(message, params));
+ }
+ }
+ }
+
+ private static class SLF4JLogger implements Logger {
+ final org.slf4j.Logger logger;
+
+ SLF4JLogger(Class> hostClass) {
+ logger = org.slf4j.LoggerFactory.getLogger(hostClass);
+ }
+
+ @Override
+ public void trace(String message, Object... params) {
+ if (logger.isTraceEnabled()) {
+ logger.trace(message, String.format(message, params));
+ }
+ }
+
+ @Override
+ public void debug(String message, Object... params) {
+ if (logger.isDebugEnabled()) {
+ logger.debug(message, String.format(message, params));
+ }
+ }
+
+ @Override
+ public void info(String message, Object... params) {
+ if (logger.isInfoEnabled()) {
+ logger.info(message, String.format(message, params));
+ }
+ }
+
+ @Override
+ public void warn(String message, Object... params) {
+ if (logger.isWarnEnabled()) {
+ logger.warn(message, String.format(message, params));
+ }
+ }
+
+ @Override
+ public void error(String message, Object... params) {
+ if (logger.isErrorEnabled()) {
+ logger.error(message, String.format(message, params));
+ }
+ }
+ }
+}
diff --git a/bindings/java/src/test/resources/logback.xml b/bindings/java/src/test/resources/logback.xml
deleted file mode 100644
index 1496a4b64..000000000
--- a/bindings/java/src/test/resources/logback.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-
-
-
- %d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n
-
-
-
-
-
-
-