Skip to content

A simple implementation of slf4j api using android java.util.logging.Logger

License

Notifications You must be signed in to change notification settings

bright/slf4android

Repository files navigation

slf4android

A simple implementation of SLF4J API using Android java.util.logging.*. This means you can easily hook in any existing java.util.logging.Handler implementations.

To use this little gem, make sure you have Maven Central in your repositories:

repositories {
    mavenCentral()
}

and then declare a dependency inside a module:

dependencies {
    // just SLF4J binding
    implementation("dev.bright.slf4android:slf4android:$slf4androidVersion")

    // (optional) a handler for file logging 
    implementation("dev.bright.slf4android:handler-file-log:$slf4androidVersion")

    // (optional) a handler for notifying the developer in case of an error 
    implementation("dev.bright.slf4android:handler-notify-developer:$slf4androidVersion")
}

As with any slf4j compatible implementation using slf4android looks like this:

class HomeActivity extends Activity {
    private static final Logger LOG = LoggerFactory.getLogger(HomeActivity.class.getSimpleName());

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LOG.debug("Hello from {} saved instance state {}", this, savedInstanceState);
    }
}

Logging to Crashlytics

Crashlytics has a nice feature of attaching log entries that were issued just before a crash. With slf4android it's easy to add a handler so that whenever a crash happens you get more insight as to what happened just before it.

To achieve that you need a custom handler:

import com.crashlytics.android.Crashlytics;
import java.util.logging.Handler;
import pl.brightinventions.slf4android.LogRecord;
import pl.brightinventions.slf4android.MessageValueSupplier;

public class CrashlyticsLoggerHandler extends Handler {
    MessageValueSupplier messageValueSupplier = new MessageValueSupplier();

    @Override
    public void publish(java.util.logging.LogRecord record) {
        LogRecord logRecord = LogRecord.fromRecord(record);
        StringBuilder messageBuilder = new StringBuilder();
        messageValueSupplier.append(logRecord, messageBuilder);
        String tag = record.getLoggerName();
        int androidLogLevel = logRecord.getLogLevel().getAndroidLevel();
        Crashlytics.log(androidLogLevel, tag, messageBuilder.toString());
    }

    @Override
    public void close() {
    }

    @Override
    public void flush() {
    }
}

That is added to root logger:

LoggerConfiguration.configuration()
        .removeRootLogcatHandler()
        .addHandlerToRootLogger(new CrashlyticsLoggerHandler());

Note that we remove a default logcat handler since Crashlytics will push messages to logcat too.

Logging to a file

To print messages to a separate file just add:

FileLogHandlerConfiguration fileHandler = FileLogHandlerConfiguration.create(this);
LoggerConfiguration.configuration().addHandlerToRootLogger(fileHandler);
String logFileName = fileHandler.getCurrentFileName();
// logFileName contains full path to logged file

inside your custom android.app.Application onCreate method. This will create rotated log files inside context.getApplicationInfo().dataDir with a name derived from context.getPackageName() and a default message pattern %date %level [%thread] %name - %message%newline

To change the location of log file you can use:

FileLogHandlerConfiguration fileHandler = FileLogHandlerConfiguration.create(this);

fileHandler.setFullFilePathPattern("/sdcard/your.package/my_log.%g.%u.log");

LoggerConfiguration.configuration().addHandlerToRootLogger(fileHandler);

About

A simple implementation of slf4j api using android java.util.logging.Logger

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •  

Languages