Как настроить slf4j api для bugvm / playn?

#android #ios #slf4j #robovm

#Android #iOS #slf4j #robovm

Вопрос:

Как вы можете настроить BugVm / PlayN / RoboVM для использования определенной инфраструктуры ведения журнала для всех журналов, запускаемых через slf4j-api?

BugVm / PlayN / RoboVM — это некоторые инструменты, позволяющие разрабатывать поверх ios и Android. Байт-код Java компилируется с учетом особенностей платформы, и обычные библиотеки ведения журнала ничего не регистрируют.

Ответ №1:

Сначала убедитесь, что у вас есть доступ к объекту BugPlatform

 {
    // create a full-screen window
    CGRect bounds = UIScreen.getMainScreen().getBounds();
    UIWindow window = new UIWindow(bounds);
    // create and initialize the PlayN platform
    BugPlatform.Config config = new BugPlatform.Config();
    config.orients = UIInterfaceOrientationMask.All;

    //get a BugPlatform
    final BugPlatform pf = BugPlatform.create(window, config);
    pf.log().info("test direct logging");

    //add a new appender
    addSlf4jBugVmAppender(pf);

    //test the new log via slf4j
    org.slf4j.LoggerFactory.getLogger("a").info("logging via BugVmAppender with [{}]","success");
}

private void addSlf4jBugVmAppender(BugPlatform pf) {
    Logger logbackLogger = (ch.qos.logback.classic.Logger) LoggerFactory
            .getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
    LoggerContext lc = logbackLogger.getLoggerContext();

    PatternLayout pl = new PatternLayout();
    pl.setPattern("%d %5p %t [%c:%L] %m%n)");
    pl.setContext(lc);
    pl.start();

    BugVmAppender<ILoggingEvent> appender = new BugVmAppender<ILoggingEvent>(pf);
    appender.setName("BUGVM_APPENDER");
    appender.setLayout(pl);
    appender.start();
    Logger rootLogger = lc.getLogger(Logger.ROOT_LOGGER_NAME);

    rootLogger.addAppender(appender);
}
 

BugVmAppender будет таким:

 package playn.showcase.bugvm;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.AppenderBase;
import ch.qos.logback.core.Layout;
import playn.bugvm.BugPlatform;
import playn.core.Log;

public class BugVmAppender<T extends ILoggingEvent> extends AppenderBase<T> {
    private Log log;
    private Layout<T> layout;

    public BugVmAppender(BugPlatform pf) {
        this.log = pf.log();
    }

    @Override
    protected void append(T event) {
        int level = event.getLevel().levelInt;
        if (level == Level.ERROR.levelInt) {
            log.error(layout.doLayout(event));
        } else if (level == Level.WARN.levelInt) {
            log.warn(layout.doLayout(event));
        } else if (level == Level.INFO.levelInt) {
            log.info(layout.doLayout(event));
        } else if (level == Level.DEBUG.levelInt) {
            log.debug(layout.doLayout(event));
        } else if (level == Level.TRACE.levelInt) {
            log.debug(layout.doLayout(event));
        }
    }

    public void setLayout(Layout<T> layout) {
        this.layout = layout;
    }
}
 

Теперь лог в ios должен быть примерно таким:

 Oct 16 05:06:54 iPad ShowcaseBugVM[1941] <Warning>: INFO: test direct logging
Oct 16 05:06:54 iPad ShowcaseBugVM[1941] <Warning>: INFO: 2016-10-16 05:06:54,774  INFO main [a:-1] logging via BugVmAppender with [success]
Oct 16 05:06:54 iPad ShowcaseBugVM[1941] <Warning>: INFO: 2016-10-16 05:06:54,786  INFO main [playn.showcase.bugvm.AppInfo:-1] searching information for class playn.showcase.bugvm.ShowcaseBugVM$1 defined in groupId=[] artifactId=[]