Skip to content

Commit

Permalink
Provide FileLogger
Browse files Browse the repository at this point in the history
Resolves #23
  • Loading branch information
saschpe committed Mar 23, 2024
1 parent b662dea commit 5e063f8
Show file tree
Hide file tree
Showing 10 changed files with 168 additions and 0 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Changed
- Allow empty log messages if you only want to create a log entry about a function being called.
- Add more Apple ARM64 platforms: macOS, tvOS, watchOS
- Provide FileLogger in addition to ConsoleLogger
- Dependency update:
- [Kotlin 1.9.23](https://kotlinlang.org/docs/whatsnew19.html)
- [Gradle-8.7](https://docs.gradle.org/8.7/release-notes.html)
Expand Down
4 changes: 4 additions & 0 deletions log4k/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ kotlin {
applyDefaultHierarchyTemplate()

sourceSets {
commonMain.dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.6.0-RC.2")
implementation("org.jetbrains.kotlinx:kotlinx-io-core:0.3.2")
}
commonTest.dependencies {
implementation(kotlin("test"))
}
Expand Down
10 changes: 10 additions & 0 deletions log4k/src/androidMain/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<application>
<provider
android:name=".internal.ContextProvider"
android:authorities="${applicationId}.context_provider"
android:exported="false" />
</application>
</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package saschpe.log4k

import kotlinx.io.files.Path
import saschpe.log4k.internal.ContextProvider.Companion.applicationContext

internal actual val defaultLogPath: Path
get() = Path(applicationContext.cacheDir.path)

Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package saschpe.log4k.internal

import android.annotation.SuppressLint
import android.content.ContentProvider
import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.net.Uri

/**
* Hidden initialization content provider.
*
* Does not provide real content but hides initialization boilerplate from the library user.
*
* @link https://firebase.googleblog.com/2016/12/how-does-firebase-initialize-on-android.html
*/
internal class ContextProvider : ContentProvider() {
/**
* Called exactly once before Application.onCreate()
*/
override fun onCreate(): Boolean {
applicationContext = context?.applicationContext ?: throw Exception("Need the context")
return true
}

override fun insert(uri: Uri, values: ContentValues?): Uri? = null

override fun query(
uri: Uri, projection: Array<out String>?, selection: String?, args: Array<out String>?, sortOrder: String?
): Cursor? = null

override fun update(uri: Uri, values: ContentValues?, selection: String?, args: Array<out String>?): Int = 0

override fun delete(uri: Uri, selection: String?, args: Array<out String>?): Int = 0

override fun getType(uri: Uri): String? = null

companion object {
@SuppressLint("StaticFieldLeak")
lateinit var applicationContext: Context
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package saschpe.log4k

import org.junit.Test

class ConsoleLoggerTest {
@Test
fun foo() {
Log.debug { "hello" }
}
}
7 changes: 7 additions & 0 deletions log4k/src/appleMain/kotlin/saschpe/log4k/FileLogger.ios.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package saschpe.log4k

import kotlinx.io.files.Path
import kotlinx.io.files.SystemTemporaryDirectory

internal actual val defaultLogPath: Path
get() = SystemTemporaryDirectory
72 changes: 72 additions & 0 deletions log4k/src/commonMain/kotlin/saschpe/log4k/FileLogger.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package saschpe.log4k

import kotlinx.io.files.Path
import kotlinx.io.files.SystemFileSystem

internal expect val defaultLogPath: Path

class FileLogger(
private val rotation: Rotate = Rotate.Daily,
private val logPath: Path = defaultLogPath
) : Logger() {
override fun print(level: Log.Level, tag: String, message: String?, throwable: Throwable?) {
var logTag = tag.ifEmpty { getTraceTag() }

val logFile: Path = rotation.logFile(logPath)
// logFile.writeText("${level.name.first()}/$logTag: $message")
// throwable?.let { logFile.writeText("$throwable") }
}

private fun getTraceTag(): String {
// val trace = Exception().stackTrace[6]
// val className = trace.className.split(".").last()
// return "$className.${trace.methodName}"
return "foo"
}

sealed class Rotate {
internal abstract fun logFile(logPath: Path): Path

data object Daily : Rotate() {
override fun logFile(logPath: Path): Path {
val logFile = "daily.txt" // "daily.${DateFormat.format("yyyy-MM-dd", Date().time)}.txt"
return Path(logPath, logFile).apply { SystemFileSystem.createDirectories(this) }
}
}

class After(private val lines: Int = 10000) : Rotate() {
override fun logFile(logPath: Path): Path {
val logFile = Path(logPath, "log.txt")
val foes = if (SystemFileSystem.exists(logFile)/* && logFile.lines > lines*/) {
// val now = DateFormat.format("yyyy-MM-dd_HH-mm-ss", Date().time)
// logFile.renameTo(File(logPath, "log.$now.txt"))
Path(logPath, "log.txt")
} else {
logFile
}

return foes.apply { SystemFileSystem.createDirectories(this) }
}

// private val File.lines: Int
// get() {
// var lines = 0
// val fis = FileInputStream(this)
// val buffer = ByteArray(BUFFER_SIZE)
// var read: Int
// while (fis.read(buffer).also { read = it } != -1) {
// for (i in 0 until read) {
// if (buffer[i] == '\n'.code.toByte())
// lines++
// }
// }
// fis.close()
// return lines
// }

companion object {
private const val BUFFER_SIZE = 8 * 1024
}
}
}
}
7 changes: 7 additions & 0 deletions log4k/src/jsMain/kotlin/saschpe/log4k/FileLogger.js.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package saschpe.log4k

import kotlinx.io.files.Path
import kotlinx.io.files.SystemTemporaryDirectory

internal actual val defaultLogPath: Path
get() = SystemTemporaryDirectory
7 changes: 7 additions & 0 deletions log4k/src/jvmMain/kotlin/saschpe/log4k/FileLogger.jvm.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package saschpe.log4k

import kotlinx.io.files.Path
import kotlinx.io.files.SystemTemporaryDirectory

internal actual val defaultLogPath: Path
get() = SystemTemporaryDirectory

0 comments on commit 5e063f8

Please sign in to comment.