Categories:
Audio (13)
Biotech (29)
Bytecode (36)
Database (77)
Framework (7)
Game (7)
General (507)
Graphics (53)
I/O (35)
IDE (2)
JAR Tools (101)
JavaBeans (21)
JDBC (121)
JDK (426)
JSP (20)
Logging (108)
Mail (58)
Messaging (8)
Network (84)
PDF (97)
Report (7)
Scripting (84)
Security (32)
Server (121)
Servlet (26)
SOAP (24)
Testing (54)
Web (15)
XML (309)
Collections:
Other Resources:
Source Code for Apache Log4j API
Apache Log4j API
provides the interface that applications should code to and provides the adapter
components required for implementers to create a logging implementation.
Apache Log4j API is a required module to use Apache Log4j.
Bytecode (Java 8) for Apache Log4j API is provided in a separate JAR file like log4j-api-2.14.1.jar.
Source Code files for Apache Log4j API are provided in both binary packge like apache-log4j-2.14.1-bin.zip and source package like apache-log4j-2.14.1-src.zip. You can download them at Apache Log4j Website.
You can also browse Source Code files for Apache Log4j API 2.14.1 below.
✍: FYIcenter.com
⏎ org/apache/logging/log4j/status/StatusLogger.java
/* * 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.status; import java.io.Closeable; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Queue; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Marker; import org.apache.logging.log4j.message.Message; import org.apache.logging.log4j.message.MessageFactory; import org.apache.logging.log4j.message.ParameterizedNoReferenceMessageFactory; import org.apache.logging.log4j.simple.SimpleLogger; import org.apache.logging.log4j.simple.SimpleLoggerContext; import org.apache.logging.log4j.spi.AbstractLogger; import org.apache.logging.log4j.util.Constants; import org.apache.logging.log4j.util.PropertiesUtil; import org.apache.logging.log4j.util.Strings; /** * Records events that occur in the logging system. By default, only error messages are logged to {@link System#err}. * Normally, the Log4j StatusLogger is configured via the root {@code <Configuration status="LEVEL"/>} node in a Log4j * configuration file. However, this can be overridden via a system property named * "{@value SimpleLoggerContext#SYSTEM_PREFIX}StatusLogger.level" and will work with any Log4j provider. * * @see SimpleLogger * @see SimpleLoggerContext */ public final class StatusLogger extends AbstractLogger { /** * System property that can be configured with the number of entries in the queue. Once the limit is reached older * entries will be removed as new entries are added. */ public static final String MAX_STATUS_ENTRIES = "log4j2.status.entries"; /** * System property that can be configured with the {@link Level} name to use as the default level for * {@link StatusListener}s. */ public static final String DEFAULT_STATUS_LISTENER_LEVEL = "log4j2.StatusLogger.level"; /** * System property that can be configured with a date-time format string to use as the format for timestamps * in the status logger output. See {@link java.text.SimpleDateFormat} for supported formats. * @since 2.11.0 */ public static final String STATUS_DATE_FORMAT = "log4j2.StatusLogger.DateFormat"; private static final long serialVersionUID = 2L; private static final String NOT_AVAIL = "?"; private static final PropertiesUtil PROPS = new PropertiesUtil("log4j2.StatusLogger.properties"); private static final int MAX_ENTRIES = PROPS.getIntegerProperty(MAX_STATUS_ENTRIES, 200); private static final String DEFAULT_STATUS_LEVEL = PROPS.getStringProperty(DEFAULT_STATUS_LISTENER_LEVEL); // LOG4J2-1176: normal parameterized message remembers param object, causing memory leaks. private static final StatusLogger STATUS_LOGGER = new StatusLogger(StatusLogger.class.getName(), ParameterizedNoReferenceMessageFactory.INSTANCE); private final SimpleLogger logger; private final Collection<StatusListener> listeners = new CopyOnWriteArrayList<>(); @SuppressWarnings("NonSerializableFieldInSerializableClass") // ReentrantReadWriteLock is Serializable private final ReadWriteLock listenersLock = new ReentrantReadWriteLock(); private final Queue<StatusData> messages = new BoundedQueue<>(MAX_ENTRIES); @SuppressWarnings("NonSerializableFieldInSerializableClass") // ReentrantLock is Serializable private final Lock msgLock = new ReentrantLock(); private int listenersLevel; private StatusLogger(final String name, final MessageFactory messageFactory) { super(name, messageFactory); final String dateFormat = PROPS.getStringProperty(STATUS_DATE_FORMAT, Strings.EMPTY); final boolean showDateTime = !Strings.isEmpty(dateFormat); this.logger = new SimpleLogger("StatusLogger", Level.ERROR, false, true, showDateTime, false, dateFormat, messageFactory, PROPS, System.err); this.listenersLevel = Level.toLevel(DEFAULT_STATUS_LEVEL, Level.WARN).intLevel(); // LOG4J2-1813 if system property "log4j2.debug" is defined, print all status logging if (isDebugPropertyEnabled()) { logger.setLevel(Level.TRACE); } } // LOG4J2-1813 if system property "log4j2.debug" is defined, print all status logging private boolean isDebugPropertyEnabled() { return PropertiesUtil.getProperties().getBooleanProperty(Constants.LOG4J2_DEBUG, false, true); } /** * Retrieve the StatusLogger. * * @return The StatusLogger. */ public static StatusLogger getLogger() { return STATUS_LOGGER; } public void setLevel(final Level level) { logger.setLevel(level); } /** * Registers a new listener. * * @param listener The StatusListener to register. */ public void registerListener(final StatusListener listener) { listenersLock.writeLock().lock(); try { listeners.add(listener); final Level lvl = listener.getStatusLevel(); if (listenersLevel < lvl.intLevel()) { listenersLevel = lvl.intLevel(); } } finally { listenersLock.writeLock().unlock(); } } /** * Removes a StatusListener. * * @param listener The StatusListener to remove. */ public void removeListener(final StatusListener listener) { closeSilently(listener); listenersLock.writeLock().lock(); try { listeners.remove(listener); int lowest = Level.toLevel(DEFAULT_STATUS_LEVEL, Level.WARN).intLevel(); for (final StatusListener statusListener : listeners) { final int level = statusListener.getStatusLevel().intLevel(); if (lowest < level) { lowest = level; } } listenersLevel = lowest; } finally { listenersLock.writeLock().unlock(); } } public void updateListenerLevel(final Level status) { if (status.intLevel() > listenersLevel) { listenersLevel = status.intLevel(); } } /** * Returns a thread safe Iterable for the StatusListener. * * @return An Iterable for the list of StatusListeners. */ public Iterable<StatusListener> getListeners() { return listeners; } /** * Clears the list of status events and listeners. */ public void reset() { listenersLock.writeLock().lock(); try { for (final StatusListener listener : listeners) { closeSilently(listener); } } finally { listeners.clear(); listenersLock.writeLock().unlock(); // note this should certainly come after the unlock to avoid unnecessary nested locking clear(); } } private static void closeSilently(final Closeable resource) { try { resource.close(); } catch (final IOException ignored) { // ignored } } /** * Returns a List of all events as StatusData objects. * * @return The list of StatusData objects. */ public List<StatusData> getStatusData() { msgLock.lock(); try { return new ArrayList<>(messages); } finally { msgLock.unlock(); } } /** * Clears the list of status events. */ public void clear() { msgLock.lock(); try { messages.clear(); } finally { msgLock.unlock(); } } @Override public Level getLevel() { return logger.getLevel(); } /** * Adds an event. * * @param marker The Marker * @param fqcn The fully qualified class name of the <b>caller</b> * @param level The logging level * @param msg The message associated with the event. * @param t A Throwable or null. */ @Override public void logMessage(final String fqcn, final Level level, final Marker marker, final Message msg, final Throwable t) { StackTraceElement element = null; if (fqcn != null) { element = getStackTraceElement(fqcn, Thread.currentThread().getStackTrace()); } final StatusData data = new StatusData(element, level, msg, t, null); msgLock.lock(); try { messages.add(data); } finally { msgLock.unlock(); } // LOG4J2-1813 if system property "log4j2.debug" is defined, all status logging is enabled if (isDebugPropertyEnabled() || (listeners.size() <= 0)) { logger.logMessage(fqcn, level, marker, msg, t); } else { for (final StatusListener listener : listeners) { if (data.getLevel().isMoreSpecificThan(listener.getStatusLevel())) { listener.log(data); } } } } private StackTraceElement getStackTraceElement(final String fqcn, final StackTraceElement[] stackTrace) { if (fqcn == null) { return null; } boolean next = false; for (final StackTraceElement element : stackTrace) { final String className = element.getClassName(); if (next && !fqcn.equals(className)) { return element; } if (fqcn.equals(className)) { next = true; } else if (NOT_AVAIL.equals(className)) { break; } } return null; } @Override public boolean isEnabled(final Level level, final Marker marker, final String message, final Throwable t) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final String message) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final String message, final Object... params) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0, final Object p1) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5, final Object p6) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5, final Object p6, final Object p7) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5, final Object p6, final Object p7, final Object p8) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, final Object p5, final Object p6, final Object p7, final Object p8, final Object p9) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final CharSequence message, final Throwable t) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final Object message, final Throwable t) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker, final Message message, final Throwable t) { return isEnabled(level, marker); } @Override public boolean isEnabled(final Level level, final Marker marker) { // LOG4J2-1813 if system property "log4j2.debug" is defined, all status logging is enabled if (isDebugPropertyEnabled()) { return true; } if (listeners.size() > 0) { return listenersLevel >= level.intLevel(); } return logger.isEnabled(level, marker); } /** * Queues for status events. * * @param <E> Object type to be stored in the queue. */ private class BoundedQueue<E> extends ConcurrentLinkedQueue<E> { private static final long serialVersionUID = -3945953719763255337L; private final int size; BoundedQueue(final int size) { this.size = size; } @Override public boolean add(final E object) { super.add(object); while (messages.size() > size) { messages.poll(); } return size > 0; } } }
⏎ org/apache/logging/log4j/status/StatusLogger.java
Or download all of them as a single archive file:
File name: log4j-api-2.14.1-sources.jar File size: 264773 bytes Release date: 2021-03-06 Download
⇒ Source Code for Apache Log4j Core Implementation
⇐ Downloading Apache Log4j Binary Package
2015-11-17, 23396👍, 0💬
Popular Posts:
JDK 11 java.naming.jmod is the JMOD file for JDK 11 Naming module. JDK 11 Naming module compiled cla...
What Is XMLBeans xbean.jar 2.6.0? XMLBeans xbean.jar 2.6.0 is the JAR file for Apache XMLBeans 2.6.0...
JDK 11 java.rmi.jmod is the JMOD file for JDK 11 RMI (Remote Method Invocation) module. JDK 11 RMI m...
How to download and install ojdbc6.jar for Oracle 11g R2? ojdbc6.jar for Oracle 11g R2 is a Java 6, ...
What Is jms.jar? I heard it's related to JMS (Java Message Service) 1.1? The if you have an jms.jar ...