OpenGrokLogger.java revision 1178
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass/*
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * CDDL HEADER START
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * The contents of this file are subject to the terms of the
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Common Development and Distribution License (the "License").
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * You may not use this file except in compliance with the License.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * See LICENSE.txt included in this distribution for the specific
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * language governing permissions and limitations under the License.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * When distributing Covered Code, include this CDDL HEADER in each
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * file and include the License file at LICENSE.txt.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * If applicable, add the following below this CDDL HEADER, with the
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * fields enclosed by brackets "[]" replaced with your own identifying
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * information: Portions Copyright [yyyy] [name of copyright owner]
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * CDDL HEADER END
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai
45be43296becb0d27a3414d29d9b4e3a1e3448b4Derek Gathright/*
45be43296becb0d27a3414d29d9b4e3a1e3448b4Derek Gathright * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glasspackage org.opensolaris.opengrok;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassimport java.io.File;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassimport java.io.IOException;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassimport java.util.Enumeration;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassimport java.util.logging.ConsoleHandler;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassimport java.util.logging.FileHandler;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassimport java.util.logging.Handler;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassimport java.util.logging.Level;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glassimport java.util.logging.LogManager;
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desaiimport java.util.logging.Logger;
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass/**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * Util class to set up Logging using the Console and FileLog formatter classes
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @author Jan S Berg
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai@SuppressWarnings({"PMD.MoreThanOneLogger", "PMD.SystemPrintln", "PMD.AvoidThrowingRawExceptionTypes"})
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glasspublic final class OpenGrokLogger {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai private static int LOGFILESIZELIMIT = 1000000;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass private static int LOGFILESCOUNT = 30;
d8d2286d8330892bb02eb2bf0735322f559ef5efSatyen Desai private final static Logger log = Logger.getLogger("org.opensolaris.opengrok");
d8d2286d8330892bb02eb2bf0735322f559ef5efSatyen Desai private static Level consoleLevel = Level.WARNING;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass private static Level fileLevel = Level.FINE;
d8d2286d8330892bb02eb2bf0735322f559ef5efSatyen Desai private static String filepath = "";
479b9ac417be02467aadae8cd650d29050001f0bSatyen Desai
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass public static String getFileLogPath() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return filepath;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass public static Logger getLogger() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return log;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass public static void setConsoleLogLevel(Level level) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Handler[] handlers = log.getHandlers();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass for (int i = 0; i < handlers.length; i++) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Handler h = handlers[i];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (h instanceof ConsoleHandler) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass h.setLevel(level);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass consoleLevel = level;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass public static Level getConsoleLogLevel() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return consoleLevel;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass /**
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass *
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass * @param level new level for console
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass */
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass public static void setOGConsoleLogLevel(Level level) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass for (Enumeration<String> e = LogManager.getLogManager().getLoggerNames();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass e.hasMoreElements();) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass String loggerName = e.nextElement();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Logger l = Logger.getLogger(loggerName);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Handler[] h = l.getHandlers();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!loggerName.startsWith("org.opensolaris.opengrok")) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass for (int i = 0; i < h.length; ++i) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Handler hi = h[i];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (hi instanceof ConsoleHandler) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass hi.setLevel(level);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass h = l.getHandlers();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass public static void setFileLogLevel(Level level) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Handler[] handlers = log.getHandlers();
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass for (int i = 0; i < handlers.length; i++) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Handler h = handlers[i];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (h instanceof FileHandler) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass h.setLevel(level);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass fileLevel = level;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass public static Level getFileLogLevel() {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass return fileLevel;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass public static void setFileLogPath(String path) throws IOException {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (path != null) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass File jlp = new File(path);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!jlp.exists() && !jlp.mkdirs()) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass throw new IOException("could not make logpath: " +
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass jlp.getAbsolutePath());
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass StringBuffer logfile;
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (path == null) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass logfile = new StringBuffer("%t");
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass } else {
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai logfile = new StringBuffer(path);
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai filepath = logfile.toString();
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai logfile.append(File.separatorChar).append("opengrok%g.%u.log");
e669f4800bb30c0f9b6ac93af6c8390e5f3c672bDerek Gathright
e669f4800bb30c0f9b6ac93af6c8390e5f3c672bDerek Gathright Handler[] handlers = log.getHandlers();
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai for (int i = 0; i < handlers.length; i++) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass Handler h = handlers[i];
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (h instanceof FileHandler) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass FileHandler fh = (FileHandler) h;
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai FileHandler nfh = new FileHandler(logfile.toString(),
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass LOGFILESIZELIMIT, // size (unlimited)
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai LOGFILESCOUNT); // # rotations
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai nfh.setLevel(fh.getLevel());
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai nfh.setFormatter(new FileLogFormatter());
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai log.addHandler(nfh);
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai log.removeHandler(fh);
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai }
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai }
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai }
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass public static String setupLogger(String logpath, Level filelevel, Level consolelevel) throws IOException {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass System.out.println("Logging to " + logpath);
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai if (logpath != null) {
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai File jlp = new File(logpath);
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai if (!jlp.exists() && !jlp.mkdirs()) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass throw new RuntimeException("could not make logpath: " +
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass jlp.getAbsolutePath());
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass }
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass if (!jlp.canWrite() && !Level.OFF.equals(filelevel)) {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass throw new IOException("logpath not writeable " + jlp.getAbsolutePath());
f10a402d8cc7dba5b475e38d8beaf6b79342c927Tilo Mitra }
f10a402d8cc7dba5b475e38d8beaf6b79342c927Tilo Mitra }
f10a402d8cc7dba5b475e38d8beaf6b79342c927Tilo Mitra
f10a402d8cc7dba5b475e38d8beaf6b79342c927Tilo Mitra clearForeignHandlers();
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai StringBuffer logfile;
f10a402d8cc7dba5b475e38d8beaf6b79342c927Tilo Mitra if (logpath == null) {
7dff9877fcd73e6db005c517f14a66bf2a9bf82eDerek Gathright logfile = new StringBuffer("%t");
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai } else {
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai logfile = new StringBuffer(logpath);
7dff9877fcd73e6db005c517f14a66bf2a9bf82eDerek Gathright }
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai filepath = logfile.toString();
c32ac843533f2b40173501ca749de5d972f101c4Satyen Desai logfile.append(File.separatorChar).append("opengrok%g.%u.log");
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass try {
76ca635d61eb3f9fb7c9d788a44fa8b1690aa138Dav Glass FileHandler fh = new FileHandler(logfile.toString(),
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai LOGFILESIZELIMIT, // size (unlimited)
1acbfdfeb2e94810b2799036a96b3829e492696dSatyen Desai LOGFILESCOUNT); // # rotations
1acbfdfeb2e94810b2799036a96b3829e492696dSatyen Desai
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai fh.setLevel(filelevel);
1acbfdfeb2e94810b2799036a96b3829e492696dSatyen Desai fileLevel = filelevel;
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai fh.setFormatter(new FileLogFormatter());
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai log.addHandler(fh);
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai ConsoleHandler ch = new ConsoleHandler();
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai ch.setLevel(consolelevel);
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai consoleLevel = consolelevel;
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai ch.setFormatter(new ConsoleFormatter());
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai log.addHandler(ch);
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai } catch (Exception ex1) {
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai System.err.println("Exception logging " + ex1);
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai throw new IOException("Exception setting up logging " + ex1);
1acbfdfeb2e94810b2799036a96b3829e492696dSatyen Desai }
1acbfdfeb2e94810b2799036a96b3829e492696dSatyen Desai log.setLevel(filelevel);
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai return logpath;
1acbfdfeb2e94810b2799036a96b3829e492696dSatyen Desai }
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai private static void clearForeignHandlers() {
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai for (Enumeration<String> e = LogManager.getLogManager().getLoggerNames();
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai e.hasMoreElements();) {
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai String loggerName = e.nextElement();
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai Logger l = Logger.getLogger(loggerName);
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai Handler[] h = l.getHandlers();
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai if (!loggerName.startsWith("org.opensolaris.opengrok")) {
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai for (int i = 0; i < h.length; ++i) {
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai l.removeHandler(h[i]);
6bb97cfdea627b5bb0523ad4e6d2623c5fbf6954Satyen Desai }
45be43296becb0d27a3414d29d9b4e3a1e3448b4Derek Gathright }
e669f4800bb30c0f9b6ac93af6c8390e5f3c672bDerek Gathright h = l.getHandlers();
e669f4800bb30c0f9b6ac93af6c8390e5f3c672bDerek Gathright }
e669f4800bb30c0f9b6ac93af6c8390e5f3c672bDerek Gathright }
e669f4800bb30c0f9b6ac93af6c8390e5f3c672bDerek Gathright
e669f4800bb30c0f9b6ac93af6c8390e5f3c672bDerek Gathright private OpenGrokLogger() {
e669f4800bb30c0f9b6ac93af6c8390e5f3c672bDerek Gathright }
e669f4800bb30c0f9b6ac93af6c8390e5f3c672bDerek Gathright}
45be43296becb0d27a3414d29d9b4e3a1e3448b4Derek Gathright