Logging problems with log4j
chuckharris Apr 30, 2004 4:45 PMI have migrated an application from an jboss2.4.1_tomcat3.2.3 to jb3.2.2. Logging is via
log4j and I am trying to integrate with the version that is used by jb3.2.2. I have a
Logger.java (at end) class that allowed logging to occur from within jboss and when the
class is run from the commandline to test. For jboss3.2.2, I needed to comment several
lines to even allow jboss to start. Each class calls an initializer (at end) and then the
Logger method addLoggingForClass(String pClassName) is called.
Commented lines:
PropertyConfigurator.configure(m_configProps) and
Category acat = getCategory(pClassName);
m_categories.put(pClassName,acat);
acat.log(pClassName, Priority.INFO, "Setting up Logging for " + pClassName, null);
since it caused error :
ERROR: invalid console appender config detected, console stream is looping
I believe the original developer used examples from the original version of log4j.
By commenting these lines, my logging is displayed in the console and a rolling file.
If I run a class from the commandline rather than from within jboss, there is no logging at all. I tried to use
DOMConfigurator dc =new DOMConfigurator();
dc.configure("/packages/jboss-3.2.2/server/default/conf/log4j.xml");
in the Logger constructor but that caused the same error as above.
I would like logging to work however the class is run, either from within jboss or from the commandline. How do I get logging to work from the command line but still allow the logging to continue working when from within jboss?
import java.util.Properties;
import org.apache.log4j.Category;
import com.codestudio.sql.PoolMan;
import util.ResourceUtils;
import util.BaseException;
import util.Logger;
import org.apache.log4j.xml.DOMConfigurator;
/**
* This class performs System Initialization, e.g., setting up
* Logging, auditing, pooling, configurations, etc.
* The class cannot be instantiated.
* @see #initialize() for invoking the initializer properly.
*/
public abstract class Initializer
{
static Category cat = Category.getInstance("base.pack");
static boolean isInitialized = false;
/**
* Initialize the System
*/
public static void initialize()
{
if (isInitialized) return;
try
{
System.out.println("Initializing Logging");
initLogging();
isInitialized=true;
}
catch(BaseException e)
{
Logger.fatal("base.pack","Fatal error initializing",e);
}
}
private static void initPools() throws BaseException
{
try
{
PoolMan.start();
}
catch (Exception e)
{
throw new BaseException("Error Initializing Pools.", e);
}
}
private static void initLogging() throws BaseException
{
try
{
//System.out.println("********* start init logging");
//Properties p = ResourceUtils.getProperties(Initializer.class, "/log.config");
//Properties p = new Properties();
//System.out.println("********* init loggging '" + p.toString() + "'");
// if (p==null)
// {
//System.out.println("p is null");
// throw new BaseException("Cannot load Properties");
// }
//System.out.println("********* props not null " + p.toString());
Logger log = new Logger("base.pack");
Logger.debug("base.pack", "******* Logging started");
}
catch (Exception e)
{
System.out.println("fatal error and we are hosed " + e);
throw new BaseException("Fatal Error Initializing", e);
}
}
}package util;
import org.apache.log4j.PropertyConfigurator;
import org.apache.log4j.NDC;
import org.apache.log4j.Category;
import org.apache.log4j.Priority;
import java.util.Properties;
import java.util.HashMap;
import org.apache.log4j.xml.DOMConfigurator;
/**
* This class kicks off the logging mechanism for the system
* and needs to be called at program startup
*
*/
public class Logger
{
//private String m_category = null;
private Properties m_configProps= null;
private static HashMap m_categories = new HashMap(5);
DOMConfigurator dc;
//static org.apache.log4j.Logger log;
/** The constructor kicks off the logging mechanism.
* @param pCategory is the category that logging starts with
* which is typically the main class.
* @param pConfigFile is the name of the config file that is
* used to initialize the logging mechanism and set it's properties
*/
public Logger(String pCategory, Properties pConfigFile)
{
//System.out.println("*********logger has been initiated 0 Logger.java");
// m_configProps = pConfigFile;
//System.out.println("*********logger has been initiated 1 Logger.java");
// Category cat = Category.getInstance(pCategory);
// System.out.println("*********logger has been initiated 2 Logger.java");
// m_categories.put(pCategory,cat);
// System.out.println("*********logger has been initiated 3 Logger.java");
// PropertyConfigurator.configure(m_configProps); // todo java2
//System.out.println("*********logger has been initiated 4 Logger.java");
}
public Logger(String pClassName)
{
//System.out.println("*********logger has been initiated 0 Logger.java");
// m_configProps = pConfigFile;
//System.out.println("*********logger has been initiated 1 Logger.java");
// Category cat = Category.getInstance(pCategory);
// System.out.println("*********logger has been initiated 2 Logger.java");
// m_categories.put(pCategory,cat);
// System.out.println("*********logger has been initiated 3 Logger.java");
// PropertyConfigurator.configure(m_configProps);
//System.out.println("*********logger has been initiated 4 Logger.java");
// dc = new DOMConfigurator();
// dc.configure("/packages/jboss-3.2.2/server/default/conf/log4j.xml");
}
/**
* This method should be run in a static block in any class
* that wishes to do logging. This will guarantee that logging
* can be done for that class 'category' (won't be null).
* Logging must be initialized within the jvm with the constructor
* before this method can be invoked.
* @see #Logger(String pCategory, Properties pConfigFile)
*/
public static void addLoggingForClass(String pClassName)
{
System.out.println("setting up logging for " + pClassName);
//Category acat = getCategory(pClassName);
//m_categories.put(pClassName,acat);
//acat.log(pClassName, Priority.INFO, "Setting up Logging for " + pClassName, null);
//log = org.apache.log4j.Logger.getLogger(pClassName);
}
private static Category getCategory(String p)
{
if (m_categories.containsKey(p))
{
return(Category) m_categories.get(p);
}
else
{
Category newcat =
Category.getInstance(p);
m_categories.put(p,newcat);
return newcat;
}
}
public static void debug(String pClassName, Object pMsg)
{
Category acat = getCategory(pClassName);
acat.log(pClassName, Priority.DEBUG, pMsg, null);
}
public static void info(String pClassName, Object pMsg)
{
Category acat = getCategory(pClassName);
acat.log(pClassName, Priority.INFO, pMsg,null);
}
public static void warn(String pClassName, Object pMsg)
{
Category acat = getCategory(pClassName);
acat.log(pClassName, Priority.WARN, pMsg, null);
}
public static void warn(String pClassName, Object pMsg, Throwable pT)
{
Category acat = getCategory(pClassName);
acat.log(pClassName, Priority.WARN, pMsg, pT);
}
public static void error(String pClassName, Object pMsg, Throwable pT)
{
Category acat = getCategory(pClassName);
acat.log(pClassName, Priority.ERROR, pMsg, pT);
}
public static void error(String pClassName, Object pMsg)
{
Category acat = getCategory(pClassName);
acat.log(pClassName, Priority.ERROR, pMsg,null);
}
/**
* TODO!!! get requirements for what to do on a fatal error
* send emails, alert the media, make pagers go off, that sort of thing..
*/
public static void fatal(String pClassName, Object pMsg, Throwable pT)
{
Category acat = getCategory(pClassName);
acat.log(pClassName, Priority.FATAL, pMsg + " \n\n\n\n\n\nFATAL ERROR\n\n\n\n\n\n\n\n", pT);
//System.exit(999);
}
public static void push(Object p)
{
NDC.push(p.toString());
}
public static void pop()
{
NDC.pop();
}
}