Using Log4j efficiently

Hi,
I've been using Log4j, and I found it a little troublesome to declare an instance variable everywhere and pass the class name to it; like this:
public class UsesLogger {
     Logger logger = Logger.getLogger(this.class);
     public void log() {
          logger.debug("bla bla");
}So I thought I could create a wrapper class to encapsulate the logger. For instance:
public class MyLogger {
     public static void log(Class clazz, String message) {
          Logger logger = Logger.getLogger(clazz);
          logger.debug(message);
}But I also didn't like passing the class object every time I want to log a message. So the following came to my mind:
public class MyLogger {
     private static Exception ex = new Exception();
     public static void log(String message) {
          ex.fillInStackTrace();
          StackTraceElement[] ste = ex.getStackTrace();
          Logger logger = Logger.getLogger(ste[1].getClassName());
          //I even can add the method name to the message using ste[1].getMethodName()
          logger.debug(message);
}So the other classes do the following:
public class UsesLogger() {
     public void aMethod() {
          MyLogger.log("inside aMethod");
}My question is, is this approach efficient? especially that the ex.fillInStackTrace() method is synchronized, so it might be a bit costly.
Any ideas?
P.S: I'm not sure if this is the right thread to post in.

> > What is troublesome to you about this?
>
I'm not really sure, but I didn't like the idea of
repeating any piece of code anywhere.
That's a bit dogmatic, in my opinion. I think DRY is a good principle to follow, but declaring a Logger for a particular class isn't what I'd consider repeating code. If a class needs an instance of a Logger, I think it's perfectly appropriate to declare one (or have one injected -- that's for duffymo and the rest of the Spring zealots ;o)...
> In this case: including the Logger class and defining its variable
in every class that needs to log anything. That's why
I thought of an alternative to centralize the access
to the logger using my own utility class.
So my question remains: is this approach efficient?
I know these types of answers are unsatisfying, but it really depends on what criteria you're using to measure efficiency. In this case, I'd say not really. Your utility class is just adding another layer to the logging functionality. If you think you'll be changing logging frameworks often, it might be beneficial from a design standpoint to abstract out the logging, but I'd be surprised if you'd actually change the underlying logging implementation enough to warrant the new layer. I believe the impact is negligible to nonexistent from an application performance standpoint, but you could always measure it if you wanted.
But there are other options such as AOP, that may be able to provide you with "cross-cutting" logging functionality you're looking for without sullying your class definitions with logging code.
Cheers!
~

Similar Messages

  • Need Some Help in Using Log4j for logging

    Hi
    I am using Log4j for logging in my application . i have problem some areas .
    I want to rotate my file on basis of Time. means if my log file name format is HH:MM then after every minute new log file should be created , i am using Size based rotation its working fine.
    Plz Tell me which propety i used to set my logfile name like DATeFormat
    i tried with this Property but failed
    log4j.appender.R.File=%d{HH:MM}
    Simlarly i dont want to bound BackupSize
    log4j.appender.R.MaxBackupIndex=1000
    i want that suppose after 2 Mb automatically start new file and there is no upper bound on that
    how can i do that or from where i can see all properties of Log4j Thanks

    Thanks
    But in this case i cannot do Size based rotation
    These properties not belong to DialyRolling.. class
    log4j.appender.R.MaxFileSize=1KB
    log4j.appender.R.MaxBackupIndex=1000
    what i want is if file size grow with in one minute i create new file using RollingFileApender and if size doesnt grow in one minute and minute cross then next minute file should be created , how can i acheive both of these

  • Cost involved in changing the code using log4j.properties to log4j.xml

    i have finished my application, and it was done in such a way that logging is done using log4j but it was using log4j.properties file.
    now i need to change it to log4j.xml. i need to do this at the earliest. so i need to know the cost involved in it?. do i need to change a lot on my app to read the log4j.xml?. In my app there is a function named getProperties, which actually reads the log4j.properties file.
    this is the code of that function
    public static Properties getProperties(String filename,String path) throws myException
    //InputStream is = null;
    FileInputStream is=null;
            Properties props = new Properties();       
            //ClassLoader classLoader = ResourceUtil.class.getClassLoader();
            //is = classLoader.getResourceAsStream(filename);
            File catalinaHome = new  File(System.getProperty("catalina.home"));     
            try {       
    is=new
    FileInputStream(catalinaHome.getCanonicalFile()+path + filename);
    } catch (IOException e) {
            if(is == null)
                String message = "Cannot locate property file " + filename + " in the classpath";
                log.error(message);
            throw new myException(message);
            try
                props.load(is);
            catch (IOException e)
                String message = "Error reading property file " + filename;
                log.error(message);
            throw new myException(message, e);
            finally
                try
                    is.close();
                catch(Throwable t)
                    t.printStackTrace();
            if(props.isEmpty())
                String message = "No properties are defined in " + filename;
                log.error(message);
            throw new myException(message);
            return props;       
    }and my initialize function is
    public static void initialize()
    Properties properties=null;
    try {
    String path="/properties/";
    properties=ResourceUtil.getProperties("log4j.properties",path);
    } catch (myException e2) {
    e2.printStackTrace();
    PropertyConfigurator.configure(properties);
    }Message was edited by:
    xema
    Message was edited by:
    xema
    Message was edited by:
    xema

    >
    1. Restructure log4j.properties into log4j.xml.
    thats done
    2. Move log4j.xml into a directory that's in the
    classpath.
    actually i donot understand what does it mean to move in a directory thats in classpath means. i have to use logging in my webapplication running in tomcat. and my log4j.xml has to reside in catalina.home/properties/. My log4j.properties have been residing here and it had worked well woth the previous function. Now what i did is placed the log4j.xml under properties folder. Now tell me what modifications should i make in the above code.
    3. Remove any code that explicitly configures log4j
    (i.e. the initialize() method) because log4j will
    configure itself from any properties file it finds in
    the classpath, automatically, the first time it is
    called.I prefer not remvoing this function as this function is being called in many of my classes... and we don't have time to edit all...
    please help... and excuse me if i asked some blunders.!!!

  • How to create the log file in remote system using log4j.

    Hi,
    How to create the log file in remote system using log4j. please give me a sample code or related links.The below example i used for create the log file in remote system but it return the below exception.Is there any authandication parameter for accessing the remote path? Please help.
    public class Logging
    Logger log=null;
    FileAppender fileapp=null;
    public Logging(String classname)
    try
    log = Logger.getLogger(classname);
    String path=" [\\192.168.0.14\\c$\\LOG\\d9\\May_08_2008_log.txt|file://\\192.168.0.14\\c$\\LOG\\d9\\May_08_2008_log.txt]";
    fileapp = new FileAppender(new PatternLayout("%r [%t] %-5p %c %x - %m%n"),path, true);
    log.addAppender(fileapp);
    log.info("Logger initilized");
    }catch(Exception ex)
    ex.printStackTrace();
    java.io.FileNotFoundException: \\192.168.0.14\c$\LOG\d9\May_08_2008_log.txt (The network path was not found)
    at java.io.FileOutputStream.openAppend(Native Method)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at java.io.FileOutputStream.<init>(Unknown Source)
    at org.apache.log4j.FileAppender.setFile(FileAppender.java:290)
    at org.apache.log4j.FileAppender.<init>(FileAppender.java:109)
    at annwyn.logger.BioCapLogger.<init>(Logging.java:23)
    at sun.applet.AppletPanel.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    Please help.
    Thanks in advance.
    Saravanan.K

