2015-09-25 4 views
0

Я использую общий класс (LoggerUtils.java) для регистрации сообщений в моем коде. Существует конструктор, который принимает класс как аргумент, и все остальные классы называют это для инициализации объекта регистрации. Я использую slf4j. Но моя проблема заключается в том, когда я просматриваю журнал, журнал отображает имя класса как LoggerUtils во всех журналах. Мне нужно увидеть класс, из которого я вызвал класс LoggerUtils для отображения моего журнала. Есть ли способ сделать это?Общий логгер в log4j

Log4j.properties:

log4j.appender.SampleLog=org.apache.log4j.DailyRollingFileAppender 
log4j.appender.SampleLog.File=/sample.log 
log4j.appender.SampleLog.layout=org.apache.log4j.PatternLayout 
log4j.appender.SampleLog.layout.ConversionPattern=%d{ISO8601} (%c: %M %L) - %m%n 
log4j.category.com.sample=DEBUG, SampleLog 

LoggerUtils.java

package com.sample.utils; 

    import org.slf4j.Logger; 
    import org.slf4j.LoggerFactory; 


    public class LoggerUtils { 

     private Logger logger; 

     private LoggerUtils(Class clazz) { 
      try { 
       logger = LoggerFactory.getLogger(clazz); 

      } catch (Exception e) { 
       System.out.println("Error in logger"); 
      } 
     } 

     public static LoggerUtils getLogger(Class clazz) { 
      return new LoggerUtils(clazz); 
     } 

     public void info(Object message) { 
      logger.info(message.toString()); 
     } 
    } 


My Sample Class: 

    package test; 

    import com.sample.utils.LoggerUtils; 

    public class Sample{ 
     LoggerUtils logger = LoggerUtils.getLogger(this.getClass()); 
     public void print(){ 
      logger.info("Hello"); 
     } 
    } 

В журнале, я получаю:

2015-09-25 16:19:21,784 (test.Sample: info 27) - Hello 

Я ожидал что-то вроде:

2015-09-25 16:19:21,784 (test.Sample: print 8) - Hello 
+1

Любой код, который вы хотите поделиться? – Thomas

+0

Моя проблема аналогична той, которая описана в этой ссылке http://stackoverflow.com/questions/21935367/log4j-class-name-showin-in-log-is-not-correct-when-i-call- the-logger-from-anoth Просто мне нужно напечатать имя метода и номер строки вместе с ним –

+0

поделиться файлом log4j.properties. – rajuGT

ответ

0

Чтобы получить метод и линию, называемую ваш служебный класс, получить текущий трассировки стека и двигаться вверх, пока вы не покинете код, называемый классом утилиты:

StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace(); 
for(StackTraceElement element : stackTrace) { 
    //ignore all entries from within LoggerUtils 
    if(element.getClassName().equalsIgnoreCase(LoggerUtils.class.getName())) { 
     continue; 
    } else { 
     String method = element.getMethodName(); 
     int lineNo = element.getLineNumber(); 
     break; 
    } 
} 
Смежные вопросы