/*
* Copyright 2007 Sun Microsystems, Inc.
*
* This file is part of jVoiceBridge.
*
* jVoiceBridge is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation and distributed hereunder
* to you.
*
* jVoiceBridge is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* Sun designates this particular file as subject to the "Classpath"
* exception as provided by Sun in the License file that accompanied this
* code.
*/
package com.sun.voip;
import java.io.File;
import java.io.IOException;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.util.Calendar;
/**
* Logging utility.
*/
public class Logger {
private static BufferedWriter bw = null;
private static FileWriter fw = null;
public static final int LOG_ERROR = 0;
public static final int LOG_WARNING = 1;
public static final int LOG_NOTICE = 2;
public static final int LOG_PRODUCTION = 3;
public static final int LOG_INFO = 4;
public static final int LOG_MOREINFO = 5;
public static final int LOG_DETAILINFO = 6;
public static final int LOG_SIP = 7;
public static final int LOG_H323 = 7;
public static final int LOG_DETAIL = 8;
public static final int LOG_MOREDETAIL = 9;
public static final int LOG_DEBUG = 10;
public static int logLevel = LOG_PRODUCTION;
public static boolean writeThru = false;
public static boolean suppressSystemOut= false;
public final static String LOG_LEVEL = "com.sun.voip.server.LOGLEVEL";
/*
* Takes about 15ms to flush
*/
private final static int BUFFER_SIZE = (16 * 1024);
private static String logFileName;
/**
* Private Constructor
*/
private Logger() {}
/**
* Initializes the logger
*/
public static void init() {
// Open log file
logFileName = System.getProperty(
"com.sun.voip.server.BRIDGE_LOG", "bridge.log");
if (logFileName.charAt(0) != File.separatorChar) {
String s = System.getProperty("com.sun.voip.server.Bridge.logDirectory", "." + File.separator + "log" + File.separator);
logFileName = s + logFileName;
}
init(logFileName, false);
}
public static void init(String logFileName, boolean suppressSystemOut) {
Logger.logFileName = logFileName;
String s = System.getProperty(LOG_LEVEL, "3");
try {
logLevel = Integer.parseInt(s);
} catch (Exception e) {
}
if (logLevel <= LOG_PRODUCTION) {
Logger.suppressSystemOut = suppressSystemOut;
}
try {
File logFile = new File(logFileName);
if (!logFile.exists()) {
logFile.createNewFile();
}
fw = new FileWriter(logFileName, false);
bw = new BufferedWriter(fw, BUFFER_SIZE);
forcePrintln("Log file is " + logFileName);
} catch (IOException e) {
fw = null;
bw = null;
println(getDate() + "could not open log file: "
+ logFileName);
}
}
public static String getLogFileName() {
return logFileName;
}
/**
* Logs an error message.
* @param error the message to log
*/
public static synchronized void error(String msg) {
println("ERROR: " + msg);
}
/**
* Logs an exception.
* @param e the exception to log
*/
public static synchronized void exception(String s, Exception e) {
error(s);
e.printStackTrace();
System.out.flush();
}
/**
* Logs a message.
* @param msg the message to log.
*/
public static synchronized void println(String msg) {
if (bw != null) {
writeFile(msg);
if (suppressSystemOut == true) {
return;
}
}
System.out.println(getDate() + msg);
System.out.flush();
}
/**
* Logs a message.
* @param msg the message to log.
*/
public static synchronized void forcePrintln(String msg) {
if (bw != null) {
writeFile(msg);
}
System.out.println(getDate() + msg);
System.out.flush();
}
/**
* Logs a message to the log file only. This write is buffered
* so as to not disrupt timing.
* @param msg the message to log.
*/
public static synchronized void writeFile(String msg) {
if (bw != null) {
try {
synchronized(bw) {
bw.write(getDate() + msg + "\n");
}
} catch (IOException e) {
System.out.println(getDate() + "Unable to writeFile! "
+ e.getMessage());
close();
}
if (writeThru) {
flush();
}
} else {
System.out.println(getDate() + msg);
System.out.flush();
}
}
/**
* flushes the buffered writer.
*/
public static void flush() {
try {
if (bw != null) {
bw.flush();
}
if (fw != null) {
fw.flush();
}
} catch (IOException e) {
System.out.println(getDate() + "could not flush log file. "
+ e.getMessage());
}
}
/**
* Closes the log file.
*/
public static synchronized void close() {
try {
if (bw != null) {
bw.flush();
bw.close();
}
} catch (IOException e) {
//System.out.println(getDate() + "could not close buffered writer");
}
bw = null;
try {
if (fw != null) {
fw.flush();
fw.close();
}
} catch (IOException e) {
//System.out.println(getDate() + "could not close log file");
}
fw = null;
}
private static String[] month = {
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
};
public static String getDate() {
Calendar now = Calendar.getInstance();
String m = month[now.get(Calendar.MONTH)];
String ms = String.valueOf(now.get(Calendar.MILLISECOND));
if (ms.length() == 1) {
ms += " ";
} else if (ms.length() == 2) {
ms += " ";
}
String s = m + " " + now.get(Calendar.DAY_OF_MONTH) + " "
+ now.get(Calendar.HOUR_OF_DAY) + ":" + now.get(Calendar.MINUTE)
+ ":" + now.get(Calendar.SECOND) + "." + ms + " ";
s += " ";
s = s.substring(0, 21);
return (s);
}
}