/** * 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.server.logging; import org.eclipse.persistence.logging.AbstractSessionLog; import org.eclipse.persistence.logging.SessionLog; import org.eclipse.persistence.logging.SessionLogEntry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The {@link EclipseLinkLogger} is a bridge between EclipseLink's internal * logging framework and SLF4J. EclipseLink does not have a rolling log, which * means that the standard output file can grow large and cause disk space * issues. This logger translates the following log levels: * <table> * <tr> * <td>EclipseLink</td> * <td>SLF4J</td> * </tr> * <tr> * <td>ALL</td> * <td>TRACE</td> * </tr> * <tr> * <td>FINER</td> * <td>TRACE</td> * </tr> * <tr> * <td>FINEST</td> * <td>TRACE</td> * </tr> * <tr> * <td>FINE</td> * <td>DEBUG</td> * </tr> * <tr> * <td>INFO</td> * <td>INFO</td> * </tr> * <tr> * <td>CONFIG</td> * <td>INFO</td> * </tr> * <tr> * <td>SEVERE</td> * <td>ERROR</td> * </tr> * <tr> * <td>WARNING</td> * <td>WARN</td> * </tr> * <tr> * <td>OFF</td> * <td>-</td> * </tr> * </table> * <p/> * Logging is still configured for EclipseLink via {@code persistence.xml}. */ public class EclipseLinkLogger extends AbstractSessionLog implements SessionLog { /** * A logger that is only for creating a bridge between EclipseLink's internal * logger and log4j. */ private static final Logger JPA_LOG = LoggerFactory.getLogger("eclipselink"); /** * The log template to use to create statements similar to EclipseLink's * internal logger. */ private static final String LOG_TEMPLATE = "[EL {}]: {} {}"; @Override public void log(SessionLogEntry sessionLogEntry) { // use the EclipseLink log level to determine if this should be logged int level = sessionLogEntry.getLevel(); if (!shouldLog(level, sessionLogEntry.getNameSpace())) { return; } switch (level) { case SessionLog.ALL: case SessionLog.FINER: case SessionLog.FINEST: JPA_LOG.trace(LOG_TEMPLATE, "Trace", getSupplementDetailString(sessionLogEntry), formatMessage(sessionLogEntry)); return; case SessionLog.INFO: case SessionLog.CONFIG: JPA_LOG.info(LOG_TEMPLATE, "Info", getSupplementDetailString(sessionLogEntry), formatMessage(sessionLogEntry)); return; case SessionLog.FINE: JPA_LOG.debug(LOG_TEMPLATE, "Debug", getSupplementDetailString(sessionLogEntry), formatMessage(sessionLogEntry)); return; case SessionLog.SEVERE: // always log JPA_LOG.error(LOG_TEMPLATE, "Error", getSupplementDetailString(sessionLogEntry), formatMessage(sessionLogEntry)); return; case SessionLog.WARNING: JPA_LOG.warn(LOG_TEMPLATE, "Warning", getSupplementDetailString(sessionLogEntry), formatMessage(sessionLogEntry)); return; case SessionLog.OFF: // never log return; default: JPA_LOG.debug(LOG_TEMPLATE, "Unknown", getSupplementDetailString(sessionLogEntry), formatMessage(sessionLogEntry)); return; } } }