Napier is a logger library for Kotlin Multiplatform.

Overview

logo

Napier is a logger library for Kotlin Multiplatform.
It supports for the android, ios, jvm, js.
Logs written in common module are displayed on logger viewer of each platform.

  • Android

format: [Class name]$[Method name]: [Your log]

uses the android.util.Log(Logcat)

preview-android

  • ios

format: [Date time][Symbol][Log level][Class name].[Method name] - [Your log]

uses the print

preview-ios

  • js

uses the console.log

preview-js

  • jvm

uses the java.util.logging.Logger

preview-jvm

  • common sample code
class Sample {

    fun hello(): String {
        Napier.v("Hello napier")
        Napier.d("optional tag", tag = "your tag")

        return "Hello Napier"
    }

    suspend fun suspendHello(): String {
        Napier.i("Hello")

        delay(3000L)

        Napier.w("Napier!")

        return "Suspend Hello Napier"
    }

    fun handleError() {
        try {
            throw Exception("throw error")
        } catch(e: Exception) {
            Napier.e("Napier Error", e)
        }
    }
}

Download

Repository

You can download this library from MavenCentral or jCenter repository.

  • Maven central

You can download this from 1.4.1.
Package name is io.github.aakira

repositories {
    mavenCentral() 
}
  • jCenter

You can download this until 1.4.1.
Package name is com.github.aakira

repositories {
    jCenter()
}

Version

Set the version name in your build.gradle

Maven Central

def napierVersion = "[latest version]"

Common

Add the dependency to your commonMain dependencies

  • groovy
sourceSets {
    commonMain {
        dependencies {
            // ...
            implementation "io.github.aakira:napier:$napierVersion"
        }
    }
}
  • kts
sourceSets {
    val commonMain by getting {
        dependencies {
            implementation("io.github.aakira:napier:$napierVersion")
        }
    }
}

Usage

How to use

Common module

// verbose log
Napier.v("Hello napier")

// you can set a tag for each log
Napier.d("optional tag", tag = "your tag")

try {
    ...
} catch(e: Exception) {
    // you can set the throwable
    Napier.e("Napier Error", e)
}

Initialize

You must initialize the Napier in your module.

Android

Napier.base(DebugAntilog())

iOS

  • Write initialize code in your kotlin mpp project.
fun debugBuild() {
    Napier.base(DebugAntilog())
}
  • Call initialize code from ios project.
NapierProxyKt.debugBuild()

Clear antilog

Napier.takeLogarithm()

Log level

Platform Sample
VERBOSE Napier.v()
DEBUG Napier.d()
INFO Napier.i()
WARNING Napier.w()
ERROR Napier.e()
ASSERT Napier.wtf()

Advancement

You can inject custom Antilog.
So, you should change Antilogs in debug build or release build.

Crashlytics

Crashlytics AntiLog samples

Sample projects use the Firebase Crashlytics.
You must set authentication files to android/google-services.json and ios/Napier/GoogleService-Info.plist.

Check the firebase document. [Android, iOS]

Write this in your application class.

if (BuildConfig.DEBUG) {
    // Debug build

    // disable firebase crashlytics
    FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(false)
    // init napier
    Napier.base(DebugAntilog())
} else {
    // Others(Release build)

    // enable firebase crashlytics
    FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)
    // init napier
    Napier.base(CrashlyticsAntilog(this))
}

Write this in your AppDelegate.

#if DEBUG
// Debug build

// init napier
NapierProxyKt.debugBuild()

#else
// Others(Release build)

// init firebase crashlytics
FirebaseApp.configure()

// init napier
NapierProxyKt.releaseBuild(antilog: CrashlyticsAntilog(
    crashlyticsAddLog: { priority, tag, message in
        Crashlytics.crashlytics().log("\(String(describing: tag)): \(String(describing: message))")
},
    crashlyticsSendLog: { throwable in
        Crashlytics.crashlytics().record(error: throwable)
}))
#endif

License

Copyright (C) 2019 A.Akira

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

Credit

This library is inspired by Timber.
I recommend use it if it supports kotlin multiplatform project. 😜

