/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.apache.ambari.scom.logging;
import org.eclipse.persistence.logging.AbstractSessionLog;
import org.eclipse.persistence.logging.EclipseLinkLogRecord;
import org.eclipse.persistence.logging.SessionLogEntry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.logging.Formatter;
import java.util.logging.Level;
import java.util.logging.SimpleFormatter;
/**
* Logger for JPA log messages.
*/
public class JpaLogger extends AbstractSessionLog {
/**
* The formatter.
*/
private final Formatter formatter = new SimpleFormatter();
/**
* The log level.
*/
public Level logLevel = Level.WARNING;
// ----- Constants ---------------------------------------------------------
/**
* The logger.
*/
private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(JpaLogger.class);
/**
* The java log levels.
*/
public static final Level[] JAVA_LOG_LEVELS = new Level[]{
Level.ALL, Level.FINEST, Level.FINER,
Level.FINE, Level.CONFIG, Level.INFO,
Level.WARNING, Level.SEVERE, Level.OFF
};
// ----- AbstractSessionLog ------------------------------------------------
@Override
public void log(SessionLogEntry sessionLogEntry) {
Logger logger = getLogger();
switch (sessionLogEntry.getLevel()) {
case SEVERE:
logger.error(getLogMessage(sessionLogEntry));
break;
case WARNING:
logger.warn(getLogMessage(sessionLogEntry));
break;
case INFO:
case CONFIG:
logger.info(getLogMessage(sessionLogEntry));
break;
case FINE:
case FINER:
case FINEST:
logger.debug(getLogMessage(sessionLogEntry));
break;
case ALL:
logger.trace(getLogMessage(sessionLogEntry));
break;
}
}
@Override
public void throwing(Throwable throwable) {
getLogger().error(null, throwable);
}
@Override
public boolean shouldLog(int level, String category) {
return getJavaLogLevel(level).intValue() >= logLevel.intValue();
}
// ----- accessors ---------------------------------------------------------
/**
* Get the log level.
*
* @return the log level
*/
public Level getLogLevel() {
return logLevel;
}
/**
* Set the log level.
*
* @param logLevel the log level
*/
public void setLogLevel(Level logLevel) {
this.logLevel = logLevel;
}
/**
* Get the associated logger.
*
* @return the logger
*/
protected org.slf4j.Logger getLogger() {
return LOG;
}
/**
* Get the associated formatter.
*
* @return the formatter
*/
protected Formatter getFormatter() {
return formatter;
}
// ----- helper methods ----------------------------------------------------
// gets the log message from the given session log entry
private String getLogMessage(SessionLogEntry sessionLogEntry) {
return getFormatter().format(getLogRecord(sessionLogEntry,
getJavaLogLevel(sessionLogEntry.getLevel())));
}
// get a log record for the given session log entry
private EclipseLinkLogRecord getLogRecord(SessionLogEntry sessionLogEntry, Level level) {
EclipseLinkLogRecord logRecord =
new EclipseLinkLogRecord(level, formatMessage(sessionLogEntry));
logRecord.setLoggerName(sessionLogEntry.getNameSpace());
logRecord.setShouldPrintDate(shouldPrintDate());
logRecord.setShouldPrintThread(shouldPrintThread());
Throwable exception = sessionLogEntry.getException();
if (exception != null) {
logRecord.setThrown(exception);
logRecord.setShouldLogExceptionStackTrace(shouldLogExceptionStackTrace());
}
if (shouldPrintConnection()) {
logRecord.setConnection(sessionLogEntry.getConnection());
}
if (shouldPrintSession()) {
logRecord.setSessionString(getSessionString(sessionLogEntry.getSession()));
}
return logRecord;
}
// get the Java log level for the given eclipse log level
private static Level getJavaLogLevel(int level) {
return level >= ALL && level <= OFF ? JAVA_LOG_LEVELS[level] : Level.OFF;
}
}