001/*
002 * Copyright (c) 2010-2024 Mark Allen, Norbert Bartels.
003 *
004 * Permission is hereby granted, free of charge, to any person obtaining a copy
005 * of this software and associated documentation files (the "Software"), to deal
006 * in the Software without restriction, including without limitation the rights
007 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
008 * copies of the Software, and to permit persons to whom the Software is
009 * furnished to do so, subject to the following conditions:
010 *
011 * The above copyright notice and this permission notice shall be included in
012 * all copies or substantial portions of the Software.
013 *
014 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
015 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
016 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
017 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
018 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
019 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
020 * THE SOFTWARE.
021 */
022package com.restfb.logging;
023
024import java.util.Optional;
025import java.util.logging.Level;
026import java.util.logging.LogRecord;
027import java.util.logging.Logger;
028
029/**
030 * Logger implementation based on {@code java.util.logging}.
031 *
032 * The JUL configuration should be provided by a external application. The mapping is defined like:
033 * <ul>
034 * <li>trace maps to java.util.logging.Level.<i>FINER</i></li>
035 * <li>debug maps to java.util.logging.Level.<i>FINE</i></li>
036 * <li>info maps to java.util.logging.Level.<i>INFO</i></li>
037 * <li>warn maps to java.util.logging.Level.<i>WARNING</i></li>
038 * <li>error maps to java.util.logging.Level.<i>SEVERE</i></li>
039 * <li>fatal maps to java.util.logging.Level.<i>SEVERE</i></li>
040 * </ul>
041 */
042public class JulLogger extends RestFBLogger {
043
044  private final Logger logger;
045
046  public JulLogger(String logName) {
047    logger = Logger.getLogger(logName);
048  }
049
050  @Override
051  public void trace(String msg, Object... args) {
052    createLogMessage(Level.FINER, msg, args);
053  }
054
055  @Override
056  public void debug(String msg, Object... args) {
057    createLogMessage(Level.FINE, msg, args);
058  }
059
060  @Override
061  public void info(String msg, Object... args) {
062    createLogMessage(Level.INFO, msg, args);
063  }
064
065  @Override
066  public void warn(String msg, Object... args) {
067    createLogMessage(Level.WARNING, msg, args);
068  }
069
070  @Override
071  public void error(String msg, Object... args) {
072    createLogMessage(Level.SEVERE, msg, args);
073  }
074
075  @Override
076  public void fatal(String msg, Object... args) {
077    createLogMessage(Level.SEVERE, msg, args);
078  }
079
080  @Override
081  public boolean isDebugEnabled() {
082    return logger.isLoggable(Level.FINE);
083  }
084
085  @Override
086  public boolean isInfoEnabled() {
087    return logger.isLoggable(java.util.logging.Level.INFO);
088  }
089
090  @Override
091  public boolean isTraceEnabled() {
092    return logger.isLoggable(Level.FINER);
093  }
094
095  private void createLogMessage(Level level, String msg, Object[] args) {
096    if (logger.isLoggable(level)) {
097      JulMessage.MessageTuple tuple = JulMessage.convertMessageString(msg, args);
098      LogRecord logRecord = new LogRecord(level, tuple.getMessage());
099      Optional.ofNullable(tuple.getThrowable()).ifPresent(logRecord::setThrown);
100      logRecord.setSourceClassName(null);
101      logRecord.setSourceMethodName(null);
102      logRecord.setLoggerName(logger.getName());
103      logger.log(logRecord);
104    }
105  }
106}