/* * 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.jena.atlas.logging.java; import java.text.MessageFormat ; import java.util.Date ; import java.util.logging.Formatter ; import java.util.logging.Level ; import java.util.logging.LogManager ; import java.util.logging.LogRecord ; /** A pattern-driven log formatter. * inspired by Log4j's PatternLayout * Set a different output pattern with {@code .format}. * <p> * The default format is {@code "%5$tT %3$-5s %2$-20s :: %6$s\n"}. * <p> * Examples: * <ul> * <li>"%5$tT.%5$tL %3$-5s %2$-20s :: %6$s\n" for milliseconds. * <li>"%tF %5$tT.%5$tL %3$-5s %2$-20s :: %6$s\n" for date * </ul> * <p> * The log message formatting call is: * <pre> * String.format(format, * loggerName, // 1 * loggerNameShort, // 2 * levelOutputName, // 3 * Thread.currentThread().getName(), // 4 * new Date(record.getMillis()), // 5 * formatted$) ; // 6 * </pre> * where {@code formatted$} is the {@link LogRecord} message string after parameters have been processed. */ public class TextFormatter extends Formatter { // %tT (%5$tT) is %5$tH:%5$tM:%5$tS // %tF is 2008-11-22 "%tY-%tm-%td" private static final String dftformat = "%5$tT %3$-5s %2$-20s :: %6$s\n" ; private String format = dftformat ; public TextFormatter() { LogManager manager = LogManager.getLogManager() ; String cname = getClass().getName(); String fmt = manager.getProperty(cname+".format") ; if ( fmt != null ) { if ( ! fmt.endsWith("\n") ) fmt = fmt + "\n" ; format = fmt ; } } /** programmatic setup - provide the format */ public TextFormatter(String fmt) { if ( ! fmt.endsWith("\n") ) fmt = fmt + "\n" ; format = fmt ; } @Override public String format(LogRecord record) { String loggerName = record.getLoggerName(); if(loggerName == null) { loggerName = "root"; } int i = loggerName.lastIndexOf('.') ; String loggerNameShort = loggerName.substring(i+1) ; String formatted$ = record.getMessage() ; if ( record.getParameters() != null ) formatted$ = MessageFormat.format(formatted$, record.getParameters()) ; Level level = record.getLevel() ; String levelOutputName = levelOutputName(level) ; return String.format(format, loggerName, // 1 loggerNameShort, // 2 levelOutputName, // 3 Thread.currentThread().getName(), // 4 new Date(record.getMillis()), // 5 formatted$) ; // 6 } /** By default use slf4j name. * When used with slf4j, this reconstructs the slf4j name. */ protected String levelOutputName(Level level) { // FINEST -> TRACE // FINER -> DEBUG // FINE -> DEBUG // CONFIG -> INFO // INFO -> INFO // WARNING -> WARN // SEVERE -> ERROR if ( Level.WARNING.equals(level) ) return "WARN" ; if ( Level.SEVERE.equals(level) ) return "ERROR" ; if ( Level.INFO.equals(level) ) return "INFO" ; if ( Level.CONFIG.equals(level) ) // Keep name. return "CONFIG" ; if ( Level.FINE.equals(level) ) return "DEBUG" ; if ( Level.FINER.equals(level) ) return "DEBUG" ; if ( Level.FINEST.equals(level) ) return "TRACE" ; return level.getName() ; } }