    Sorry path is missing for the above request.
    path="\\192.168.0.14\c$\LOG\d9\May_08_2008_log.txt ";
    please help.
    Saravanan.K

  • Problem in using log4j..i'm getting warning!!!

    i have been using log4j without any porblems. i have placed the log4j.properties file under classes folder under WEB-INF and it worked.
    but now i'm asked to place it under a folder named properties under CatalinaHome. And i came to know tht there is no problem in doing so and i just changed the path in my code.
    but now i'm getting the following warnings.. but logging is also going well..
    what could be the reson for this warning.
    log4j:WARN No appenders could be found for logger (com.servlet.Search
    Profile).
    log4j:WARN Please initialize the log4j system properly.

    Hi
    Have not come across a situation to limit the number of records in APD while processing, we have several DTP's extracting quite high volume of data and processing it further. (Including Cumulative & Non-cumulative key figures)
    However please be informed that the processing will fail if the query execution runs out of memory due to high volume of data.
    Based on the above screen shot it seems to be a warning message but will process the data.
    Regards
    Ashish 

  • Error in Logging using log4j When deployed in weblogic server

    I have deployed an SOAP based web service application as an war file and used log4j propertiers to do application logging .When i tested the application through a JAVA client the log4j log file has all the application log information but when i deployed it in the weblogic server 10.3.3 and tested it through SOAP UI it gives me just "Run time error exception" in the log4j log file(which is returned in the SOAP response) as against the application logs which i need. I have also added <wls:package-name>org.apache.log4j.*</wls:package-name> in the weblogic.xml and also changwed the logging to the log4j logging in the server ( which was perviously JDK logging) .But still it is not returning the complete application error stack trace in the log4j log file(and also in the weblogic command console) I need to get the application error stack trace in the log4j log file ( and also in the console) so it would be easy to debug the code.
    Please help me out in doing the same.
    thanks in advance

