/*
* Copyright Ericsson AB 2011-2014. All Rights Reserved.
*
* The contents of this file are subject to the Lesser GNU Public License,
* (the "License"), either version 2.1 of the License, or
* (at your option) any later version.; you may not use this file except in
* compliance with the License. You should have received a copy of the
* License along with this software. If not, it can be
* retrieved online at https://www.gnu.org/licenses/lgpl.html. Moreover
* it could also be requested from Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
* WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
* EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
* OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND,
* EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
* LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE,
* YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
*
* IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
* WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
* REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
* DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
* DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY
* (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
* INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE
* OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH
* HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
*
*/
package com.ericsson.research.common.slf4jlogger;
import java.util.Date;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.service.log.LogService;
import org.slf4j.helpers.MarkerIgnoringBase;
import org.slf4j.helpers.MessageFormatter;
/**
* {@inheritDoc}
*/
public class OSGiLogger extends MarkerIgnoringBase {
private static final long serialVersionUID = 1L;
private static String createMessagePart(int logLevel, StackTraceElement stackTraceElement, String message) {
if (logLevel == LogService.LOG_INFO) {
return message;
}
if (stackTraceElement != null) {
return message + " ;; (" + "{" + Thread.currentThread().getName() + "} " + stackTraceElement.getClassName() + "."
+ stackTraceElement.getMethodName() + "#"
+ stackTraceElement.getLineNumber() + ") ";
} else {
return message;
}
}
private static String getLogLevelString(int logLevel) {
switch (logLevel) {
case LogService.LOG_ERROR:
return "ERROR";
case LogService.LOG_WARNING:
return "WARNING";
case LogService.LOG_DEBUG:
return "DEBUG";
case LogService.LOG_INFO:
return "INFO";
default:
return "UNKOWN";
}
}
private final boolean detailed;
{
detailed = Boolean.getBoolean("com.ericsson.osgilogger.detailed");
}
/**
* {@inheritDoc}
*/
@Override
public boolean isTraceEnabled() {
return true;
}
/**
* {@inheritDoc}
*/
@Override
public void trace(String msg) {
internalLog(LogService.LOG_DEBUG, msg, null);
}
/**
* {@inheritDoc}
*/
@Override
public void trace(String format, Object arg) {
String msgStr = MessageFormatter.format(format, arg).getMessage();
internalLog(LogService.LOG_DEBUG, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void trace(String format, Object arg1, Object arg2) {
String msgStr = MessageFormatter.format(format, arg1, arg2).getMessage();
internalLog(LogService.LOG_DEBUG, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void trace(String format, Object[] argArray) {
String msgStr = MessageFormatter.arrayFormat(format, argArray).getMessage();
internalLog(LogService.LOG_DEBUG, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void trace(String msg, Throwable t) {
internalLog(LogService.LOG_DEBUG, msg, t);
}
/**
* {@inheritDoc}
*/
@Override
public boolean isDebugEnabled() {
return true;
}
/**
* {@inheritDoc}
*/
@Override
public void debug(String msg) {
internalLog(LogService.LOG_DEBUG, msg, null);
}
/**
* {@inheritDoc}
*/
@Override
public void debug(String format, Object arg) {
String msgStr = MessageFormatter.format(format, arg).getMessage();
internalLog(LogService.LOG_DEBUG, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void debug(String format, Object arg1, Object arg2) {
String msgStr = MessageFormatter.format(format, arg1, arg2).getMessage();
internalLog(LogService.LOG_DEBUG, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void debug(String format, Object[] argArray) {
String msgStr = MessageFormatter.arrayFormat(format, argArray).getMessage();
internalLog(LogService.LOG_DEBUG, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void debug(String msg, Throwable t) {
internalLog(LogService.LOG_DEBUG, msg, t);
}
/**
* {@inheritDoc}
*/
@Override
public boolean isInfoEnabled() {
return true;
}
/**
* {@inheritDoc}
*/
@Override
public void info(String msg) {
internalLog(LogService.LOG_INFO, msg, null);
}
/**
* {@inheritDoc}
*/
@Override
public void info(String format, Object arg) {
String msgStr = MessageFormatter.format(format, arg).getMessage();
internalLog(LogService.LOG_INFO, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void info(String format, Object arg1, Object arg2) {
String msgStr = MessageFormatter.format(format, arg1, arg2).getMessage();
internalLog(LogService.LOG_INFO, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void info(String format, Object[] argArray) {
String msgStr = MessageFormatter.arrayFormat(format, argArray).getMessage();
internalLog(LogService.LOG_INFO, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void info(String msg, Throwable t) {
internalLog(LogService.LOG_INFO, msg, t);
}
/**
* {@inheritDoc}
*/
@Override
public boolean isWarnEnabled() {
return true;
}
/**
* {@inheritDoc}
*/
@Override
public void warn(String msg) {
internalLog(LogService.LOG_WARNING, msg, null);
}
/**
* {@inheritDoc}
*/
@Override
public void warn(String format, Object arg) {
String msgStr = MessageFormatter.format(format, arg).getMessage();
internalLog(LogService.LOG_WARNING, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void warn(String format, Object arg1, Object arg2) {
String msgStr = MessageFormatter.format(format, arg1, arg2).getMessage();
internalLog(LogService.LOG_WARNING, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void warn(String format, Object[] argArray) {
String msgStr = MessageFormatter.arrayFormat(format, argArray).getMessage();
internalLog(LogService.LOG_WARNING, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void warn(String msg, Throwable t) {
internalLog(LogService.LOG_WARNING, msg, t);
}
/**
* {@inheritDoc}
*/
@Override
public boolean isErrorEnabled() {
return true;
}
/**
* {@inheritDoc}
*/
@Override
public void error(String msg) {
internalLog(LogService.LOG_ERROR, msg, null);
}
/**
* {@inheritDoc}
*/
@Override
public void error(String format, Object arg) {
String msgStr = MessageFormatter.format(format, arg).getMessage();
internalLog(LogService.LOG_ERROR, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void error(String format, Object arg1, Object arg2) {
String msgStr = MessageFormatter.format(format, arg1, arg2).getMessage();
internalLog(LogService.LOG_ERROR, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void error(String format, Object[] argArray) {
String msgStr = MessageFormatter.arrayFormat(format, argArray).getMessage();
internalLog(LogService.LOG_ERROR, msgStr, null);
}
/**
* {@inheritDoc}
*/
@Override
public void error(String msg, Throwable t) {
internalLog(LogService.LOG_ERROR, msg, t);
}
/**
* Check the availability of the OSGI logging service, and use it is
* available. Does nothing otherwise.
*
* @param level
* @param message
* @param t
*/
private void internalLog(int level, Object message, Throwable t) {
LogService logservice = OSGILogFactory.getLogService();
ServiceReference serviceref = OSGILogFactory.getServiceReference();
StackTraceElement callerInfo = null;
if (detailed) {
callerInfo = Thread.currentThread().getStackTrace()[2];
}
if (logservice != null) {
try {
if (t != null) {
logservice.log(serviceref, level, createMessagePart(level, callerInfo, message + ""), t);
} else {
logservice.log(serviceref, level, createMessagePart(level, callerInfo, message + ""));
}
} catch (Exception exc) {
// Service may have become invalid, just ignore any error
// until the log service reference is updated by the
// log factory.
}
} else {
BundleContext bundleContext = OSGILogFactory.getContext();
Bundle bundle;
try {
bundle = bundleContext.getBundle();
} catch (Throwable t1) {
bundle = null;
}
System.out.println(
new Date() + " " + getLogLevelString(level)
+ (bundle != null ? " #" + bundle.getBundleId() + " " : "")
+ (bundle != null ? bundle.getSymbolicName() + " " : " ")
+ createMessagePart(level, callerInfo, message + ""));
if (t != null) {
t.printStackTrace();
}
}
}
}