<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

<!-- ===================================================================== 
  This file is a fully functioning log4j/jboss xml configuration file with information on how to setup a JAMonAppender.  For more info
  in the appender see http://www.jamonapi.com.  This file contains reasonable defaults for the JAMonAppender.  Also in this comments
  section is a fully commented listing of all available JAMonAppender properties.  Note should I have a typo in any of the properties below
  then refer to the JAMonAppender javadocs.  All properties have a comparable setMethod (i.e. setEnableListeners(...)).  Also post the correction
  to the JAMon forum accessible via http://www.jamonapi.com.  Note ALL properties are optional.
  
    <root>
       <appender-ref ref="CONSOLE"/>
       <appender-ref ref="FILE"/>
       <appender-ref ref="JAMONAPPENDER"/>
    </root>
    
    Note ALL JAMonAppender properties are optional
    
    <appender name="JAMONAPPENDER" class="com.jamonapi.log4j.JAMonAppender">
      <param name="EnableLevelMonitoring" value="true"/>
      <param name="EnableListeners" value="BASIC"/>
      <param name="ListenerBufferSize" value="100"/>
      <param name="EnableListenerDetails" value="true"/>
      <param name="generalize" value="true"/>
      <param name="enableDefaultGeneralizer" value="true"/>
      <param name="generalizerDynamic" value="com.jamonapi.utils.DefaultGeneralizer"/>
      <param name="Units" value="log4j"/>
    </appender>
 
 Property versions, and xml versions follow along with definitions: 
 ## Specify any label you want to indicate the JAMonAppender below
 log4j.rootLogger=DEBUG, JAMONAPPENDER
 <appender-ref ref="JAMONAPPENDER"/>
 
 ## Note the following line is all that is required to get the JAMonAppender working. All properties values 
 ## below will go to their defaults. Default values will simply 
 ## track calls to log/warn/error/debug/fatal and total (i.e. all) via JAMon 
 log4j.appender.JAMONAPPENDER=com.jamonapi.log4j.JAMonAppender
 <appender name="JAMONAPPENDER" class="com.jamonapi.log4j.JAMonAppender">
 
 ## All of the following are optional.

 ## Indicates whether or not jamon will monitor all calls to log4j levels including: debug/warn/info/error/fatal/... 
 ## There will also be a monitor called TOTAL that repressents to total for all calls to all Levels. 
 ## Valid values are true and false and the default value is true.
 log4j.appender.jamonAppender.EnableLevelMonitoring=true
 <param name="EnableLevelMonitoring" value="true"/>

 ## Enabling listeners allows you to see the last N (default 100) detal messages of log4j calls in a JAMon FIFO buffer. This allows 
 ## you to look at the most recent log4j messages in the jamon web app in a sortable html page.  The capability is similar to tailing a log, 
 ## but easier. The jamon web  application allows you to further filter this information. Valid values for this are anything that is 
 ## returned by the Level objects toString method (DEBUG/INFO/WARN/ERROR/FATAL), as well as 
 ## TOTAL (a shared buffer listener for for all calls to log4j), or ALL (has a buffer for each of DEBUG/INFO/WARN/ERROR/FATAL/TOTAL), 
 ## and BASIC (Creates buffers for the most important level types ERROR/FATAL/TOTAL). The default if nothing is specified is to not 
 ## have any JAMonBufferListeners. Note although due to the nature of properties only one value can be passed via the setEnableListeners
 ## method.  However the method is additive for each call, and configuration of the property via an xml behaves in this additive manor. 
 ## Valid values are DEBUG/INFO/WARN/ERROR/FATAL/TOTAL/ALL/BASIC.
 log4j.appender.jamonAppender.EnableListeners=BASIC
 <param name="EnableListeners" value="BASIC"/>
 
 ## Size of the Listener buffers specified in the EnableListeners property.  Any integer value is valid. The default is 100.
 log4j.appender.jamonAppender.ListenerBufferSize=100
 <param name="ListenerBufferSize" value="100"/>
 
 ## Specifies whether all columns show up in the JAMon Buffer listener. The default is true (all columns appear). 
 ## At the time of the jamon 2.6 release the columns are: "Label","LoggerName","Level","ThreadName", "Date", "Exception" 
 ## If the value false is used then the standard jamon buffer listener of the jamon key will be used which will contain the unique 
 ## log message that was sent to the jamon appender. Valid values are true and false,and the default is true.  There MAY be some 
 ## performance improvement by using false here though I don't have numbers to say how much.
 log4j.appender.jamonAppender.EnableListenerDetails=true
  <param name="EnableListenerDetails" value="true"/>
    
 ## JAMon can generalize anything that is passed to it. For example a query provided to log4j would look like 
 ## this possibly: select * from table where name='joe' and id=50. If generalize is set to true 
 ## then this query is written to jamon (assuming the defaultGeneralizer is being used) :select * from table where name=? and id=?. 
 ## If generalize is set to true then the default generalizer will be used (repalces anything in single or double
 ## quotes, or any number in a string with '?'). You can also change the generalizer to use via the DynamicGeneralizer property. 
 ## Valid values here are true/false and the default value is false which means do not attempt to generalize and add to jamon the 
 ## pattern layout string for the log message.
 log4j.appender.jamonAppender.generalize=true
 <param name="generalize" value="true"/>
 
 ## This enables 'generalize' above and uses the default generalizer to generalize the log message. (i.e. generalize doesn't need to be set 
 ## to true if enableDefaultGeneralizer is)  See above for an example. This is not required when the message already is unique enough to 
 ## benefit by jamon aggregation. In that case setting generalize to true alone would be sufficient and more effecient. Do not turn this 
 ## to false when each logging message is not very unique such as a continually changing string such as an entire 
 ## record of a shopping cart. Note if you surround any strings with quotes in the log message they will be replaced by a  question
 ## (i.e. 'steve souza' becomes '?')
 log4j.appender.jamonAppender.enableDefaultGeneralizer=true
 <param name="enableDefaultGeneralizer" value="true"/>
 
 ## This allows you to specify a class that implements the com.jamonapi.utils.Generalizer interface. This class will be created 
 ## at runtime and will make log messages generic so JAMon monitors can be created from the message. Any class that implements Generalizer 
 ## can be used. An example follows:
 log4j.appender.jamonAppender.generalizerDynamic=com.jamonapi.utils.DefaultGeneralizer
 <param name="generalizerDynamic" value="com.jamonapi.utils.DefaultGeneralizer"/>
  
 ## Value that shows up in units column of jamon report. This defaults to 'log4j'. Any string is valid 
 log4j.appender.jamonAppender.Units=log4j
 <param name="Units" value="log4j"/>

 
 Sample code setting JAMonAppender properties
 
  private static Properties getDefaultProps() { 
     //# Set root logger level to DEBUG and its only appender to A1. 
     Properties properties=new Properties();
     properties.put("log4j.rootLogger","DEBUG, A1, jamonAppender");
  
    // # A1 is set to be a ConsoleAppender, and A2 uses JAMonAppender.
    properties.put("log4j.appender.A1","org.apache.log4j.ConsoleAppender");
  
    properties.put("log4j.appender.jamonAppender","com.jamonapi.log4j.JAMonAppender");
  
    properties.put("log4j.appender.jamonAppender.units","testlog4jUnits");
    properties.put("log4j.appender.jamonAppender.enableDefaultGeneralizer","true");
  
    properties.put("log4j.appender.jamonAppender.EnableListeners","BASIC");
    properties.put("log4j.appender.jamonAppender.EnableListenerDetails", "true");
  
    properties.put("log4j.appender.jamonAppender.EnableLevelMonitoring","true");
    properties.put("log4j.appender.jamonAppender.ListenerBufferSize","200");
  
    //# A1 uses PatternLayout.
    properties.put("log4j.appender.A1.layout","org.apache.log4j.PatternLayout");
    properties.put("log4j.appender.A1.layout.ConversionPattern","%-4r steve [%t] %-5p %c %x - %m%n");
  
    //# A1 uses PatternLayout.
    properties.put("log4j.appender.jamonAppender.layout","org.apache.log4j.PatternLayout");
    properties.put("log4j.appender.jamonAppender.layout.ConversionPattern","%p.%c.%m");
  
    return properties; 
  }
  
    
   
 ===================================================================== -->

