2015-08-16 3 views
3

У меня есть вопрос относительно ведения журнала.Сброс регистрационного регистратора

Короткая версия

Если создание Appender не удается (например, прав), как я явно повторно попытку создать его, когда проблемы с разрешениями решены. Я использую конфигурацию XML. Я хотел бы сделать это без повторного запуска моего процесса.

Longer версия

Я использую Logback на Android (logback-android).

Я регистрируюсь в каталоге на внешнем хранилище, а это означает, что если пользователь подключит устройство к ПК и включит массовое хранилище, файловая система каталога будет отключена.

Если приложение запускается, в то время как каталог не доступен, я сообщить пользователю, но поскольку регистраторы определяются как статические поля ...

private static final Logger LOG = LoggerFactory.getLogger(MyApplication.class); 

... Logback пытается создать Appender все равно когда мои классы загружаются загрузчиком классов и не выполняются.

Из-за того, как работает Android, процесс приложения продолжает работать, даже когда пользователь покидает все экраны моего приложения (например, переходит на главный экран), и поэтому приложение никогда не будет пытаться создать его.

Есть ли способ сбросить приложение из конфигурации? Если это так, я могу попытаться сбросить Logback, если это необходимо, когда пользователь вводит начальный экран моего приложения.

Я пытался остановить его, используя ...

LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); 
if (loggerContext != null) 
    loggerContext.stop(); 

... который, кажется, работает нормально, но я, кажется, не быть в состоянии повторно запустить его:

loggerContext.start() 

Кажется, это не воссоздает приложение.

Большое спасибо за помощь.

ответ

1

Перезапуск приложения может быть достигнут путем перезагрузки конфигурации LogBack. В моем случае у меня была конфигурация в файле XML, поэтому я использовал что-то по строкам:

// reset the default context (which may already have been initialized) 
// since we want to reconfigure it 
LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory(); 
lc.reset(); 

JoranConfigurator config = new JoranConfigurator(); 
config.setContext(lc); 

try { 
    config.doConfigure("/path/to/config.xml"); 
} catch (JoranException e) { 
    e.printStackTrace(); 
} 
0

У меня была такая же проблема. Я сохраняю регистраторы как статические переменные, поэтому им пришлось сбрасывать их через сброс. Решение ниже:

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); 
// Copy current loggers, necessary to keep logging. 
List<LoggerContextListener> loggers = lc.getCopyOfListenerList(); 
lc.reset(); 
JoranConfigurator config = new JoranConfigurator(); 
config.setContext(lc); 

try { 
    // Context ctx; 
    InputStream inputStream = ctx.getAssets().open("logback.xml"); 
    config.doConfigure(inputStream); 
    for (LoggerContextListener l : loggers) { 
     lc.addListener(l); // restore loggers 
    } 
} catch (JoranException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
log.info("logger reset"); 

assets/logback.xml ниже:

<configuration> 
    <property name="EXT_CACHE_DIR" value="${EXT_DIR:-/sdcard}/Android/data/${PACKAGE_NAME}/cache"/> 
    <!-- Create a logcat appender --> 
    <appender name="logcat" class="ch.qos.logback.classic.android.LogcatAppender"> 
    <encoder> 
     <pattern>%msg%n</pattern> 
    </encoder> 
    </appender> 

    <appender name="ROLLING" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
    <file>${EXT_CACHE_DIR}/logs/current.log</file> 
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
     <!-- rollover hourly --> 
     <fileNamePattern>${EXT_CACHE_DIR}/logs/%d{yyyy-MM-dd_HH,UTC}.%i.log.gz</fileNamePattern> 
     <timeBasedFileNamingAndTriggeringPolicy 
      class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> 
      <maxFileSize>100KB</maxFileSize> 
     </timeBasedFileNamingAndTriggeringPolicy> 
     <maxHistory>30</maxHistory> 
    </rollingPolicy> 
    <encoder> 
     <pattern>%-5relative %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36}: %msg%n</pattern> 
    </encoder> 
    </appender> 

    <root level="DEBUG"> 
    <appender-ref ref="logcat" /> 
    <appender-ref ref="ROLLING" /> 
    </root> 
</configuration> 

Проблема я столкнулся это: файл Appender не инициализируется.

Смежные вопросы