222c232d357e358bf67bd0685b8331b71bb56f97JHKST/*
222c232d357e358bf67bd0685b8331b71bb56f97JHKST * CDDL HEADER START
222c232d357e358bf67bd0685b8331b71bb56f97JHKST *
222c232d357e358bf67bd0685b8331b71bb56f97JHKST * The contents of this file are subject to the terms of the
222c232d357e358bf67bd0685b8331b71bb56f97JHKST * Common Development and Distribution License (the "License").
222c232d357e358bf67bd0685b8331b71bb56f97JHKST * You may not use this file except in compliance with the License.
222c232d357e358bf67bd0685b8331b71bb56f97JHKST *
222c232d357e358bf67bd0685b8331b71bb56f97JHKST * See LICENSE.txt included in this distribution for the specific
222c232d357e358bf67bd0685b8331b71bb56f97JHKST * language governing permissions and limitations under the License.
222c232d357e358bf67bd0685b8331b71bb56f97JHKST *
222c232d357e358bf67bd0685b8331b71bb56f97JHKST * When distributing Covered Code, include this CDDL HEADER in each
222c232d357e358bf67bd0685b8331b71bb56f97JHKST * file and include the License file at LICENSE.txt.
222c232d357e358bf67bd0685b8331b71bb56f97JHKST * If applicable, add the following below this CDDL HEADER, with the
222c232d357e358bf67bd0685b8331b71bb56f97JHKST * fields enclosed by brackets "[]" replaced with your own identifying
222c232d357e358bf67bd0685b8331b71bb56f97JHKST * information: Portions Copyright [yyyy] [name of copyright owner]
222c232d357e358bf67bd0685b8331b71bb56f97JHKST *
222c232d357e358bf67bd0685b8331b71bb56f97JHKST * CDDL HEADER END
222c232d357e358bf67bd0685b8331b71bb56f97JHKST */
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco /*
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
222c232d357e358bf67bd0685b8331b71bb56f97JHKST */
222c232d357e358bf67bd0685b8331b71bb56f97JHKSTpackage org.opensolaris.opengrok.logger;
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKSTimport org.opensolaris.opengrok.logger.formatter.ConsoleFormatter;
222c232d357e358bf67bd0685b8331b71bb56f97JHKSTimport org.opensolaris.opengrok.logger.formatter.FileLogFormatter;
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKSTimport java.io.File;
222c232d357e358bf67bd0685b8331b71bb56f97JHKSTimport java.io.IOException;
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Koscoimport java.util.logging.ConsoleHandler;
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Koscoimport java.util.logging.FileHandler;
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Koscoimport java.util.logging.Formatter;
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Koscoimport java.util.logging.Handler;
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Koscoimport java.util.logging.Level;
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Koscoimport java.util.logging.LogManager;
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Koscoimport java.util.logging.Logger;
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST/**
222c232d357e358bf67bd0685b8331b71bb56f97JHKST * Utilities to maintain logging.
222c232d357e358bf67bd0685b8331b71bb56f97JHKST */
222c232d357e358bf67bd0685b8331b71bb56f97JHKSTpublic class LoggerUtil {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST private static final Logger LOGGER = LoggerFactory.getLogger(LoggerUtil.class);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST public static final String BASE_LOGGER = "org.opensolaris.opengrok";
222c232d357e358bf67bd0685b8331b71bb56f97JHKST private static final int DEFAULT_FILEHANDLER_LIMIT = 52428800;
222c232d357e358bf67bd0685b8331b71bb56f97JHKST private static final int DEFAULT_FILEHANDLER_COUNT = 3;
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST private static volatile String loggerFile = null;
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST public static Logger getBaseLogger() {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST return Logger.getLogger(BASE_LOGGER);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST public static void setBaseConsoleLogLevel(Level level) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST setBaseLogLevel(ConsoleHandler.class, level);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST public static Level getBaseConsoleLogLevel() {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST return getBaseLogLevel(ConsoleHandler.class);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST public static void setBaseFileLogLevel(Level level) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST setBaseLogLevel(FileHandler.class, level);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST public static Level getBaseFileLogLevel() {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST return getBaseLogLevel(FileHandler.class);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST private static void setBaseLogLevel(Class<? extends Handler> handlerClass, Level level) {
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco for (Handler handler : getBaseLogger().getHandlers()) {
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco if (handlerClass.isInstance(handler)) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST handler.setLevel(level);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST private static Level getBaseLogLevel(Class<? extends Handler> handlerClass) {
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco for (Handler handler : getBaseLogger().getHandlers()) {
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco if (handlerClass.isInstance(handler)) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST return handler.getLevel();
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST return Level.OFF;
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST public static String getFileHandlerPattern() {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST return LogManager.getLogManager().getProperty("java.util.logging.FileHandler.pattern");
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST public static void setFileHandlerLogPath(String path) throws IOException {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST if (path != null) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST File jlp = new File(path);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST if (!jlp.exists() && !jlp.mkdirs()) {
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco throw new IOException("could not make logpath: "
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco + jlp.getAbsolutePath());
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST StringBuilder logfile = new StringBuilder();
222c232d357e358bf67bd0685b8331b71bb56f97JHKST logfile.append(path == null ? "%t" : path);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST logfile.append(File.separatorChar).append("opengrok%g.%u.log");
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco for (Handler handler : getBaseLogger().getHandlers()) {
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco if (handler instanceof FileHandler) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST FileHandler fileHandler = (FileHandler) handler;
222c232d357e358bf67bd0685b8331b71bb56f97JHKST FileHandler newFileHandler;
222c232d357e358bf67bd0685b8331b71bb56f97JHKST try {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST int logFilesSizeLimit = loggerIntProperty("java.util.logging.FileHandler.limit", DEFAULT_FILEHANDLER_LIMIT);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST int logFilesCount = loggerIntProperty("java.util.logging.FileHandler.count", DEFAULT_FILEHANDLER_COUNT);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST newFileHandler = new FileHandler(logfile.toString(), logFilesSizeLimit, logFilesCount);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST } catch (IOException e) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST LOGGER.log(Level.WARNING, "Cannot create new logger FileHandler: " + logfile.toString(), e);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST return;
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST String formatter = LogManager.getLogManager().getProperty("java.util.logging.FileHandler.formatter");
222c232d357e358bf67bd0685b8331b71bb56f97JHKST newFileHandler.setLevel(fileHandler.getLevel());
222c232d357e358bf67bd0685b8331b71bb56f97JHKST try {
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco newFileHandler.setFormatter((Formatter) Class.forName(formatter).newInstance());
222c232d357e358bf67bd0685b8331b71bb56f97JHKST } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST newFileHandler.setFormatter(new FileLogFormatter());
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST getBaseLogger().addHandler(newFileHandler);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST getBaseLogger().removeHandler(fileHandler);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST loggerFile = logfile.toString();
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST public static String getFileHandlerLogPath() {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST return loggerFile != null ? loggerFile : LogManager.getLogManager().getProperty("java.util.logging.FileHandler.pattern");
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST private static int loggerIntProperty(String name, int def) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST String val = LogManager.getLogManager().getProperty(name);
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco if (val == null) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST return def;
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST try {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST return Integer.parseInt(val);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST } catch (NumberFormatException e) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST return def;
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST public static String initLogger(String logpath, Level filelevel, Level consolelevel) throws IOException {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST if (logpath != null) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST File jlp = new File(logpath);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST if (!jlp.exists() && !jlp.mkdirs()) {
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco throw new RuntimeException("could not make logpath: "
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco + jlp.getAbsolutePath());
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST if (!jlp.canWrite() && !Level.OFF.equals(filelevel)) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST throw new IOException("logpath not writeable " + jlp.getAbsolutePath());
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST Logger.getGlobal().setLevel(Level.OFF);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST getBaseLogger().setLevel(Level.ALL);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST StringBuilder logfile = new StringBuilder();
222c232d357e358bf67bd0685b8331b71bb56f97JHKST logfile.append(logpath == null ? "%t" : logpath);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST logfile.append(File.separatorChar).append("opengrok%g.%u.log");
222c232d357e358bf67bd0685b8331b71bb56f97JHKST try {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST FileHandler fh = new FileHandler(logfile.toString(),
222c232d357e358bf67bd0685b8331b71bb56f97JHKST loggerIntProperty("java.util.logging.FileHandler.limit", DEFAULT_FILEHANDLER_LIMIT),
222c232d357e358bf67bd0685b8331b71bb56f97JHKST loggerIntProperty("java.util.logging.FileHandler.count", DEFAULT_FILEHANDLER_COUNT));
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST fh.setLevel(filelevel);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST String formatter = LogManager.getLogManager().getProperty("java.util.logging.FileHandler.formatter");
222c232d357e358bf67bd0685b8331b71bb56f97JHKST try {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST fh.setFormatter((Formatter) Class.forName(formatter).newInstance());
222c232d357e358bf67bd0685b8331b71bb56f97JHKST } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST fh.setFormatter(new FileLogFormatter());
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST getBaseLogger().addHandler(fh);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST loggerFile = logfile.toString();
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
222c232d357e358bf67bd0685b8331b71bb56f97JHKST ConsoleHandler ch = new ConsoleHandler();
222c232d357e358bf67bd0685b8331b71bb56f97JHKST ch.setLevel(consolelevel);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST ch.setFormatter(new ConsoleFormatter());
222c232d357e358bf67bd0685b8331b71bb56f97JHKST getBaseLogger().addHandler(ch);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST
bf4379bb564a2928917ad5dac2fc88c788cbcbb5Lubos Kosco } catch (IOException | SecurityException ex1) {
222c232d357e358bf67bd0685b8331b71bb56f97JHKST LOGGER.log(Level.SEVERE, "Exception logging", ex1);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST throw new IOException("Exception setting up logging " + ex1);
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST return logpath;
222c232d357e358bf67bd0685b8331b71bb56f97JHKST }
222c232d357e358bf67bd0685b8331b71bb56f97JHKST}