2014-02-27 51 views
0

我目前的任務是將所有出現的LOG4J更改爲SLF4J,並在必要時包括logb​​ack。轉換LOG4J >> SLF4J + logback

我已經管理將所有舊的log4j.xml轉換爲logback.xml,並強制使用logback appender,但是,我剛剛在代碼中發現了一行,我無法將其轉換爲slf4j/logback。

用谷歌搜索這個問題沒有任何可用的東西,所以我希望你們中的一些人能幫助我。

的代碼行是:

for (final Enumeration e = LogManager.getLoggerRepository().getCurrentLoggers(); e.hasMoreElements();) { 
    final Logger logger = (Logger) e.nextElement(); 
     final Level level = logger.getLevel(); 
     if (level != null) { 
      final String name = logger.getName(); 
      final Integer intLvl = new Integer(level.toInt()); 
      logLevelLocal.put(name, intLvl); 
} 

的主要問題似乎是LogManager類。我無法想出任何對等的logback。有沒有人知道在logback中是否有類似的東西,或者是否有某種解決方法?

最好的問候, daZza

編輯:

1:

public static void toggleLogging(final boolean enable) { 

    if (enable) { 
     Properties.LOGGING_ENABLED = Boolean.TRUE; 
     System.out.println(ConstantsCommon.SYSOUT_PREFIX + LOG_LOGGING + LOG_ON); 

     for (final Iterator it = ConstantsCommon.LOGGER_LEVELS.keySet().iterator(); it.hasNext();) { 
      final String logger = (String) it.next(); 
      final int logLevel = ((Integer) ConstantsCommon.LOGGER_LEVELS.get(logger)).intValue(); 
      ((Logger) LoggerFactory.getLogger(logger)).setLevel(Level.toLevel(logLevel)); 
     } 
     root.setLevel(Level.toLevel(ConstantsCommon.LOGGER_ROOTLEVEL)); 

    } else { 
     Properties.LOGGING_ENABLED = Boolean.FALSE; 
     System.out.println(ConstantsCommon.SYSOUT_PREFIX + LOG_LOGGING + LOG_OFF); 

     for (final Iterator it = ConstantsCommon.LOGGER_LEVELS.keySet().iterator(); it.hasNext();) { 
      final String logger = (String) it.next(); 
      ((Logger) LoggerFactory.getLogger(logger)).setLevel(Level.OFF); 
     } 
     root.setLevel(Level.OFF); 
    } 
} 

2:

public void setLogLevel(final String loggerName, final int level) throws ModelRemoteException { 
    if ((level == Priority.ALL_INT) || (level == Priority.DEBUG_INT) || (level == Priority.ERROR_INT) 
      || (level == Priority.FATAL_INT) || (level == Priority.INFO_INT) || (level == Priority.WARN_INT) 
      || (level == Priority.OFF_INT)) { 
     final Level targetLevel = Level.toLevel(level); 

     final Logger logger = ((Logger) LoggerFactory.getLogger(loggerName)); 
     if (logger != null) { 

      ((Logger) LoggerFactory.getLogger(loggerName)).setLevel(targetLevel); 

      ConstantsCommon.LOGGER_LEVELS.put(loggerName, new Integer(level)); 
     } else { 
      throw new ModelRemoteException(PropertiesErrorCodes.ec2024); 
     } 
    } else { 
     throw new ModelRemoteException(PropertiesErrorCodes.ec2025); 
    } 
} 
+0

什麼在循環內?通常主應用程序完全不知道記錄器的配置,所以這裏最有可能發生一些有趣的事情。 –

+0

已修改。不要認爲它是相關的。我只需要logManager.getLoggerRepository()的logback「翻譯」。getCurrentLoggers() – daZza

+0

看起來你正在創建一個lognames-> level的地圖,這對我來說聽起來像一個調試工具(它應該移出你的應用程序並進入記錄器配置在我看來)或優化測試如果記錄器被啓用(這在slf4j更容易)。 –

回答

0

通過萬噸文檔和論壇帖子的再次去之後,我覺得我已經在logback中找到了一個可行的解決方案。

除了使用(不存在)LogManager類,現在我使用的logback LoggerContext的:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 

而不是使用getLoggerRepository()和getCurrentLoggers()我切換到使用

lc.getLoggerList(); 
+0

這可能是一種模仿你的代碼用log4j做什麼的方法。但請記住,這種代碼再次將您的代碼庫與特定的日誌記錄實現綁定在一起,slf4j專門用於防止(如果使用正確的話)。對我來說,在代碼中使用方法來切換日誌記錄的開/關和更改級別似乎是錯誤的,特別是對於特定的日誌記錄框架。這種東西應該通過配置文件來完成,這些配置文件已經允許動態更改日誌記錄和日誌級別。正在運行的程序本身不應該(不得不)在這裏進行干預。 – sheltem