Thanks for advice.
@horita-yuya, @terachanple

Comments
  • How to remove W/System.err: Aug 21, 2020 4:33:38 PM com.github.aakira.napier.DebugAntilog performLog

    How to remove W/System.err: Aug 21, 2020 4:33:38 PM com.github.aakira.napier.DebugAntilog performLog

    Hello How to remove repeating message in Console and LogCat in Android Studio?

    W/System.err: Aug 21, 2020 4:33:38 PM com.github.aakira.napier.DebugAntilog performLog

    opened by schmidt9 12
  • Cannot access Antilog from swift.

    Cannot access Antilog from swift.

    Usecase: We want to create subclass of the Antilog abstract class in swift.

    The warning is the following:

    Imported declaration 'CommonNapierNapierLevel' could not be mapped to 'NapierNapier.Level'
    5:28
    __attribute__((swift_name("NapierNapier.Level")))
    

    Because of it we cannot use anything which relates to the Napier.Level enum from swift code, therefore the Antilog superclass is empty.

    As a workaround we created a similar class like the CrashlyticsAntilog in the example but would be better a bit if the library would not produce a warning.

    opened by stumi01 12
  • Failed to build with real iOS device

    Failed to build with real iOS device

    I got following error while building iOS app for real device.

    w: skipping /Users/user/.gradle/caches/modules-2/files-2.1/com.github.aakira/napier-ios/0.0.4/aa6805b163ff862b63e862f4e63fa7852ca4d751/napier-ios-0.0.4.klib. The target doesn't match. Expected 'ios_arm64', found [ios_x64]
    

    It looks like napier-ios artifact is for iOS simulator.

    Please consider either of these;

    • mention other iOS artifacts(napier-iosArm34 and napier-iosArm64) in README and add how we should use these three
    • make napier-ios ios common module, and let Gradle choose appropriate module depending on target iOS cpu architecture.

    https://repo.maven.apache.org/maven2/com/squareup/sqldelight/ios-driver/1.1.3/ this link is the example of iOS common artifact. As you can see, common module should include *.module file to choose appropriate artifact for different variants.

    opened by yshrsmz 9
  • feat(Napier): Add top-level function and some changes

    feat(Napier): Add top-level function and some changes

    Changes:

    • [x] Add Kdoc for Napier and update README.md
    • [x] Add a new function for wrapping Napier object.
    • [x] Change the input order of the log functions for better readability, especially for the lambda at the end.
    • [x] Fix duplicated issue.

    Please accept pull request.

    opened by ghasemdev 6
  • Unresolved reference: Napier

    Unresolved reference: Napier

    hi, i'm getting Unresolved reference: Napier when trying to run this library. This is my gradle setup:

      sourceSets["commonMain"].dependencies {
    
            // Logging
            implementation("com.github.aakira:napier:${ extra.get("napierVersion") }")
        }
    
     sourceSets["androidMain"].dependencies {
           
            // Logging
            implementation("com.github.aakira:napier-android:${ extra.get("napierVersion") }")
        }
    
    sourceSets["iosMain"].dependencies 
    
            // Logging
            implementation("com.github.aakira:napier-ios:${ extra.get("napierVersion") }")
        }
    

    i can import and use this library with no error in IDE, but when trying to compile i get the error.

    please help.

    opened by gotamafandy 6
  • Logging from another thread on iOS

    Logging from another thread on iOS

    Hi. I've tried to call Napier.v on iOS inside of withContext(Dispatchers.Default) i.e. from a non-main thread and didn't get anything logged. I see you use ThreadLocal annotation for Napier. And it seems on iOS I need to initialize Napier separately for Dispatchers.Default thread. Probably it worth adding support for logging from a non-main thread by default as now it looks like a bug.

    In this example, I see only the first message logged on iOS. But the both messages are logged on Android. If I add Napier initialization inside of Dispatchers.Default, the both messages will be logged on iOS too:

    suspend fun loadDefinition(word: String): OwlBotWord {
            Napier.v("Loading definition for: $word", tag = TAG)
    
            val res: HttpResponse = httpClient.get("${baseUrl}api/v4/dictionary/${word}")
            return withContext(Dispatchers.Default) {
                // If I initialize Napper here the second message will be logged
                val response = res.readBytes().decodeToString()
                if (res.status == HttpStatusCode.OK) {
                    Napier.v("Loded definition for: $word", tag = TAG)
                } else {
                    Napier.e("Status: ${res.status} response: $response", tag = TAG)
                }
                Json {
                    ignoreUnknownKeys = true
                }.decodeFromString(response)
            }
        }
    

    For now I've ended up with calling this on iOS in a setup function:

        private val defaultScope = CoroutineScope(Dispatchers.Default + SupervisorJob())
    
        actual fun setupDebug() {
            Napier.base(DebugAntilog())
    
            defaultScope.launch {
                Napier.base(DebugAntilog())
            }
        }
    
    opened by soniccat 5
  • baseArray replaced with atomic - fix logging from another thread on iOS #56

    baseArray replaced with atomic - fix logging from another thread on iOS #56

    This is fix for #56. The problem is in iOS concurrency, which I fixed by storing antilogs in an atomic list. In order to improve performance on all platforms except iOS AtomicRef is just container for a value, without additional thread safety - as it's not needed.

    opened by PhilipDukhov 4
  • Could not resolve com.github.aakira:napier-android:1.4.1

    Could not resolve com.github.aakira:napier-android:1.4.1

    Was wrong closing a previous issue, sorry

    Updated to version 1.4.1 from 1.3.9, tried to run a :commonCode:build task and got this

    ` Could not determine the dependencies of task ':commonCode:lint'. Could not resolve all artifacts for configuration ':commonCode:debugCompileClasspath'.

    Could not resolve com.github.aakira:napier-android:1.4.1. Required by: project :commonCode > No matching variant of com.github.aakira:napier-android:1.4.1 was found. The consumer was configured to find an API of a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug', attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm' but: - Variant 'android-releaseApiElements' capability com.github.aakira:napier-android:1.4.1 declares an API of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm': - Incompatible because this component declares a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'release' and the consumer needed a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug' - Variant 'android-releaseRuntimeElements' capability com.github.aakira:napier-android:1.4.1 declares a runtime of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm': - Incompatible because this component declares a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'release' and the consumer needed a component, as well as attribute 'com.android.build.api.attributes.BuildTypeAttr' with value 'debug' - Variant 'metadata-api' capability com.github.aakira:napier-android:1.4.1: - Incompatible because this component declares a usage of 'kotlin-metadata' of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'common' and the consumer needed an API of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm' - Other compatible attribute: - Doesn't say anything about com.android.build.api.attributes.BuildTypeAttr (required 'debug') - Variant 'metadata-commonMainMetadataElements' capability com.github.aakira:napier-android:1.4.1: - Incompatible because this component declares a usage of 'kotlin-api' of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'common' and the consumer needed an API of a component, as well as attribute 'org.jetbrains.kotlin.platform.type' with value 'androidJvm' - Other compatible attribute: - Doesn't say anything about com.android.build.api.attributes.BuildTypeAttr (required 'debug') `

    opened by amatsegor 4
  • 2.6.0  does not have android-related artifacts

    2.6.0 does not have android-related artifacts

    error log

    * What went wrong:
    Execution failed for task ':data:local:compileDebugKotlinAndroid'.
    > Error while evaluating property 'filteredArgumentsMap' of task ':data:local:compileDebugKotlinAndroid'
       > Could not resolve all files for configuration ':data:local:debugCompileClasspath'.
          > Could not find io.github.aakira:napier-android-debug:2.6.0.
            Required by:
                project :data:local > io.github.aakira:napier:2.6.0
    

    https://search.maven.org/artifact/io.github.aakira/napier-android https://search.maven.org/artifact/io.github.aakira/napier-android-debug

    opened by yshrsmz 3
  • Refact DebugAntilog null-safety for ios

    Refact DebugAntilog null-safety for ios

    Environment

    • Apple M1 + xcode with rosetta
    • Apple intel + xcode
    • iOS 15.2 iPhone 11 simulator

    Snippets

    common module

    fun initKoin() { ... Napier.d("initialized koin") }
    

    AppDelegate

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        ...
        NapierProxyKt.debugBuild()
        ...
        KoinKt.initKoin()
    

    Print Symbols

    0 null
    1 null
    2 null
    3 null
    4 null
    5 null
    6 null
    7 null
    8 null <<- is null
    9 null
    10 null
    11 null
    12  UIKitCore                           0x00000001227f5f2f -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 216
    13  UIKitCore                           0x00000001227f7b9f -[UIApplication _callInitializationDelegatesWithActions:forCanvas:payload:fromOriginatingProcess:] + 4115
    14  UIKitCore                           0x00000001227fd50e -[UIApplication _runWithMainScene:transitionContext:completion:] + 1221
    15  UIKitCore                           0x0000000121d79c7a -[_UISceneLifecycleMultiplexer completeApplicationLaunchWithFBSScene:transitionContext:] + 122
    16  UIKitCore                           0x00000001223661c6 _UIScenePerformActionsWithLifecycleActionMask + 88
    17  UIKitCore                           0x0000000121d7a771 __101-[_UISceneLifecycleMultiplexer
    

    Desc

    • No problem with the new install. but, if re-install(build) in xcode after change code then throw NullPointerException.
    • I check NSThread.callStackSymbols, it shown 'null' value.

    Solution

    • Antilog.performTag null-safety
    • I don't know why symbol value is null 😒
    opened by ColaGom 3
  • It's Hard to use with cocospoad

    It's Hard to use with cocospoad

    Please make a common module for iOS, for me I config the gradle like this:

    val iosMain by creating {
                dependsOn(commonMain)
                dependencies {
                    implementation("org.jetbrains.kotlinx:kotlinx-serialization-runtime-native:$serializationVersion")
                    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core-native:$coroutineVersion")
                    implementation("io.ktor:ktor-client-ios:$ktorVersion")
                    implementation("io.ktor:ktor-client-core-native:$ktorVersion")
                }
            }
            val iosTest by creating {
                dependsOn(commonTest)
            }
    
            iosArm32().compilations["test"].defaultSourceSet {
                dependsOn(iosTest)
            }
            iosArm32().compilations["main"].defaultSourceSet {
                dependsOn(iosMain)
                dependencies {
                    implementation("com.github.aakira:napier-iosArm32:$napierVersion")
                }
            }
            iosArm64().compilations["test"].defaultSourceSet {
                dependsOn(iosTest)
            }
            iosArm64().compilations["main"].defaultSourceSet {
                dependsOn(iosMain)
                dependencies {
                    implementation("com.github.aakira:napier-iosArm64:$napierVersion")
                }
            }
            iosX64().compilations["test"].defaultSourceSet {
                dependsOn(iosTest)
            }
            iosX64().compilations["main"].defaultSourceSet {
                dependsOn(iosMain)
                dependencies {
                    implementation("com.github.aakira:napier-ios:$napierVersion")
                }
            }
    

    And it could not be resolve in iosProject: image

    opened by wuseal 3
  • Bump tzinfo from 1.2.5 to 1.2.10 in /ios

    Bump tzinfo from 1.2.5 to 1.2.10 in /ios

    Bumps tzinfo from 1.2.5 to 1.2.10.

    Release notes

    Sourced from tzinfo's releases.

    v1.2.10

    TZInfo v1.2.10 on RubyGems.org

    v1.2.9

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    TZInfo v1.2.9 on RubyGems.org

    v1.2.8

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.

    TZInfo v1.2.8 on RubyGems.org

    v1.2.7

    • Fixed 'wrong number of arguments' errors when running on JRuby 9.0. #114.
    • Fixed warnings when running on Ruby 2.8. #112.

    TZInfo v1.2.7 on RubyGems.org

    v1.2.6

    • Timezone#strftime('%s', time) will now return the correct number of seconds since the epoch. #91.
    • Removed the unused TZInfo::RubyDataSource::REQUIRE_PATH constant.
    • Fixed "SecurityError: Insecure operation - require" exceptions when loading data with recent Ruby releases in safe mode.
    • Fixed warnings when running on Ruby 2.7. #106 and #111.

    TZInfo v1.2.6 on RubyGems.org

    Changelog

    Sourced from tzinfo's changelog.

    Version 1.2.10 - 19-Jul-2022

    Version 1.2.9 - 16-Dec-2020

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    Version 1.2.8 - 8-Nov-2020

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.

    Version 1.2.7 - 2-Apr-2020

    • Fixed 'wrong number of arguments' errors when running on JRuby 9.0. #114.
    • Fixed warnings when running on Ruby 2.8. #112.

    Version 1.2.6 - 24-Dec-2019

    • Timezone#strftime('%s', time) will now return the correct number of seconds since the epoch. #91.
    • Removed the unused TZInfo::RubyDataSource::REQUIRE_PATH constant.
    • Fixed "SecurityError: Insecure operation - require" exceptions when loading data with recent Ruby releases in safe mode.
    • Fixed warnings when running on Ruby 2.7. #106 and #111.
    Commits
    • 0814dcd Fix the release date.
    • fd05e2a Preparing v1.2.10.
    • b98c32e Merge branch 'fix-directory-traversal-1.2' into 1.2
    • ac3ee68 Remove unnecessary escaping of + within regex character classes.
    • 9d49bf9 Fix relative path loading tests.
    • 394c381 Remove private_constant for consistency and compatibility.
    • 5e9f990 Exclude Arch Linux's SECURITY file from the time zone index.
    • 17fc9e1 Workaround for 'Permission denied - NUL' errors with JRuby on Windows.
    • 6bd7a51 Update copyright years.
    • 9905ca9 Fix directory traversal in Timezone.get when using Ruby data source
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies ruby 
    opened by dependabot[bot] 0
  • Add an option to use compact tag format to DebugAntilog

    Add an option to use compact tag format to DebugAntilog

    Method name etc in the tag can be verbose in some cases.

    For example, error messages in the projects I'm working on are more or less unique. And there's no need for the detailed tags.

    It takes more time and cognitive efforts to read log lines with long tags. And in this case it doesn't seem to provide enough value to justify it.

    An option to use short tags seems like a reasonable addition. Class name as a tag would make logs look like default Android logs. Which is what lots of developers are used to. And those who prefer long tags would still be able to use them.

    Of course, there is an option to implement custom Antilog in a project. But it seems to be an extra effort multiplied by a number of platforms multiplied by a number of devs who prefer short tags :)

    Another option with writing short tags for each Napier call manually would also be not the most pleasant thing.

    What do you think?

    opened by Vlad-M-1 3
  • org.gradle.internal.resolve.ArtifactNotFoundException: Could not find napier-1.5.0-samplessources.jar (io.github.aakira:napier:1.5.0).

    org.gradle.internal.resolve.ArtifactNotFoundException: Could not find napier-1.5.0-samplessources.jar (io.github.aakira:napier:1.5.0).

    org.gradle.internal.resolve.ArtifactNotFoundException: Could not find napier-1.5.0-samplessources.jar (io.github.aakira:napier:1.5.0).

    Searched in the following locations: https://repo.maven.apache.org/maven2/io/github/aakira/napier/1.5.0/napier-1.5.0-samplessources.jar

    opened by Devmkamal 2
