LoggerFactory.getLogger(ClassName.class) vs LoggerFactory.getLogger(this.getClass().getName())

前端 未结 7 745
小蘑菇
小蘑菇 2021-02-04 00:48

I\'m trying to improve my optimization skills in Java. In order to achieve that, I\'ve got an old program I made and I\'m trying my best to make it better. In this program I\'m

相关标签:
7条回答
  • 2021-02-04 01:09

    When in static context you can't use LoggerFactory.getLogger(getClass()) OR LoggerFactory.getLogger(this.getClass().getName())

    And then you have to use LoggerFactory.getLogger(ClassName.class)

    Anyways I prefer Lombok's @Log4j2 , less code and does the job : https://projectlombok.org/api/lombok/extern/log4j/Log4j2.html

    0 讨论(0)
  • 2021-02-04 01:10

    What I usually do is

    private static final Logger logger = LoggerFactory.getLogger(ClassName.class);
    

    However, the idiom

    protected final Logger log = LoggerFactory.getLogger(getClass());
    

    is equally common. In this question you can find more info about these conventions.

    0 讨论(0)
  • 2021-02-04 01:13

    Late entry!

    As I am likely to be searching for this in the future.

    There is a way to create copy/paste friendly Logger instances (granted this is almost never a good reason to do something!) by using Java 7's MethodHandles class.

    private static final Logger LOGGER = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
    
    0 讨论(0)
  • 2021-02-04 01:15

    I prefer

    Logger logger = LoggerFactory.getLogger(ClassName.class);
    

    Because

    this.getClass() 
    

    Can be override by one of class children and you will see child class name in log. Sometimes it can be confusing because log actually is performed in parent class

    0 讨论(0)
  • 2021-02-04 01:20

    Use this

    private final Logger logger = LoggerFactory.getLogger(this.getClass()); 
    
    }
    // logic
    try
    {
    // todo
    }
    
    catch (NullPointerException e) {
            logger.error("Error:-" + e.getMessage());
              return ResponseUtil.errorResponse(e.getMessage());
            }
    
            catch (Exception e) {
                logger.error("Error:-" + e.getMessage());
                return ResponseUtil.errorResponse(e.getMessage());
            }
    
    0 讨论(0)
  • 2021-02-04 01:23

    I'll share my opinion here. I would say that this is the case that you shouldn't be bothered from the performance point of view. Probably in the code there are parts that can be optimized much more than this thing :)

    Now, regarding your question. Take a look on LoggerFactory's code

    Note that getLogger(Class<?> name) just calls the overloaded method:

    Logger logger = getLogger(clazz.getName());
    

    And makes some additional calculations. So the method with String is obviously slightly faster.

    In general the pattern is to maintain the Logger reference as a static field in the class, something like this:

    public class SomeClass {
       private static final Logger LOG =   LoggerFactory.getLogger(SomeClass.class);
    }
    

    In this case you can't really use this.getClass() because this doesn't actually exists (you're running in a static context).

    From my experience its better to use the ClassName.getClass() as a parameter unless you really want to use the same logger from different classes. In such a case you better use some logical constant that denotes the logger.

    For example, let's say you're trying to use 3 different classes to access the database. So you create logger 'DB', assign a file appender that will write to database.log and you want to reuse the same logger among these 3 different classes.

    So you should use the following code:

    public class SomeClass {
       private static final Logger LOG =   LoggerFactory.getLogger("DB");
    }
    

    Hope this helps

    0 讨论(0)
提交回复
热议问题