package com.github.tony19.rollingfileappender;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import ch.qos.logback.core.rolling.RollingFileAppender;
import ch.qos.logback.core.rolling.TimeBasedRollingPolicy;
import ch.qos.logback.core.status.OnConsoleStatusListener;
import ch.qos.logback.core.util.StatusPrinter;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
/**
* This activity demonstrates time-based rollover by the RollingFileAppender,
* using logback-android's code-based configuration to write logs to
* /sdcard/logback/ at startup.
*/
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
configureLogback();
writeLogs();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
/**
* Writes dummy logs to demonstrate the file rollover in RollingFileAppender.
* Files are written to /sdcard/logback/.
*/
private void writeLogs() {
Logger log = LoggerFactory.getLogger(this.getLocalClassName());
final String TAG = getLocalClassName();
final int MAX_TIME_MS = 10000;
final int SLEEP_TIME_MS = 300;
Log.d(TAG, "starting count");
for (int i =0; i < MAX_TIME_MS / SLEEP_TIME_MS; i++) {
Log.d(TAG, "logging index via logback-android");
log.info("" + i);
try {
Log.v(TAG, "sleeping...");
Thread.sleep(SLEEP_TIME_MS);
} catch (InterruptedException e) {
e.printStackTrace();
break;
}
}
Log.d(TAG, "done");
}
/**
* Configures logback-android RollingFileAppender to rollover if
* a log event occurs after the second-boundary.
*/
private void configureLogback() {
// reset the default context (which may already have been initialized)
// since we want to reconfigure it
LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
context.reset();
// Enable debugging to show rollover status
OnConsoleStatusListener.addNewInstanceToContext(context);
final String LOG_DIR = "/sdcard/logback";
RollingFileAppender<ILoggingEvent> rollingFileAppender = new RollingFileAppender<ILoggingEvent>();
rollingFileAppender.setAppend(true);
rollingFileAppender.setContext(context);
// OPTIONAL: Set an active log file (separate from the rollover files).
// If rollingPolicy.fileNamePattern already set, you don't need this.
rollingFileAppender.setFile(LOG_DIR + "/log.txt");
// Set the periodicity to seconds. That is, if a log event occurs after the
// second-boundary, the log file will rollover.
final String PERIODICITY = "yyyy-MM-dd_HH-mm-ss";
TimeBasedRollingPolicy<ILoggingEvent> rollingPolicy = new TimeBasedRollingPolicy<ILoggingEvent>();
rollingPolicy.setFileNamePattern(LOG_DIR + "/log.%d{"+ PERIODICITY +"}.txt");
rollingPolicy.setMaxHistory(5); // no more than 5 rollover files (delete oldest)
rollingPolicy.setParent(rollingFileAppender); // parent and context required!
rollingPolicy.setContext(context);
rollingPolicy.start();
rollingFileAppender.setRollingPolicy(rollingPolicy);
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setPattern("%logger{35} - %msg%n");
encoder.setContext(context);
encoder.start();
rollingFileAppender.setEncoder(encoder);
rollingFileAppender.start();
// add the newly created appenders to the root logger;
// qualify Logger to disambiguate from org.slf4j.Logger
ch.qos.logback.classic.Logger root = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
root.setLevel(Level.TRACE);
root.addAppender(rollingFileAppender);
}
}