/*
* Copyright (c) 2012 Socialize Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package com.socialize.log;
import android.content.Context;
import android.util.Log;
import com.socialize.config.SocializeConfig;
import com.socialize.util.StringUtils;
/**
* @author Jason Polites
*
*/
public class SocializeLogger {
public static enum LogLevel {VERBOSE,DEBUG,INFO,WARN,ERROR}
public static String LOG_TAG = "Socialize";
public static final int INITIALIZE_FAILED = 0;
public static final int NOT_INITIALIZED = 1;
public static final int NOT_AUTHENTICATED = 2;
public static final int NO_CONFIG = 3;
public static final int NO_UDID = 4;
public static final int ERROR_CODE_LOAD_FAIL = 5;
private LogLevel logLevel = LogLevel.WARN;
private SocializeConfig config;
private boolean logThread = true;
private boolean initialized = false;
private ExternalLogger externalLogger;
public SocializeLogger() {
super();
}
public SocializeLogger(LogLevel level) {
super();
this.logLevel = level;
}
public void init(Context context, SocializeConfig config) {
if(config.isDiagnosticLoggingEnabled() && externalLogger == null) {
externalLogger = newExternalLogger();
externalLogger.init(context);
}
String ll = config.getProperty(SocializeConfig.LOG_LEVEL);
logThread = config.getBooleanProperty(SocializeConfig.LOG_THREAD, true);
if(!StringUtils.isEmpty(ll)) {
logLevel = LogLevel.valueOf(ll);
}
String tag = config.getProperty(SocializeConfig.LOG_TAG);
if(!StringUtils.isEmpty(tag)) {
LOG_TAG = tag;
}
this.config = config;
this.initialized = true;
}
// Mockable
protected ExternalLogger newExternalLogger() {
return new AsyncSDCardExternalLogger();
}
public void destroy() {
if(externalLogger != null) {
externalLogger.destroy();
externalLogger = null;
}
}
public ExternalLogger getExternalLogger() {
return externalLogger;
}
public void setExternalLogger(ExternalLogger externalLogger) {
this.externalLogger = externalLogger;
}
public void setLogLevel(LogLevel logLevel) {
this.logLevel = logLevel;
}
public void debug(int messageId) {
debug(getMessage(messageId));
}
public void info(int messageId) {
info(getMessage(messageId));
}
public void warn(int messageId) {
warn(getMessage(messageId));
}
public void error(int messageId) {
error(getMessage(messageId));
}
public void warn(int messageId, Throwable error) {
warn(getMessage(messageId), error);
}
public void error(int messageId, Throwable error) {
error(getMessage(messageId), error);
}
public void debug(String msg) {
msg = getMessage(msg);
d(msg);
if(externalLogger != null && externalLogger.canWrite()) {
externalLogger.log(LogLevel.DEBUG, System.currentTimeMillis(), LOG_TAG, msg);
}
}
public void debug(String msg, Throwable error) {
msg = getMessage(msg);
d(msg, error);
if(externalLogger != null && externalLogger.canWrite()) {
externalLogger.log(LogLevel.DEBUG, System.currentTimeMillis(), LOG_TAG, msg);
}
}
public void info(String msg) {
msg = getMessage(msg);
i(msg);
if(externalLogger != null && externalLogger.canWrite()) {
externalLogger.log(LogLevel.INFO, System.currentTimeMillis(), LOG_TAG, msg);
}
}
public void warn(String msg) {
msg = getMessage(msg);
w(msg);
if(externalLogger != null && externalLogger.canWrite()) {
externalLogger.log(LogLevel.WARN, System.currentTimeMillis(), LOG_TAG, msg);
}
}
public void error(String msg) {
msg = getMessage(msg);
e(msg);
if(externalLogger != null && externalLogger.canWrite()) {
externalLogger.log(LogLevel.ERROR, System.currentTimeMillis(), LOG_TAG, msg);
}
}
public void warn(String msg, Throwable error) {
msg = getMessage(msg);
w(msg, error);
if(externalLogger != null && externalLogger.canWrite()) {
externalLogger.log(LogLevel.WARN, System.currentTimeMillis(), LOG_TAG, msg, error);
}
}
public void error(String msg, Throwable error) {
msg = getMessage(msg);
e(msg, error);
if(externalLogger != null && externalLogger.canWrite()) {
externalLogger.log(LogLevel.ERROR, System.currentTimeMillis(), LOG_TAG, msg, error);
}
}
public boolean isVerboseEnabled() {
return logLevel.ordinal() <= LogLevel.VERBOSE.ordinal();
}
public boolean isDebugEnabled() {
return logLevel.ordinal() <= LogLevel.DEBUG.ordinal();
}
public boolean isInfoEnabled() {
return logLevel.ordinal() <= LogLevel.INFO.ordinal();
}
public boolean isWarnEnabled() {
return logLevel.ordinal() <= LogLevel.WARN.ordinal();
}
public boolean isInitialized() {
return initialized;
}
protected String getMessage(String message) {
if(logThread) {
return "Thread[" +
Thread.currentThread().getName() +
"]: " + message;
}
else {
return message;
}
}
public String getMessage(int id) {
if(this.config != null) {
String msg = this.config.getProperty(SocializeConfig.LOG_MSG + id);
if(msg == null) {
msg = "";
}
return getMessage(msg);
}
else {
return getMessage("Log System Error! The log system has not been initialized correctly. No config found.");
}
}
public boolean isLogThread() {
return logThread;
}
public void setLogThread(boolean logThread) {
this.logThread = logThread;
}
public LogLevel getLogLevel() {
return logLevel;
}
public static void d(String msg) {
Log.d(LOG_TAG, msg);
}
public static void d(String msg, Throwable error) {
Log.d(LOG_TAG, msg, error);
}
public static void i(String msg) {
Log.i(LOG_TAG, msg);
}
public static void e(String msg, Throwable error) {
Log.e(LOG_TAG, msg, error);
}
public static void e(String msg) {
Log.e(LOG_TAG, msg);
}
public static void w(String msg, Throwable error) {
Log.w(LOG_TAG, msg, error);
}
public static void w(String msg) {
Log.w(LOG_TAG, msg);
}
}