/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.logging.log4j.core.async;

import java.net.URI;
import java.util.concurrent.TimeUnit;

import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.config.Configuration;
import org.apache.logging.log4j.core.config.DefaultConfiguration;
import org.apache.logging.log4j.core.jmx.RingBufferAdmin;
import org.apache.logging.log4j.message.MessageFactory;
import org.apache.logging.log4j.status.StatusLogger;

LoggerContext that creates AsyncLogger objects.
/** * {@code LoggerContext} that creates {@code AsyncLogger} objects. */
public class AsyncLoggerContext extends LoggerContext { private final AsyncLoggerDisruptor loggerDisruptor; public AsyncLoggerContext(final String name) { super(name); loggerDisruptor = new AsyncLoggerDisruptor(name); } public AsyncLoggerContext(final String name, final Object externalContext) { super(name, externalContext); loggerDisruptor = new AsyncLoggerDisruptor(name); } public AsyncLoggerContext(final String name, final Object externalContext, final URI configLocn) { super(name, externalContext, configLocn); loggerDisruptor = new AsyncLoggerDisruptor(name); } public AsyncLoggerContext(final String name, final Object externalContext, final String configLocn) { super(name, externalContext, configLocn); loggerDisruptor = new AsyncLoggerDisruptor(name); } @Override protected Logger newInstance(final LoggerContext ctx, final String name, final MessageFactory messageFactory) { return new AsyncLogger(ctx, name, messageFactory, loggerDisruptor); } @Override public void setName(final String name) { super.setName("AsyncContext[" + name + "]"); loggerDisruptor.setContextName(name); } /* * (non-Javadoc) * * @see org.apache.logging.log4j.core.LoggerContext#start() */ @Override public void start() { loggerDisruptor.start(); super.start(); } /* * (non-Javadoc) * * @see org.apache.logging.log4j.core.LoggerContext#start(org.apache.logging.log4j.core.config.Configuration) */ @Override public void start(final Configuration config) { maybeStartHelper(config); super.start(config); } private void maybeStartHelper(final Configuration config) { // If no log4j configuration was found, there are no loggers // and there is no point in starting the disruptor (which takes up // significant memory and starts a thread). if (config instanceof DefaultConfiguration) { StatusLogger.getLogger().debug("[{}] Not starting Disruptor for DefaultConfiguration.", getName()); } else { loggerDisruptor.start(); } } @Override public boolean stop(final long timeout, final TimeUnit timeUnit) { setStopping(); // first stop Disruptor loggerDisruptor.stop(timeout, timeUnit); super.stop(timeout, timeUnit); return true; }
Creates and returns a new RingBufferAdmin that instruments the ringbuffer of the AsyncLogger objects in this LoggerContext.
Returns:a new RingBufferAdmin that instruments the ringbuffer
/** * Creates and returns a new {@code RingBufferAdmin} that instruments the ringbuffer of the {@code AsyncLogger} * objects in this {@code LoggerContext}. * * @return a new {@code RingBufferAdmin} that instruments the ringbuffer */
public RingBufferAdmin createRingBufferAdmin() { return loggerDisruptor.createRingBufferAdmin(getName()); }
Signals this context whether it is allowed to use ThreadLocal objects for efficiency.
Params:
  • useThreadLocals – whether this context is allowed to use ThreadLocal objects
/** * Signals this context whether it is allowed to use ThreadLocal objects for efficiency. * @param useThreadLocals whether this context is allowed to use ThreadLocal objects */
public void setUseThreadLocals(final boolean useThreadLocals) { loggerDisruptor.setUseThreadLocals(useThreadLocals); } }