    Noman,
    have you checked that the folder D:\OracleJeveloper\Middleware\jdk160_14_R27.6.5-32 contains the jre?
    Timo

  • Using log4j in User definied Extension Function java class

    Hi
    I am having a java class where I defined all the user defined XSL Functions.
    I used System.out.println for printing.
    But I want to use log4j. But when I use this to debug. It is not recognising only.
    Could you please tell me why this is not working in this class?
    Regards,
    Praveena

    Hi Anuj,
    I can see the below error in the default log file:
    09/08/11 16:25:21 log4j:ERROR A "org.apache.log4j.RollingFileAppender" object is not assignable to a "org.apache.log4j.Appender" variable.
    09/08/11 16:25:21 log4j:ERROR The class "org.apache.log4j.Appender" was loaded by
    09/08/11 16:25:21 log4j:ERROR [global.libraries:1.0] whereas object of type
    09/08/11 16:25:21 log4j:ERROR "org.apache.log4j.RollingFileAppender" was loaded by [oracle.bpel.common:10.1.3].
    09/08/11 16:25:21 log4j:ERROR Could not instantiate appender named "LOGFILE".
    09/08/11 16:25:21 log4j:WARN No appenders could be found for logger (oracle.sample.XSLFunction).
    09/08/11 16:25:21 log4j:WARN Please initialize the log4j system properly.
    log4j.properties file:
    # Set root category priority to INFO and its only appender to CONSOLE.
    log4j.rootCategory=INFO, LOGFILE
    # LOGFILE is set to be a File appender using a PatternLayout.
    log4j.appender.LOGFILE=org.apache.log4j.RollingFileAppender
    log4j.appender.LOGFILE.File= C:/product/10.1.3.1/OracleAS_1/opmn/logs/XSLUtilExten.log
    log4j.appender.LOGFILE.Append=true
    log4j.appender.LOGFILE.Threshold=INFO,DEBUG
    log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
    log4j.appender.LOGFILE.layout.ConversionPattern=<%d>[%t] %p %C: %m%n
    log4j.appender.LOGFILE.MaxFileSize=40MB
    log4j.appender.LOGFILE.MaxBackupIndex=10
    Could you please tell me what is the problem?
    Edited by: Jakarta on Aug 11, 2009 4:16 AM

  • Using Log4J in a Portal Application

    I am using Log4J in my portal app, but no log messages are getting printed. Here
    is what I am doing -
    In a Pageflow I have the following code
    public static final String CLASS_ID = MyPageFlow.class.getName() + " - ";
    private static Logger logger = Logger.getLogger(MyPageFlow.class.getName());
    In the begin method I have -
    logger.debug(CLASS_ID+"In Begin Action");
    Then in my startWebLogic.cmd I have
    set LOG4J=-Dlog4j.config=myconfig\log4j.properties
    And I add this to the start line
    Here is my log4j.properties file
    log4j.rootLogger=debug, stdout, R
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    # Pattern to output the caller's file name and line number.
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=logs/myspt.log
    log4j.appender.R.MaxFileSize=1000KB
    log4j.appender.R.MaxBackupIndex=100
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
    What could be wrong?
    Thanks in advance.
    Mark