<!-- $Id: log4j_jamonappender.xml,v 1.1 2007/06/03 17:59:03 stevesouza Exp $ -->

<!--
   | For more configuration infromation and examples see the Jakarta Log4j
   | owebsite: http://jakarta.apache.org/log4j
 -->

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">

   <!-- ================================= -->
   <!-- Preserve messages in a local file -->
   <!-- ================================= -->

   <!-- A time/date based rolling appender -->
   <appender name="FILE" class="org.jboss.logging.appender.DailyRollingFileAppender">
      <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
      <param name="File" value="${jboss.server.home.dir}/log/server.log"/>
      <param name="Append" value="false"/>

      <!-- Rollover at midnight each day -->
      <param name="DatePattern" value="'.'yyyy-MM-dd"/>

      <!-- Rollover at the top of each hour
      <param name="DatePattern" value="'.'yyyy-MM-dd-HH"/>
      -->

      <layout class="org.apache.log4j.PatternLayout">
         <!-- The default pattern: Date Priority [Category] Message\n -->
         <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>

         <!-- The full pattern: Date MS Priority [Category] (Thread:NDC) Message\n
         <param name="ConversionPattern" value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
          -->
      </layout>
   </appender>

   <!-- A size based file rolling appender
   <appender name="FILE" class="org.jboss.logging.appender.RollingFileAppender">
     <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
     <param name="File" value="${jboss.server.home.dir}/log/server.log"/>
     <param name="Append" value="false"/>
     <param name="MaxFileSize" value="500KB"/>
     <param name="MaxBackupIndex" value="1"/>

     <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
     </layout>	    
   </appender>
   -->

   <!-- ============================== -->
   <!-- Append messages to the console -->
   <!-- ============================== -->

   <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
      <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
      <param name="Target" value="System.out"/>
      <param name="Threshold" value="INFO"/>

      <layout class="org.apache.log4j.PatternLayout">
         <!-- The default pattern: Date Priority [Category] Message\n -->
         <param name="ConversionPattern" value="%d{ABSOLUTE} %-5p [%c{1}] %m%n"/>
      </layout>
   </appender>


	<appender name="JAMONAPPENDER" class="com.jamonapi.log4j.JAMonAppender">
       <param name="EnableListeners" value="BASIC"/>
   	</appender>



   <!-- ====================== -->
   <!-- More Appender examples -->
   <!-- ====================== -->

   <!-- Buffer events and log them asynchronously
   <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
     <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
     <appender-ref ref="FILE"/>
     <appender-ref ref="CONSOLE"/>
     <appender-ref ref="SMTP"/>
   </appender>
   -->

   <!-- EMail events to an administrator
   <appender name="SMTP" class="org.apache.log4j.net.SMTPAppender">
     <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
     <param name="Threshold" value="ERROR"/>
     <param name="To" value="admin@myhost.domain.com"/>
     <param name="From" value="nobody@myhost.domain.com"/>
     <param name="Subject" value="JBoss Sever Errors"/>
     <param name="SMTPHost" value="localhost"/>
     <param name="BufferSize" value="10"/>
     <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="[%d{ABSOLUTE},%c{1}] %m%n"/>
     </layout>
   </appender>
   -->

   <!-- Syslog events
   <appender name="SYSLOG" class="org.apache.log4j.net.SyslogAppender">
     <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
     <param name="Facility" value="LOCAL7"/>
     <param name="FacilityPrinting" value="true"/>
     <param name="SyslogHost" value="localhost"/>
     <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="[%d{ABSOLUTE},%c{1}] %m%n"/>
     </layout>
   </appender>
   -->

   <!-- Log events to JMS (requires a topic to be created)
   <appender name="JMS" class="org.apache.log4j.net.JMSAppender">
     <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
     <param name="Threshold" value="ERROR"/>
     <param name="TopicConnectionFactoryBindingName" value="java:/ConnectionFactory"/>
     <param name="TopicBindingName" value="topic/MyErrorsTopic"/>
   </appender>
   -->

   <!-- Log events through SNMP
   <appender name="TRAP_LOG" class="org.apache.log4j.ext.SNMPTrapAppender">
     <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
     <param name="ImplementationClassName" value="org.apache.log4j.ext.JoeSNMPTrapSender"/>
     <param name="ManagementHost" value="127.0.0.1"/>
     <param name="ManagementHostTrapListenPort" value="162"/>
     <param name="EnterpriseOID" value="1.3.6.1.4.1.24.0"/>
     <param name="LocalIPAddress" value="127.0.0.1"/>
     <param name="LocalTrapSendPort" value="161"/>
     <param name="GenericTrapType" value="6"/>
     <param name="SpecificTrapType" value="12345678"/>
     <param name="CommunityString" value="public"/>
     <param name="ForwardStackTraceWithTrap" value="true"/>
     <param name="Threshold" value="DEBUG"/>
     <param name="ApplicationTrapOID" value="1.3.6.1.4.1.24.12.10.22.64"/>
     <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d,%p,[%t],[%c],%m%n"/>
     </layout>
   </appender>
   -->

   <!--  Emit events as JMX notifications
   <appender name="JMX" class="org.jboss.monitor.services.JMXNotificationAppender">
      <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
      
      <param name="Threshold" value="WARN"/>
      <param name="ObjectName" value="jboss.system:service=Logging,type=JMXNotificationAppender"/>
      
      <layout class="org.apache.log4j.PatternLayout">
         <param name="ConversionPattern" value="%d %-5p [%c] %m"/>
      </layout>
   </appender>
   -->
   
   <!-- ================ -->
   <!-- Limit categories -->
   <!-- ================ -->

   <!-- Limit the org.apache category to INFO as its DEBUG is verbose -->
   <category name="org.apache">
      <priority value="INFO"/>
   </category>

   <!-- Limit the org.jgroups category to WARN as its INFO is verbose -->
   <category name="org.jgroups">
      <priority value="WARN"/>
   </category>

   <!-- Limit jboss axis to INFO as its DEBUG is even more verbose -->
   <category name="org.jboss.axis">
      <priority value="INFO"/>
   </category>

   <!-- Limit JBoss categories
   <category name="org.jboss">
      <priority value="INFO"/>
   </category>
   -->

   <!-- Limit the JSR77 categories -->
   <category name="org.jboss.management">
      <priority value="INFO"/>
   </category>

   <!-- Limit JBoss webservice category
   <category name="org.jboss.webservice">
      <priority value="DEBUG"/>
   </category>
   -->

   <!-- Decrease the priority threshold for the org.jboss.varia category
   <category name="org.jboss.varia">
     <priority value="DEBUG"/>
   </category>
   -->

   <!-- Show the evolution of the DataSource pool in the logs [inUse/Available/Max]
   <category name="org.jboss.resource.connectionmanager.JBossManagedConnectionPool">
     <priority value="TRACE" class="org.jboss.logging.XLevel"/>
   </category>
   -->

   <!--
      | An example of enabling the custom TRACE level priority that is used
      | by the JBoss internals to diagnose low level details. This example
      | turns on TRACE level msgs for the org.jboss.ejb.plugins package and its
      | subpackages. This will produce A LOT of logging output.
   <category name="org.jboss.system">
     <priority value="TRACE" class="org.jboss.logging.XLevel"/>
   </category>
   <category name="org.jboss.ejb.plugins">
     <priority value="TRACE" class="org.jboss.logging.XLevel"/>
   </category>
   -->
  
   <!--
       | Logs these events to SNMP:
           - server starts/stops
           - cluster evolution (node death/startup)
           - When an EJB archive is deployed (and associated verified messages)
           - When an EAR archive is deployed
      	 
   <category name="org.jboss.system.server.Server">
     <priority value="INFO" />
     <appender-ref ref="TRAP_LOG"/>
   </category>
  
   <category name="org.jboss.ha.framework.interfaces.HAPartition.lifecycle">
     <priority value="INFO" />
     <appender-ref ref="TRAP_LOG"/>
   </category>

   <category name="org.jboss.deployment.MainDeployer">
     <priority value="ERROR" />
     <appender-ref ref="TRAP_LOG"/>
   </category>
   
   <category name="org.jboss.ejb.EJBDeployer">
     <priority value="INFO" />
     <appender-ref ref="TRAP_LOG"/>
   </category>
   
   <category name="org.jboss.deployment.EARDeployer">
     <priority value="INFO" />
     <appender-ref ref="TRAP_LOG"/>
   </category>
  
   -->

   <!-- ======================= -->
   <!-- Setup the Root category -->
   <!-- ======================= -->

   <root>
      <appender-ref ref="CONSOLE"/>
      <appender-ref ref="FILE"/>
	<appender-ref ref="JAMONAPPENDER"/>

   </root>

   <!-- Clustering logging -->
   <!-- Uncomment the following to redirect the org.jgroups and
      org.jboss.ha categories to a cluster.log file.

   <appender name="CLUSTER" class="org.jboss.logging.appender.RollingFileAppender">
     <errorHandler class="org.jboss.logging.util.OnlyOnceErrorHandler"/>
     <param name="File" value="${jboss.server.home.dir}/log/cluster.log"/>
     <param name="Append" value="false"/>
     <param name="MaxFileSize" value="500KB"/>
     <param name="MaxBackupIndex" value="1"/>

     <layout class="org.apache.log4j.PatternLayout">
       <param name="ConversionPattern" value="%d %-5p [%c] %m%n"/>
     </layout>
   </appender>
   <category name="org.jgroups">
     <priority value="DEBUG" />
     <appender-ref ref="CLUSTER"/>
   </category>
   <category name="org.jboss.ha">
     <priority value="DEBUG" />
     <appender-ref ref="CLUSTER"/>
   </category>
   -->

</log4j:configuration>
