diff --git a/README.md b/README.md index 3c73e38..6514323 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@ # Kalev +![Maven Central](https://img.shields.io/maven-central/v/eu.bolt/kalev?style=plastic) + Kalev is a structured logger for JVM (Java, Kotlin etc) The idea of `Kalev` is pretty similar to `Timber`. Library provides `Kalevipoeg` interface with which you may implement various behaviour for log entries reaction. ## Packages -`kalev-lib` provides pure JVM implementation. Doesn't cotains any implementation of `Kalevipoeg` -`kalev-android` contains bridge between Kalev and Android's log system. `PrintPoeg` format log entry as JSON string and print it to LogCat +`kalev-lib` provides pure JVM implementation. Doesn't contains any implementation of `Kalevipoeg` +`kalev-android` contains bridge between Kalev and Android's log system. `PrintPoeg` format log entry as JSON string and print it to LogCat. `kalev-okhttp` provide interceptor for `okhttp` to log network requests in Kalev-way @@ -15,7 +17,7 @@ The idea of `Kalev` is pretty similar to `Timber`. Library provides `Kalevipoeg` Two easy steps: -1. Add any `Kalevipoeg` instances you want on application start. In Android application `onCreate` is a mosst suetable place +1. Add any `Kalevipoeg` instances you want on application start. In Android application `onCreate` is a most suitable place 2. Call Kalev's static methods everywhere throughout your app. Check full Android sample at `sample` dir @@ -96,27 +98,39 @@ Examples of network logs: { "message": "network", "method": "GET", - "path": "\/gett", + "path": "\/unknown", "id": "42", "response.code": 404, "response.body": "\n
The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again.<\/p>\n"
}
```
+### FastLog
+Kalev creates new object for every log entry which may abuse performance in case of stream of entries. You can go around of this issue with FastLog.
+
+#### FastLog usage
+There is `FastLog` interface which describes fast logger.
+`kalev-lib` provides `SystemFastLog` implementation which prints messages to standard output stream
+`kalev-android` provides `AndroidFastLog` implementation which prints messages to Android's LogCat
+##### Initialisation:
+`Kalev.fastLog = AndroidFastLog()`
+##### Logging
+`Kalev.fastLog?.v("Activity created")`
+
## Gradle
Add this to your dependencies block.
```
-implementation 'eu.bolt:kalev:1.0.1'
+implementation 'eu.bolt:kalev:$latest'
```
To use an android extension use this dependency instead:
```
-implementation 'eu.bolt:kalev-android:1.0.1'
+implementation 'eu.bolt:kalev-android:$latest'
```
Kalev-okhttp package:
```
-implementation 'eu.bolt:kalev-okhttp:1.0.1'
+implementation 'eu.bolt:kalev-okhttp:$latest'
```
## Naming
diff --git a/gradle.properties b/gradle.properties
index de3e966..5d38838 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -15,4 +15,4 @@ POM_LICENCE_DIST=repo
POM_DEVELOPER_ID=bolteu
POM_DEVELOPER_NAME=Bolt Technologies OÜ
-VERSION_NAME=1.0.2
+VERSION_NAME=1.0.3
diff --git a/kalev-android/src/main/java/eu/bolt/kalev/AndroidFastLog.kt b/kalev-android/src/main/java/eu/bolt/kalev/AndroidFastLog.kt
new file mode 100644
index 0000000..4ad6d3c
--- /dev/null
+++ b/kalev-android/src/main/java/eu/bolt/kalev/AndroidFastLog.kt
@@ -0,0 +1,25 @@
+package eu.bolt.kalev
+
+import android.util.Log
+import eu.bolt.kalev.fast.FastLog
+import eu.bolt.kalev.utils.generateTag
+
+class AndroidFastLog : FastLog {
+
+ private val stackDepth = 3
+
+ override fun v(message: String, tag: String?) {
+ val finalTag = tag ?: generateTag(stackDepth)
+ Log.v(finalTag, message)
+ }
+
+ override fun d(message: String, tag: String?) {
+ val finalTag = tag ?: generateTag(stackDepth)
+ Log.d(finalTag, message)
+ }
+
+ override fun i(message: String, tag: String?) {
+ val finalTag = tag ?: generateTag(stackDepth)
+ Log.i(finalTag, message)
+ }
+}
diff --git a/kalev-android/src/main/java/eu/bolt/kalev/PrintPoeg.kt b/kalev-android/src/main/java/eu/bolt/kalev/PrintPoeg.kt
index 344c599..f30e955 100644
--- a/kalev-android/src/main/java/eu/bolt/kalev/PrintPoeg.kt
+++ b/kalev-android/src/main/java/eu/bolt/kalev/PrintPoeg.kt
@@ -1,14 +1,11 @@
package eu.bolt.kalev
-import android.os.Build
import android.util.Log
+import eu.bolt.kalev.utils.generateTag
import org.json.JSONObject
-import java.util.regex.Pattern
class PrintPoeg : Kalevipoeg {
- private val anonymousClassPattern = Pattern.compile("(\\$\\d+)+$")
- private val maxTagLength = 23
private val callStackIndex = 6
override fun log(entry: LogEntry) {
@@ -22,24 +19,7 @@ class PrintPoeg : Kalevipoeg {
}
private fun getTag(entry: LogEntry): String {
- return entry.tag ?: createStackElementTag()
- }
-
- private fun createStackElementTag(): String {
- val stackTrace = Throwable().stackTrace
- check(stackTrace.size > callStackIndex) { "Synthetic stacktrace didn't have enough elements: are you using proguard?" }
- val element = stackTrace[callStackIndex]
-
- var tag = element.className
- val matcher = anonymousClassPattern.matcher(tag)
- if (matcher.find()) {
- tag = matcher.replaceAll("")
- }
- tag = tag.substring(tag.lastIndexOf('.') + 1)
- // Tag length limit was removed in API 24.
- return if (tag.length <= maxTagLength || Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
- tag
- } else tag.substring(0, maxTagLength)
+ return entry.tag ?: generateTag(callStackIndex)
}
private fun LogEntry.formatString(): String {
diff --git a/kalev-android/src/main/java/eu/bolt/kalev/utils/TagGenerator.kt b/kalev-android/src/main/java/eu/bolt/kalev/utils/TagGenerator.kt
new file mode 100644
index 0000000..79d41fc
--- /dev/null
+++ b/kalev-android/src/main/java/eu/bolt/kalev/utils/TagGenerator.kt
@@ -0,0 +1,24 @@
+package eu.bolt.kalev.utils
+
+import android.os.Build
+import java.util.regex.Pattern
+
+private val anonymousClassPattern = Pattern.compile("(\\$\\d+)+$")
+private const val maxTagLength = 23
+
+internal fun generateTag(stackDepth: Int): String {
+ val stackTrace = Throwable().stackTrace
+ check(stackTrace.size > stackDepth) { "Synthetic stacktrace didn't have enough elements: are you using proguard?" }
+ val element = stackTrace[stackDepth]
+
+ var tag = element.className
+ val matcher = anonymousClassPattern.matcher(tag)
+ if (matcher.find()) {
+ tag = matcher.replaceAll("")
+ }
+ tag = tag.substring(tag.lastIndexOf('.') + 1)
+ // Tag length limit was removed in API 24.
+ return if (tag.length <= maxTagLength || Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ tag
+ } else tag.substring(0, maxTagLength)
+}
diff --git a/kalev-lib/src/main/java/eu/bolt/kalev/Kalev.kt b/kalev-lib/src/main/java/eu/bolt/kalev/Kalev.kt
index 8aa6206..02098df 100644
--- a/kalev-lib/src/main/java/eu/bolt/kalev/Kalev.kt
+++ b/kalev-lib/src/main/java/eu/bolt/kalev/Kalev.kt
@@ -1,5 +1,7 @@
package eu.bolt.kalev
+import eu.bolt.kalev.fast.FastLog
+
@Suppress("MemberVisibilityCanBePrivate", "unused")
object Kalev {
@@ -16,6 +18,11 @@ object Kalev {
var nop = false
private val nopEntry = NopLogEntry
+ /**
+ * FastLog can be used for performance-sensitive logging. Note that FastLog will NOT trigger log consumers
+ */
+ var fastLog: FastLog? = null
+
private val consumers = mutableListOf