    After read some more forums i notice that i can´t place the dll's on java project, so i placed them on system32.
    Now i don't have any error of Native Library already loaded in another classloader, but i continue with the error UnsatisfiedLinkError: jni_init on line "if ((javacurl_handle = jni_init()) == 0)"
    Does anyone can help me?
    Thanks,
    Luis Cruz

  • Can I use log4j with a java stored procedure

    I have code that resides on the middle tier and on the database. Our company is using log4j for debugging purposes. In order to get my code to work on the database, I have had to remove all the log4j stuff. Has anyone tried to get code that has log4j messages to run on the database? I am not concerned with actual debugging, I just don't want to have to strip this code out if I can avoid it.

    Hi Laura,
    As far as I know, you have two choices:
    1. Load the log4j classes into the database (using the "loadjava" tool).
    2. Enable remote invocation of log4j classes via RMI (or similar).
    Hope this helps.
    Good Luck,
    Avi.

  • Logging using Log4J

    Hi,
    I want to use Log4J to write to the sap log using a Log4J appender. I followed the tutorial from https://www.sdn.sap.com/irj/servlet/prt/portal/prtroot/docs/library/uuid/36085e78-0801-0010-678d-8b4e89ddff3c
    but i doesnt work for me. When i check the ear which is deployed to the server, i cant find my log4j.properties file anywhere...i guess that is the problem. I put it in the src folder...i thought it was the correct place, but it doesnt show up in the ear...can anyone help me out?
    Much thanks,
    Hugo Hendriks

    Please don't crosspost. It cuts down on the effectiveness of responses, leads to people wasting their time answering what others have already answered, makes for difficult discussion, and is generally just annoying and bad form.

  • How to use log4j in struts project

    Hi, all
    I want to use log4j and pooling in my running project based on struts-tomcat.
    Can any one tell me all the process in details step by step,to apply in my project
    i m wait for any rply

    Another day, another jargon-dump

  • How to create outside Logging file in osb 11g using log4j.jar?

    Hi all,
    Currently, i am using osb 11g to develop a system. In the system we need to create a log file using log4j.jar library. This sub-program is working in the osb 10g base but fail to work in the osb 11g base. Can anyone give me some advice about this matter? Have anyone created one like this in 11g? Is it successful?

    Sorry path is missing for the above request.
    path="\\192.168.0.14\c$\LOG\d9\May_08_2008_log.txt ";
    please help.
    Saravanan.K

  • Specialty of supply function and  how can we use it efficiently?

    Hi Experts,
    I have one question.
    What exactly the function of “Supply function” for a node.
    Some says when ever lead change happens the “Supply function” triggers.
    I put a break point in Supply function say “ZSupply” written code to populate the table.
    It triggered only once to populate the table. If this is the functionality then I can write code in method and call it in modify view my checking it for first time why “supply function”.   I want to know what is its specialty, how can we use it efficiently?
    Thanks
    Gopal

    Hi Gopal,
    You are correct even without supply function you can achieve the same functionality i.e when ever there is a change in HEADER the corresponding ITEM for the HEADER can be displayed.
    But the idea of using SUPPLY Function is - the code written in the node i.e assume HEADER and ITEM relation gets executed as and when the node is instantiated in the run time where in there is no need us to handle it explicitly.
    If not used SUPPLY Function then we need to handle the complete HEADER and ITEM relation explicitly.
    Regards,
    Mohammed

  • Using log4j with portal server

