/*
* Copyright 2012 Jason Miller
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package jj.logging;
import java.util.Map;
import io.netty.util.internal.logging.InternalLoggerFactory;
import io.netty.util.internal.logging.Slf4JLoggerFactory;
import javax.inject.Inject;
import javax.inject.Provider;
import javax.inject.Singleton;
import org.mozilla.javascript.ScriptableObject;
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.encoder.PatternLayoutEncoder;
import ch.qos.logback.classic.spi.ILoggingEvent;
import ch.qos.logback.core.ConsoleAppender;
import jj.configuration.ConfigurationLoaded;
import jj.event.Listener;
import jj.event.Subscriber;
import jj.script.Global;
import jj.script.RhinoContext;
/**
* @author jason
*
*/
@Singleton
@Subscriber
public class LoggingConfigurator {
private static final Logger rootLogger = (Logger)LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
private static final LoggerContext loggerContext = (LoggerContext)LoggerFactory.getILoggerFactory();
static {
// we are not interested in auto-configuration
loggerContext.reset();
PatternLayoutEncoder encoder = new PatternLayoutEncoder();
encoder.setContext(loggerContext);
// %highlight(%-5level) %cyan(%logger{15})
encoder.setPattern("%-5level %date{HH:mm:ss.SSS} %logger: %message >> [%mdc{thread}]%n%rootException");
encoder.start();
ConsoleAppender<ILoggingEvent> appender = new ConsoleAppender<ILoggingEvent>();
appender.setContext(loggerContext);
appender.setEncoder(encoder);
appender.start();
rootLogger.addAppender(appender);
InternalLoggerFactory.setDefaultFactory(new Slf4JLoggerFactory());
}
private final LoggingConfiguration config;
private final ScriptableObject loggerNames;
private final LogLevelDefaultProvider logLevelDefaultProvider;
@Inject
LoggingConfigurator(
final LoggingConfiguration config,
final @LoggerNames Map<String, String> loggerNames,
final @Global ScriptableObject global,
final Provider<RhinoContext> contextProvider,
final LogLevelDefaultProvider logLevelDefaultProvider
) {
this.config = config;
try (RhinoContext context = contextProvider.get()) {
this.loggerNames = context.newObject(global);
for (String name : loggerNames.keySet()) {
this.loggerNames.put(name, this.loggerNames, loggerNames.get(name));
}
}
this.logLevelDefaultProvider = logLevelDefaultProvider;
setLevels();
}
@Listener
void on(ConfigurationLoaded event) {
setLevels();
}
public ScriptableObject loggerNames() {
return loggerNames;
}
private void setLevels() {
logger(Logger.ROOT_LOGGER_NAME, Level.OFF);
setLevels(logLevelDefaultProvider.get());
//setLevels(config.loggingLevels());
logger(EmergencyLogger.NAME, Level.TRACE);
}
private void setLevels(Map<String, jj.logging.Level> levelMap) {
for (String logger : levelMap.keySet()) {
logger(logger, levelMap.get(logger).logbackLevel());
}
}
private void logger(String name, Level level) {
((Logger)LoggerFactory.getLogger(name)).setLevel(level);
}
}