Releases(2.6.1)
Owner
Akira Aratani
Android, Kotlin, Flutter, Go https://twitter.com/_a_akira https://aakira.studio
Akira Aratani
Kotlin Multi Platform Logger, for android an ios : Logcat & print

Multiplatform Preferences Use a single object : Logger in your kotlin shared projects to display logs Note you can also use it in your real code on An

Florent CHAMPIGNY 49 Aug 22, 2022
Yakl - Yet Another Kotlin Logger

YAKL Yet Another Kotlin Logger. Motivation Current jvm loggers have some disadva

Mark Kosichkin 4 Jan 19, 2022
A logger with a small, extensible API which provides utility on top of Android's normal Log class.

This is a logger with a small, extensible API which provides utility on top of Android's normal Log class. I copy this class into all the little apps

Jake Wharton 9.9k Jan 8, 2023
An OkHttp interceptor which has pretty logger for request and response. +Mock support

LoggingInterceptor - Interceptor for OkHttp3 with pretty logger Usage val client = OkHttpClient.Builder() client.addInterceptor(LoggingInterceptor

ihsan BAL 1.3k Dec 26, 2022
βœ”οΈ Simple, pretty and powerful logger for android

Logger Simple, pretty and powerful logger for android Setup Download implementation 'com.orhanobut:logger:2.2.0' Initialize Logger.addLogAdapter(new A

Orhan Obut 13.5k Dec 30, 2022
Logger

StreamingAndroidLogger Introduction Convenient logger that adds support to having multiple different loggers and different log levels for each one of

Jan Rabe 46 Nov 29, 2022
Timber + Logger Integration. Make Logcat Prettier, show thread information and more.

Pretty Timber Android Logcat Timber + Logger Integration Video Instructions: https://youtu.be/zoS_i8VshCk Code App.kt class App : Application() {

Awesome Dev Notes | Android Dev Notes YouTube 29 Jun 6, 2022
Pluto Logger is a Pluto plugin to manage and share your Debug logs

Pluto Logger Plugin Pluto Logger is a Pluto plugin to manage and share your Debug logs. It also comes with Timber support. ?? Integrate plugin in your

Pluto 1 Feb 8, 2022
This is an Kotlin Library that enables Annotation-triggered method call logging for Kotlin Multiplatform.

This is an Kotlin Library that enables Annotation-triggered method call logging for Kotlin Multiplatform.

Jens Klingenberg 187 Dec 18, 2022
Kermit is a Kotlin Multiplatform logging utility with composable log outputs

Kermit is a Kotlin Multiplatform logging utility with composable log outputs. The library provides prebuilt loggers for outputting to platform logging tools such as Logcat and NSLog.

Touchlab 395 Jan 4, 2023
Kotlin multi-platform logging library with structured logging and coroutines support

Klogging Klogging is a pure-Kotlin logging library that aims to be flexible and easy to use. It uses Kotlin idioms for creating loggers and sending lo

Klogging 51 Dec 20, 2022
simple Kotlin logging: colorized logs for Kotlin on the JVM

sklog - simple Kotlin logging Kotlin (JVM) logging library for printing colorized text to the console, with an easy upgrade path to the popular kotlin

null 1 Jul 26, 2022
Gadget is a library that makes analytics tracking easier for android apps

gadget (In RC Stage) Gadget is a library that makes analytics tracking easier for android apps.

Taylan SabΔ±rcan 54 Nov 29, 2022
An in-display logging library for Android πŸ“²

Vlog provides an easy and convenient way to access logs right on your phone.

girish budhwani 121 Dec 26, 2022
Library that makes debugging, log collection, filtering and analysis easier.

AndroidLogger Android Library that makes debugging, log collection, filtering and analysis easier. Contains 2 modules: Logger: 'com.github.ShiftHackZ.

ShiftHackZ 2 Jul 13, 2022
FileLogger - a library for saving logs on Files with custom-formatter on background I/O threads, mobile-ready, android compatible,

The FileLogger is a library for saving logs on Files with custom-formatter on background I/O threads, mobile-ready, android compatible, powered by Java Time library for Android.

Abolfazl Abbasi 12 Aug 23, 2022
Jambo is an open source remote logging library

Jambo Jambo is an open source remote logging library. For those who would like to see their logs remotely on their android device Jambo is the library

Tabasumu 6 Aug 26, 2022
A tiny Kotlin API for cheap logging on top of Android's normal Log class.

A tiny Kotlin API for cheap logging on top of Android's normal Log class.

Square 849 Dec 23, 2022
A demonstration of Kotlin-logging with logback.

try-kotlin-logging A demonstration of Kotlin-logging with logback. Usage # output a log to STDOUT and file(myApp.log) $ ./gradlew run # => 2021-12-11

Hayato Tachikawa 1 Dec 13, 2021