    Hi,
    I am trying to use log4j with Portal server 6.1 using log taglibs from jakarta.
    Here is what i've done:
    1. copy taglibs-log.jar in /etc/opt/SUNWps/desktop/classes
    2. copy taglibs-log.tld in /etc/opt/SUNWps/desktop/default/tld
    3. put log statements in JSPs
    for example:
    <log:debug>This is body content.</log:debug>
    <log:debug message="This is attribute content." />
    4. /etc/opt/SUNWps/desktop/classes/log4j.properties contains
    =========================================
    # Sample properties to initialise log4j
    log4j.rootCategory=debug, stdout, R
    #log4j.rootCategory=debug, stdout
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    # Pattern to output the caller's file name and line number.
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=logtags.log
    log4j.appender.R.MaxFileSize=100KB
    # Keep one backup file
    log4j.appender.R.MaxBackupIndex=2
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
    ===============================================
    However no log file is created on my system. I am very new to this and would appreciate if anyone could tell me what more needs to be done to get log records in a file.
    Thanks for all your help.
    Kind regards,
    Apoorv

    Hi,
    I am trying to use log4j with Portal server 6.1 using
    log taglibs from jakarta.
    Here is what i've done:
    1. copy taglibs-log.jar in
    /etc/opt/SUNWps/desktop/classes
    2. copy taglibs-log.tld in
    /etc/opt/SUNWps/desktop/default/tld
    3. put log statements in JSPs
    for example:
    <log:debug>This is body content.</log:debug>
    <log:debug message="This is attribute content." />
    4. /etc/opt/SUNWps/desktop/classes/log4j.properties
    contains
    =========================================
    # Sample properties to initialise log4j
    log4j.rootCategory=debug, stdout, R
    #log4j.rootCategory=debug, stdout
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternL
    ayout
    # Pattern to output the caller's file name and line
    number.
    log4j.appender.stdout.layout.ConversionPattern=%5p
    [%t] (%F:%L) - %m%n
    log4j.appender.R=org.apache.log4j.RollingFileAppender
    log4j.appender.R.File=logtags.log
    log4j.appender.R.MaxFileSize=100KB
    # Keep one backup file
    log4j.appender.R.MaxBackupIndex=2
    log4j.appender.R.layout=org.apache.log4j.PatternLayout
    log4j.appender.R.layout.ConversionPattern=%p %t %c -
    %m%n
    ===============================================
    However no log file is created on my system. I am
    very new to this and would appreciate if anyone could
    tell me what more needs to be done to get log records
    in a file.
    Thanks for all your help.
    Kind regards,
    Apoorv

  • Problen when using log4j.jar in my web service application

    Hi, i have a little problem. I have to migrate an existing java application to web services, and this application uses log4j.jar. So i put that jar file in the lib dir in WEB-INF. However, when i try to deploy the application, i get an error saying
    org.apache.commons.LoggingException: No suitable Log constructor [LJava.lang.Class;c492c8 for org.apache.commons.logging.impl.Log4JLogger
    And of course if i remove that jar from the lib dir, the app deploys ok, but it crashes because it can't find the class Logger (located in that jar)
    Any ideas how to solve this?????
    Thank you                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       

    When is the log4j constructor invoked ?....you said you moved the java application to webservice....in the java application they might have initialized the log4j with the log4j properties file some where when they start the application..
    Have a start up servlet which initializes the lof4j.

Maybe you are looking for

  • Getting Runtime error while adding Second page in Smartform.

    I added 2 pages in smartform. When I worked with single page. smartform working properly. Now I added one more page(i.e Second page) I am getting runtime error.  ("The current ABAP/4 program encountered an unexpected situation".   A RAISE statement i

  • Why am I losing my Time Capsule connection?

    I keep getting this message every so often: Then I say, "use disk" and I get this message" So I can no longer rely on Time Machine to be backing up, which makes the whole excercise useless.  This is connected by ethernet, by the way, not wifi.  Also,

  • How to downgrade boot camp?

    I was wondering if someone can give me a link to a Boot Camp that support Windows 7 Ultimate 32-bit?

  • Is it possible to have a group of email contacts under one name eg mums in year 4?

    I would like to be able to send a group of people regular emails without having to add their address to the 'to' box. Is it possible to have a number of email addresses under one name?

  • MySQL RDBMS site in Data Modeler

    Hi, I want to make e relational model for a MySQL database. It will be converted by another software to java classes. The RDBMS type and site for the model must be mysql. Data Modeler has defined RDBMS sites for Oracle, DB2 and SQL Server. You can ad