2014-02-27 109 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