Package io.fathom.cloud.log

Source Code of io.fathom.cloud.log.LogbackHook

package io.fathom.cloud.log;

import java.io.IOException;
import java.util.List;

import org.slf4j.LoggerFactory;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.Logger;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
import ch.qos.logback.core.AppenderBase;

import com.google.common.collect.Lists;

public class LogbackHook<E> extends AppenderBase<E> {

    public static void attachToRootLogger() {
        LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();

        LogbackHook appender = new LogbackHook();
        appender.start();

        Logger logbackLogger = loggerContext.getLogger(org.slf4j.Logger.ROOT_LOGGER_NAME);
        logbackLogger.addAppender(appender);
    }

    @Override
    protected void append(E e) {
        List<LogHook> hooks = LogHook.getHooks();

        if (!hooks.isEmpty()) {
            ILoggingEvent event = (ILoggingEvent) e;

            // Note that we can get the unformatted message in getMessage(),
            // presumably along with the parameters...
            String loggerName = event.getLoggerName();
            String message = event.getFormattedMessage();
            Level level = event.getLevel();
            int levelInt = level.toInt();

            List<String[]> exceptionStacks = null;

            IThrowableProxy throwableInformation = event.getThrowableProxy();
            while (throwableInformation != null) {
                String[] exceptionStackTrace = null;
                StackTraceElementProxy[] trace = throwableInformation.getStackTraceElementProxyArray();

                String exceptionMessage = throwableInformation.getMessage();
                String exceptionClass = throwableInformation.getClassName();

                if (trace != null) {
                    exceptionStackTrace = new String[1 + trace.length];
                    exceptionStackTrace[0] = exceptionClass + ": " + exceptionMessage;

                    for (int i = 0; i < trace.length; i++) {
                        exceptionStackTrace[1 + i] = trace[i].getSTEAsString();
                    }
                } else {
                    exceptionStackTrace = new String[1];
                    exceptionStackTrace[0] = exceptionClass + ": " + exceptionMessage;
                }

                if (exceptionStacks == null) {
                    exceptionStacks = Lists.newArrayList();
                }
                exceptionStacks.add(exceptionStackTrace);

                throwableInformation = throwableInformation.getCause();
            }

            if (message != null || exceptionStacks != null) {
                for (LogHook hook : hooks) {
                    try {
                        hook.log(loggerName, message, exceptionStacks, levelInt);
                    } catch (IOException e2) {
                        // Ignore
                    }
                }
            }
        }
    }
}
TOP

Related Classes of io.fathom.cloud.log.LogbackHook

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.