You are viewing a plain text version of this content. The canonical link for it is here.
Posted to log4j-user@logging.apache.org by "Sanjay Gupta (sanjaygu)" <sa...@cisco.com> on 2003/07/12 02:21:54 UTC

How to use categoryFactory element in the properties file?

I have extended Logger and LoggerFactory so that I can pass few params
such as hostname.

---------Extended LoggerFactory-------------
	public NtLoggerFactory(String appId, String hostName) {
	  this.appId = appId;
	  this.hostName = hostName;
	}

	 public Logger makeNewLoggerInstance(String name) {
	   return new NtLogger(name, this.appId, this.hostName);
	 }
-----------------------------------------------

My program works fine when I initialize and configure the logger from
the program but when I try to use DOMConfigurator using log4j.xml I am
lost. How so I specify LoggerFactory/CategoryFactory and the params in
the log4j.xml file? 

Here is the program that works without a Configurator/xml file -
-----------------
		Logger root = Logger.getRootLogger();
		NtLoggerFactory factory = new
NtLoggerFactory("LogWriterApp", "LocalMachine");
		Layout layout = new NtPatternLayout("%p <%a> =>%h=< [%t]
%c (%F:%L:%M) - %m%n");
		root.addAppender(new ConsoleAppender(layout,
ConsoleAppender.SYSTEM_OUT));
  	      NtLogger logger = (NtLogger)
NtLogger.getLogger("LogWriter", factory); 
     	      logger.info("Hello info ");

---------------

This is what I came up with log4j.xml and code that doesn't work------

-----------log4j.xml----
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
        <appender name="RBERR"
class="org.apache.log4j.RollingFileAppender">
           <param name="File" value="D:\\Logwriter\\test.log" />
           <param name="Threshold" value="DEBUG" />
           <param name="MaxFileSize" value="1024KB" />
           <param name="MaxBackupIndex" value="10" />
           <layout class="com.sanjay.log4j.NtPatternLayout">
              <param name="ConversionPattern" value="%p [%a] =)%h=( [%t]
%c (%F:%L:%M) - %m%n" />
           </layout>
        </appender>
        <logger name="LogWriter">
           <level value="debug"/>

           <appender-ref ref="RBERR" />

        </logger> 
        <categoryFactory
class="com.cisco.nettools.log4j.NtLoggerFactory">
          <param name="appId" value="MYAPPID" />
          <param name="hostName" value="LOCAL_MACHINE" />
        </categoryFactory>
</log4j:configuration>  
---------------------

And java code is ---
		  DOMConfigurator.configure(args[0]);
		  NtLogger logger = (NtLogger)
NtLogger.getLogger("LogWriter"); 
		  logger.info("Hello info ");

I get the error - 
log4j:WARN No such property [appId] in
com.cisco.nettools.log4j.NtLoggerFactory.
log4j:WARN No such property [hostName] in
com.cisco.nettools.log4j.NtLoggerFactory.
log4j:WARN No such property [appId] in
com.cisco.nettools.log4j.NtLoggerFactory.
log4j:WARN No such property [hostName] in
com.cisco.nettools.log4j.NtLoggerFactory.
java.lang.ClassCastException
	at com.sanjay.log4j.Log4jTest.main(Log4jTest.java:53)
Exception in thread "main" 
              


---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: log4j-user-help@jakarta.apache.org


Re: How to use categoryFactory element in the properties file?

Posted by kaustuva mukherjee <ka...@citigroup.com>.
I am having the same problem is there any solution ?








---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@logging.apache.org
For additional commands, e-mail: log4j-user-help@logging.apache.org


RE: How to use categoryFactory element in the properties file?

Posted by "Sanjay Gupta (sanjaygu)" <sa...@cisco.com>.
I tried ur suggestion. That eliminated "no such properties error.." But
It is still not working. NtLoggerFactory's makeNewLoggerInstance method
is not getting called hence I am getting Class cast Exception.
Thanks,
-sanjay

Here is the Log4jTest.java from which I am using the logger ---
---------------------Log4jTest.java-------------------
public class Log4jTest {

	   public static void main(String[] args)
	   throws Exception
	   {			  
		System.out.println("using " + args[0]);
		DOMConfigurator.configure(args[0]);
		NtLogger c = (NtLogger)NtLogger.getLogger("LogWriter"); 

		try 
		{
		  c.info("Hello info ");
		  c.debug("Hello debug");
		} catch(ClassCastException e) {
		  LogLog.error("Did you forget to set the factory in the
config file?", e);
		}
	System.out.println("Done...");
	   }
}
--------------------------------------

-------------log4j.xml------------------
<log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
        <appender name="RBERR"
class="org.apache.log4j.RollingFileAppender">
           <param name="File" value="D:\\Logwriter\\test.log" />
           <param name="Threshold" value="DEBUG" />
           <param name="MaxFileSize" value="1024KB" />
           <param name="MaxBackupIndex" value="10" />
           <layout class="com.cisco.nettools.log4j.NtPatternLayout">
              <param name="ConversionPattern" value="%p [%a] =)%h=( [%t]
%c (%F:%L:%M) - %m%n" />
           </layout>
        </appender>
        <logger name="LogWriter">
           <level value="debug"/>

           <appender-ref ref="RBERR" />

        </logger> 
        <categoryFactory
class="com.cisco.nettools.log4j.NtLoggerFactory">
          <param name="appId" value="MYAPPID" />
          <param name="hostName" value="LOCAL_MACHINE" />
        </categoryFactory>
</log4j:configuration>  
-----------------------------------------------
--------------------------NtLogger.java--------------------
public class NtLogger extends Logger {

	protected String appId;
	protected String hostName;

	   private static LoggerFactory factory = new NtLoggerFactory();
	/**
	 * @param name
	 */
	public NtLogger(String loggerName) {
		super(loggerName);
	}
	
	protected  NtLogger(String loggerName, String appId, String
hostName)
	{
	  super(loggerName );

//		  instanceFQN =
"org.apache.log4j.examples.appserver.AppServerCategory";
  
		  this.appId  = appId;
		  this.hostName = hostName;

	   }

	public String getAppId()
	{  
	   return ( this.appId == null ) ? "" : this.appId; 
	}

	public String getHostName()
	{  
	   return ( this.hostName == null ) ? "" : this.hostName; 
	}

	/**
	   This method overrides {@link Logger#getInstance} by supplying
	   its own factory type as a parameter.
	*/
	public static Category getInstance(String name) 
	{
	  return Logger.getLogger(name, factory); 
	}
  
	/**
	   This method overrides {@link Logger#getLogger} by supplying
	   its own factory type as a parameter.
	*/
	public static Logger getLogger(String name) 
	{
	  return Logger.getLogger(name, factory); 
	}
  
	protected void forcedLog(String    fqn, 
							 Priority
priority, 
							 Object    msg, 
							 Throwable t) 

	 {

		LoggingEvent event = new NtLoggingEvent(fqn, this,
priority, msg, t);
		callAppenders( event );

	 }

	public static void main(String[] args) {
	}
}
--------------------------------------------------

-----Original Message-----
From: Steve Ebersole [mailto:steveebersole@austin.rr.com] 
Sent: Sunday, July 13, 2003 6:27 AM
To: Log4J Users List; sanjaygu@cisco.com
Subject: Re: How to use categoryFactory element in the properties file?


appId and hostName need to be properties on your class, not arguments to
its constructor.

public class NtLoggerFactory
{
    protected String appId;
    protected String hostName;

    public NtLoggerFactory() {}

    public String getAppId() { return appId; }
    public void setAppId( String appId ) { this.appId = appId; }

    public String getHostName() { return hostName; }
    public void setHostName( String hostName ) { this.hostName =
hostName; }

    public Logger makeNewLoggerInstance( String loggerName )
    {
        if (appId == null || hostName == null)
            throw new IllegalStateException( "Cannot access factory
prior to setting appId/hostName" );
        return new NtLogger( loggerName, appId, hostName );
    }
}


----- Original Message -----
From: "Sanjay Gupta (sanjaygu)" <sa...@cisco.com>
To: "'Log4J Users List'" <lo...@jakarta.apache.org>
Sent: Friday, July 11, 2003 7:21 PM
Subject: How to use categoryFactory element in the properties file?


> I have extended Logger and LoggerFactory so that I can pass few params

> such as hostname.
>
> ---------Extended LoggerFactory-------------
> public NtLoggerFactory(String appId, String hostName) {
>   this.appId = appId;
>   this.hostName = hostName;
> }
>
> public Logger makeNewLoggerInstance(String name) {
>    return new NtLogger(name, this.appId, this.hostName);
> }
> -----------------------------------------------
>
> My program works fine when I initialize and configure the logger from 
> the program but when I try to use DOMConfigurator using log4j.xml I am

> lost. How so I specify LoggerFactory/CategoryFactory and the params in

> the log4j.xml file?
>
> Here is the program that works without a Configurator/xml file -
> -----------------
> Logger root = Logger.getRootLogger();
> NtLoggerFactory factory = new
> NtLoggerFactory("LogWriterApp", "LocalMachine");
> Layout layout = new NtPatternLayout("%p <%a> =>%h=< [%t]
> %c (%F:%L:%M) - %m%n");
> root.addAppender(new ConsoleAppender(layout, 
> ConsoleAppender.SYSTEM_OUT));
>         NtLogger logger = (NtLogger) NtLogger.getLogger("LogWriter", 
> factory);
>            logger.info("Hello info ");
>
> ---------------
>
> This is what I came up with log4j.xml and code that doesn't work------
>
> -----------log4j.xml----
> <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
>         <appender name="RBERR" 
> class="org.apache.log4j.RollingFileAppender">
>            <param name="File" value="D:\\Logwriter\\test.log" />
>            <param name="Threshold" value="DEBUG" />
>            <param name="MaxFileSize" value="1024KB" />
>            <param name="MaxBackupIndex" value="10" />
>            <layout class="com.sanjay.log4j.NtPatternLayout">
>               <param name="ConversionPattern" value="%p [%a] =)%h=( 
> [%t] %c (%F:%L:%M) - %m%n" />
>            </layout>
>         </appender>
>         <logger name="LogWriter">
>            <level value="debug"/>
>
>            <appender-ref ref="RBERR" />
>
>         </logger>
>         <categoryFactory 
> class="com.cisco.nettools.log4j.NtLoggerFactory">
>           <param name="appId" value="MYAPPID" />
>           <param name="hostName" value="LOCAL_MACHINE" />
>         </categoryFactory>
> </log4j:configuration>
> ---------------------
>
> And java code is ---
>   DOMConfigurator.configure(args[0]);
>   NtLogger logger = (NtLogger) NtLogger.getLogger("LogWriter");
>   logger.info("Hello info ");
>
> I get the error -
> log4j:WARN No such property [appId] in 
> com.cisco.nettools.log4j.NtLoggerFactory.
> log4j:WARN No such property [hostName] in 
> com.cisco.nettools.log4j.NtLoggerFactory.
> log4j:WARN No such property [appId] in 
> com.cisco.nettools.log4j.NtLoggerFactory.
> log4j:WARN No such property [hostName] in 
> com.cisco.nettools.log4j.NtLoggerFactory.
> java.lang.ClassCastException
> at com.sanjay.log4j.Log4jTest.main(Log4jTest.java:53)
> Exception in thread "main"
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: log4j-user-help@jakarta.apache.org
>



---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: log4j-user-help@jakarta.apache.org


Re: How to use categoryFactory element in the properties file?

Posted by Steve Ebersole <st...@austin.rr.com>.
appId and hostName need to be properties on your class, not arguments to its
constructor.

public class NtLoggerFactory
{
    protected String appId;
    protected String hostName;

    public NtLoggerFactory() {}

    public String getAppId() { return appId; }
    public void setAppId( String appId ) { this.appId = appId; }

    public String getHostName() { return hostName; }
    public void setHostName( String hostName ) { this.hostName = hostName; }

    public Logger makeNewLoggerInstance( String loggerName )
    {
        if (appId == null || hostName == null)
            throw new IllegalStateException( "Cannot access factory prior to
setting appId/hostName" );
        return new NtLogger( loggerName, appId, hostName );
    }
}


----- Original Message -----
From: "Sanjay Gupta (sanjaygu)" <sa...@cisco.com>
To: "'Log4J Users List'" <lo...@jakarta.apache.org>
Sent: Friday, July 11, 2003 7:21 PM
Subject: How to use categoryFactory element in the properties file?


> I have extended Logger and LoggerFactory so that I can pass few params
> such as hostname.
>
> ---------Extended LoggerFactory-------------
> public NtLoggerFactory(String appId, String hostName) {
>   this.appId = appId;
>   this.hostName = hostName;
> }
>
> public Logger makeNewLoggerInstance(String name) {
>    return new NtLogger(name, this.appId, this.hostName);
> }
> -----------------------------------------------
>
> My program works fine when I initialize and configure the logger from
> the program but when I try to use DOMConfigurator using log4j.xml I am
> lost. How so I specify LoggerFactory/CategoryFactory and the params in
> the log4j.xml file?
>
> Here is the program that works without a Configurator/xml file -
> -----------------
> Logger root = Logger.getRootLogger();
> NtLoggerFactory factory = new
> NtLoggerFactory("LogWriterApp", "LocalMachine");
> Layout layout = new NtPatternLayout("%p <%a> =>%h=< [%t]
> %c (%F:%L:%M) - %m%n");
> root.addAppender(new ConsoleAppender(layout,
> ConsoleAppender.SYSTEM_OUT));
>         NtLogger logger = (NtLogger)
> NtLogger.getLogger("LogWriter", factory);
>            logger.info("Hello info ");
>
> ---------------
>
> This is what I came up with log4j.xml and code that doesn't work------
>
> -----------log4j.xml----
> <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'>
>         <appender name="RBERR"
> class="org.apache.log4j.RollingFileAppender">
>            <param name="File" value="D:\\Logwriter\\test.log" />
>            <param name="Threshold" value="DEBUG" />
>            <param name="MaxFileSize" value="1024KB" />
>            <param name="MaxBackupIndex" value="10" />
>            <layout class="com.sanjay.log4j.NtPatternLayout">
>               <param name="ConversionPattern" value="%p [%a] =)%h=( [%t]
> %c (%F:%L:%M) - %m%n" />
>            </layout>
>         </appender>
>         <logger name="LogWriter">
>            <level value="debug"/>
>
>            <appender-ref ref="RBERR" />
>
>         </logger>
>         <categoryFactory
> class="com.cisco.nettools.log4j.NtLoggerFactory">
>           <param name="appId" value="MYAPPID" />
>           <param name="hostName" value="LOCAL_MACHINE" />
>         </categoryFactory>
> </log4j:configuration>
> ---------------------
>
> And java code is ---
>   DOMConfigurator.configure(args[0]);
>   NtLogger logger = (NtLogger)
> NtLogger.getLogger("LogWriter");
>   logger.info("Hello info ");
>
> I get the error -
> log4j:WARN No such property [appId] in
> com.cisco.nettools.log4j.NtLoggerFactory.
> log4j:WARN No such property [hostName] in
> com.cisco.nettools.log4j.NtLoggerFactory.
> log4j:WARN No such property [appId] in
> com.cisco.nettools.log4j.NtLoggerFactory.
> log4j:WARN No such property [hostName] in
> com.cisco.nettools.log4j.NtLoggerFactory.
> java.lang.ClassCastException
> at com.sanjay.log4j.Log4jTest.main(Log4jTest.java:53)
> Exception in thread "main"
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: log4j-user-help@jakarta.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: log4j-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: log4j-user-help@jakarta.apache.org