1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/* 2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Conditions Of Use 3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software was developed by employees of the National Institute of 5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Standards and Technology (NIST), an agency of the Federal Government. 6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Pursuant to title 15 Untied States Code Section 105, works of NIST 7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * employees are not subject to copyright protection in the United States 8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * and are considered to be in the public domain. As a result, a formal 9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * license is not needed to use the software. 10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * This software is provided by NIST as a service and is expressly 12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * provided "AS IS." NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED 13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF 14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT 15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * AND DATA ACCURACY. NIST does not warrant or make any representations 16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * regarding the use of the software or the results thereof, including but 17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * not limited to the correctness, accuracy, reliability or usefulness of 18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * the software. 19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Permission to use this software is contingent upon your acceptance 21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * of the terms of this agreement. 22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * 23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang */ 24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/*************************************************************************** 25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang * Product of NIST/ITL Advanced Networking Technologies Division (ANTD). * 26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang ***************************************************************************/ 27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpackage gov.nist.core; 28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.io.*; 30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangimport java.util.Properties; 31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// BEGIN ANDROID-added 33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// TODO: this class should be replaced by android logging mechanism. 34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic class LogWriter implements StackLogger { 359dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan private static final String TAG = "SIP_STACK"; 369dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan 379dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan private boolean mEnabled = true; 389dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan 399dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void logStackTrace() { 409dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan // TODO 419dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 422b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang 439dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void logStackTrace(int traceLevel) { 449dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan // TODO 459dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 462b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang 479dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public int getLineCount() { 489dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan return 0; 499dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 502b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang 519dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void logException(Throwable ex) { 522b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang //Log.e(TAG, "", ex); 539dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 549dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void logDebug(String message) { 552b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang //Log.d(TAG, message); 569dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 579dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void logTrace(String message) { 582b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang //Log.d(TAG, message); 599dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 609dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void logFatalError(String message) { 612b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang //Log.e(TAG, message); 629dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 639dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void logError(String message) { 642b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang //Log.e(TAG, message); 659dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 669dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public boolean isLoggingEnabled() { 679dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan return mEnabled; 689dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 699dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public boolean isLoggingEnabled(int logLevel) { 709dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan // TODO 719dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan return mEnabled; 729dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 739dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void logError(String message, Exception ex) { 742b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang //Log.e(TAG, message, ex); 759dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 769dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void logWarning(String string) { 772b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang //Log.w(TAG, string); 789dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 799dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void logInfo(String string) { 802b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang //Log.i(TAG, string); 819dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 822b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang 839dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void disableLogging() { 849dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan mEnabled = false; 859dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 869dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan 879dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void enableLogging() { 889dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan mEnabled = true; 899dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 902b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang 919dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void setBuildTimeStamp(String buildTimeStamp) { 929dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 932b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang 949dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public void setStackProperties(Properties stackProperties) { 959dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 962b48b9a946dff3f11963e3f486f5eb71934c55d4Chung-yih Wang 979dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan public String getLoggerName() { 989dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan return "Android SIP Logger"; 999dfe3bfcff830a47aa2451d05f04a937a279532aHung-ying Tyan } 100600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang} 101600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// END android-added 102600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 103600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// BEGIN android-deleted 104600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 105600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//import org.apache.log4j.Appender; 106600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//import org.apache.log4j.FileAppender; 107600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//import org.apache.log4j.Level; 108600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//import org.apache.log4j.Logger; 109600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//import org.apache.log4j.Priority; 110600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//import org.apache.log4j.SimpleLayout; 111600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 112600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang///** 113600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * A wrapper around log4j that is used for logging debug and errors. You can 114600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * replace this file if you want to change the way in which messages are logged. 115600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 116600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @version 1.2 117600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 118600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @author M. Ranganathan <br/> 119600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @author M.Andrews 120600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @author Jeroen van Bemmel 121600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @author Jean Deruelle 122600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 123600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 124600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 125600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//public class LogWriter implements StackLogger { 126600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 127600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 128600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * The logger to which we will write our logging output. 129600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 130600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// private Logger logger; 131600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 132600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 133600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * The stack name. 134600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 135600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// private String stackName; 136600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 137600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 138600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Name of the log file in which the trace is written out (default is 139600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * /tmp/sipserverlog.txt) 140600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 141600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// private String logFileName = null; 142600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 143600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 144600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Flag to indicate that logging is enabled. 145600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 146600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// private volatile boolean needsLogging = false; 147600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 148600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// private int lineCount; 149600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 150600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 151600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * trace level 152600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 153600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 154600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// protected int traceLevel = TRACE_NONE; 155600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 156600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// private String buildTimeStamp; 157600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 158600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// private Properties configurationProperties; 159600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 160600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 161600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * log a stack trace. This helps to look at the stack frame. 162600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 163600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void logStackTrace() { 164600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.logStackTrace(TRACE_DEBUG); 165600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 166600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 167600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 168600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void logStackTrace(int traceLevel) { 169600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if (needsLogging) { 170600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// StringWriter sw = new StringWriter(); 171600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// PrintWriter pw = new PrintWriter(sw); 172600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// StackTraceElement[] ste = new Exception().getStackTrace(); 173600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// // Skip the log writer frame and log all the other stack frames. 174600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// for (int i = 1; i < ste.length; i++) { 175600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// String callFrame = "[" + ste[i].getFileName() + ":" 176600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// + ste[i].getLineNumber() + "]"; 177600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// pw.print(callFrame); 178600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 179600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// pw.close(); 180600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// String stackTrace = sw.getBuffer().toString(); 181600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Level level = this.getLevel(traceLevel); 182600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Priority priority = this.getLogPriority(); 183600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if ( level.isGreaterOrEqual(priority)) { 184600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// logger.log(level,stackTrace); 185600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 186600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 187600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 188600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 189600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 190600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 191600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Get the line count in the log stream. 192600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 193600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @return 194600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 195600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public int getLineCount() { 196600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return lineCount; 197600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 198600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 199600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 200600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Get the logger. 201600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 202600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @return 203600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 204600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public Logger getLogger() { 205600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return logger; 206600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 207600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 208600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 209600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 210600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * This method allows you to add an external appender. 211600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * This is useful for the case when you want to log to 212600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * a different log stream than a file. 213600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 214600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @param appender 215600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 216600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void addAppender(Appender appender) { 217600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 218600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.logger.addAppender(appender); 219600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 220600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 221600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 222600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 223600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Log an exception. 224600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 225600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @param ex 226600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 227600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void logException(Throwable ex) { 228600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 229600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if (needsLogging) { 230600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 231600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.getLogger().error(ex.getMessage(), ex); 232600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 233600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 234600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 235600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 236600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 237600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 238600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 239600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Counts the line number so that the debug log can be correlated to the 240600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * message trace. 241600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 242600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @param message -- 243600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * message to count the lines for. 244600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 245600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// private void countLines(String message) { 246600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// char[] chars = message.toCharArray(); 247600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// for (int i = 0; i < chars.length; i++) { 248600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if (chars[i] == '\n') 249600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// lineCount++; 250600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 251600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 252600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 253600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 254600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 255600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Prepend the line and file where this message originated from 256600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 257600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @param message 258600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @return re-written message. 259600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 260600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// private String enhanceMessage(String message) { 261600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 262600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// StackTraceElement[] stackTrace = new Exception().getStackTrace(); 263600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// StackTraceElement elem = stackTrace[2]; 264600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// String className = elem.getClassName(); 265600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// String methodName = elem.getMethodName(); 266600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// String fileName = elem.getFileName(); 267600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// int lineNumber = elem.getLineNumber(); 268600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// String newMessage = className + "." + methodName + "(" + fileName + ":" 269600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// + lineNumber + ") [" + message + "]"; 270600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return newMessage; 271600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 272600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 273600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 274600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 275600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Log a message into the log file. 276600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 277600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @param message 278600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * message to log into the log file. 279600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 280600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void logDebug(String message) { 281600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if (needsLogging) { 282600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// String newMessage = this.enhanceMessage(message); 283600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if ( this.lineCount == 0) { 284600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// getLogger().debug("BUILD TIMESTAMP = " + this.buildTimeStamp); 285600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// getLogger().debug("Config Propeties = " + this.configurationProperties); 286600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 287600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// countLines(newMessage); 288600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// getLogger().debug(newMessage); 289600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 290600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 291600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 292600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 293600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 294600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Log a message into the log file. 295600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 296600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @param message 297600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * message to log into the log file. 298600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 299600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void logTrace(String message) { 300600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if (needsLogging) { 301600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// String newMessage = this.enhanceMessage(message); 302600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if ( this.lineCount == 0) { 303600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// getLogger().debug("BUILD TIMESTAMP = " + this.buildTimeStamp); 304600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// getLogger().debug("Config Propeties = " + this.configurationProperties); 305600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 306600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// countLines(newMessage); 307600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// getLogger().trace(newMessage); 308600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 309600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 310600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 311600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 312600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 313600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Set the trace level for the stack. 314600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 315600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// private void setTraceLevel(int level) { 316600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// traceLevel = level; 317600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 318600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 319600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 320600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Get the trace level for the stack. 321600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 322600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public int getTraceLevel() { 323600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return traceLevel; 324600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 325600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 326600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 327600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Log an error message. 328600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 329600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @param message -- 330600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * error message to log. 331600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 332600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void logFatalError(String message) { 333600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Logger logger = this.getLogger(); 334600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// String newMsg = this.enhanceMessage(message); 335600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// countLines(newMsg); 336600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// logger.fatal(newMsg); 337600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 338600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 339600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 340600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 341600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Log an error message. 342600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 343600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @param message -- 344600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * error message to log. 345600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 346600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 347600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void logError(String message) { 348600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Logger logger = this.getLogger(); 349600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// String newMsg = this.enhanceMessage(message); 350600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// countLines(newMsg); 351600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// logger.error(newMsg); 352600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 353600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 354600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 355600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public LogWriter() { 356600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 357600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 358600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void setStackProperties(Properties configurationProperties) { 359600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 360600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.configurationProperties = configurationProperties; 361600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 362600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// String logLevel = configurationProperties 363600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// .getProperty("gov.nist.javax.sip.TRACE_LEVEL"); 364600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 365600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.logFileName = configurationProperties 366600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// .getProperty("gov.nist.javax.sip.DEBUG_LOG"); 367600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 368600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.stackName = configurationProperties 369600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// .getProperty("javax.sip.STACK_NAME"); 370600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 371600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// //check whether a Log4j logger name has been 372600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// //specified. if not, use the stack name as the default 373600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// //logger name. 374600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// String category = configurationProperties 375600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// .getProperty("gov.nist.javax.sip.LOG4J_LOGGER_NAME", this.stackName); 376600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 377600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 378600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// logger = Logger.getLogger(category); 379600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if (logLevel != null) { 380600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if (logLevel.equals("LOG4J")) { 381600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// //if TRACE_LEVEL property is specified as 382600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// //"LOG4J" then, set the traceLevel based on 383600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// //the log4j effective log level. 384600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Level level = logger.getEffectiveLevel(); 385600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.needsLogging = true; 386600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if (level == Level.OFF) 387600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.needsLogging = false; 388600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.traceLevel = TRACE_NONE; 389600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if (level.isGreaterOrEqual(Level.DEBUG)) { 390600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.traceLevel = TRACE_DEBUG; 391600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if (level.isGreaterOrEqual(Level.INFO)) { 392600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.traceLevel = TRACE_INFO; 393600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if (level.isGreaterOrEqual(Level.WARN)) { 394600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.traceLevel = TRACE_ERROR; 395600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 396600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 397600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// else { 398600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// try { 399600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// int ll = 0; 400600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if (logLevel.equals("TRACE")) { 401600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// ll = TRACE_DEBUG; 402600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Debug.debug = true; 403600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Debug.setStackLogger(this); 404600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if (logLevel.equals("DEBUG")) { 405600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// ll = TRACE_DEBUG; 406600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if ( logLevel.equals("INFO")) { 407600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// ll = TRACE_INFO; 408600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if (logLevel.equals("ERROR")) { 409600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// ll = TRACE_ERROR; 410600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if (logLevel.equals("NONE") || logLevel.equals("OFF")) { 411600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// ll = TRACE_NONE; 412600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else { 413600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// ll = Integer.parseInt(logLevel); 414600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if ( ll > 32 ) { 415600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Debug.debug = true; 416600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Debug.setStackLogger(this); 417600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 418600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 419600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 420600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.setTraceLevel(ll); 421600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.needsLogging = true; 422600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if (traceLevel == TRACE_DEBUG) { 423600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// logger.setLevel(Level.DEBUG); 424600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if (traceLevel == TRACE_INFO) { 425600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// logger.setLevel(Level.INFO); 426600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if (traceLevel == TRACE_ERROR) { 427600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// logger.setLevel(Level.ERROR); 428600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if (traceLevel == TRACE_NONE) { 429600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// logger.setLevel(Level.OFF); 430600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.needsLogging = false; 431600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 432600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 433600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /* 434600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * If user specifies a logging file as part of the startup 435600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * properties then we try to create the appender. 436600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 437600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if (this.needsLogging && this.logFileName != null) { 438600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 439600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// boolean overwrite = Boolean.valueOf( 440600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// configurationProperties.getProperty( 441600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// "gov.nist.javax.sip.DEBUG_LOG_OVERWRITE")); 442600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 443600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// FileAppender fa = null; 444600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// try { 445600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// fa = new FileAppender(new SimpleLayout(), 446600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.logFileName, !overwrite); 447600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } catch (FileNotFoundException fnf) { 448600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 449600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// // Likely due to some directoy not existing. Create 450600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// // them 451600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// File logfile = new File(this.logFileName); 452600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// logfile.getParentFile().mkdirs(); 453600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// logfile.delete(); 454600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 455600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// try { 456600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// fa = new FileAppender(new SimpleLayout(), 457600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.logFileName); 458600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } catch (IOException ioe) { 459600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// ioe.printStackTrace(); // give up 460600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 461600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } catch (IOException ex) { 462600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// ex.printStackTrace(); 463600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 464600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 465600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if (fa != null) 466600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// logger.addAppender(fa); 467600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 468600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 469600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } catch (NumberFormatException ex) { 470600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// ex.printStackTrace(); 471600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// System.err.println("LogWriter: Bad integer " + logLevel); 472600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// System.err.println("logging dislabled "); 473600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// needsLogging = false; 474600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 475600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 476600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else { 477600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.needsLogging = false; 478600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 479600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 480600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 481600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 482600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 483600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 484600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 485600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @return flag to indicate if logging is enabled. 486600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 487600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public boolean isLoggingEnabled() { 488600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 489600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return this.needsLogging; 490600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 491600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 492600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 493600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Return true/false if loging is enabled at a given level. 494600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 495600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @param logLevel 496600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 497600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public boolean isLoggingEnabled(int logLevel) { 498600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return this.needsLogging && logLevel <= traceLevel; 499600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 500600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 501600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 502600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 503600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Log an error message. 504600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 505600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @param message 506600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @param ex 507600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 508600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void logError(String message, Exception ex) { 509600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Logger logger = this.getLogger(); 510600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// logger.error(message, ex); 511600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 512600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 513600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 514600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 515600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Log a warning mesasge. 516600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 517600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @param string 518600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 519600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void logWarning(String string) { 520600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// getLogger().warn(string); 521600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 522600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 523600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 524600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 525600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Log an info message. 526600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 527600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * @param string 528600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 529600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void logInfo(String string) { 530600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// getLogger().info(string); 531600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 532600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 533600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 534600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Disable logging altogether. 535600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * 536600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 537600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void disableLogging() { 538600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.needsLogging = false; 539600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 540600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 541600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// /** 542600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// * Enable logging (globally). 543600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// */ 544600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void enableLogging() { 545600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.needsLogging = true; 546600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 547600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 548600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 549600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public void setBuildTimeStamp(String buildTimeStamp) { 550600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// this.buildTimeStamp = buildTimeStamp; 551600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 552600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 553600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 554600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public Priority getLogPriority() { 555600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if ( this.traceLevel == TRACE_INFO ) { 556600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return Priority.INFO; 557600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if ( this.traceLevel == TRACE_ERROR ) { 558600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return Priority.ERROR; 559600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if ( this.traceLevel == TRACE_DEBUG) { 560600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return Priority.DEBUG; 561600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if ( this.traceLevel == TRACE_TRACE) { 562600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return Priority.DEBUG; 563600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else { 564600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return Priority.FATAL; 565600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 566600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 567600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 568600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public Level getLevel(int traceLevel) { 569600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if ( traceLevel == TRACE_INFO ) { 570600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return Level.INFO; 571600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if ( traceLevel == TRACE_ERROR ) { 572600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return Level.ERROR; 573600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if ( traceLevel == TRACE_DEBUG) { 574600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return Level.DEBUG; 575600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else if (traceLevel == TRACE_TRACE) { 576600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return Level.ALL; 577600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else { 578600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return Level.OFF; 579600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 580600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 581600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 582600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// public String getLoggerName() { 583600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// if ( this.logger != null ) { 584600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return logger.getName(); 585600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } else { 586600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// return null; 587600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 588600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// } 589600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 590600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 591600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//} 592600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 593600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// END android-deleted 594