001/* 002 * Licensed to the Apache Software Foundation (ASF) under one or more 003 * contributor license agreements. See the NOTICE file distributed with 004 * this work for additional information regarding copyright ownership. 005 * The ASF licenses this file to You under the Apache license, Version 2.0 006 * (the "License"); you may not use this file except in compliance with 007 * the License. You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the license for the specific language governing permissions and 015 * limitations under the license. 016 */ 017package org.apache.logging.log4j.core.util; 018 019import java.nio.charset.Charset; 020import java.nio.charset.StandardCharsets; 021 022import org.apache.logging.log4j.util.PropertiesUtil; 023 024/** 025 * Log4j Constants. 026 */ 027public final class Constants { 028 029 /** 030 * Name of the system property to use to identify the LogEvent factory. 031 */ 032 public static final String LOG4J_LOG_EVENT_FACTORY = "Log4jLogEventFactory"; 033 034 /** 035 * Name of the system property to use to identify the ContextSelector Class. 036 */ 037 public static final String LOG4J_CONTEXT_SELECTOR = "Log4jContextSelector"; 038 039 /** 040 * Property name for the default status (internal log4j logging) level to use if not specified in configuration. 041 */ 042 public static final String LOG4J_DEFAULT_STATUS_LEVEL = "Log4jDefaultStatusLevel"; 043 044 /** 045 * JNDI context name string literal. 046 */ 047 public static final String JNDI_CONTEXT_NAME = "java:comp/env/log4j/context-name"; 048 049 /** 050 * Line separator. 051 */ 052 public static final String LINE_SEPARATOR = PropertiesUtil.getProperties().getStringProperty("line.separator", 053 "\n"); 054 055 /** 056 * Number of milliseconds in a second. 057 */ 058 public static final int MILLIS_IN_SECONDS = 1000; 059 060 /** 061 * Equivalent to StandardCharsets.UTF_8. 062 * 063 * @deprecated Use {@link StandardCharsets#UTF_8}. Will be removed in 2.5. 064 */ 065 @Deprecated 066 public static final Charset UTF_8 = StandardCharsets.UTF_8; 067 068 /** 069 * Supports user request LOG4J2-898 to have the option to format a message in the background thread. 070 */ 071 public static final boolean FORMAT_MESSAGES_IN_BACKGROUND = PropertiesUtil.getProperties().getBooleanProperty( 072 "log4j.format.msg.async", false); 073 074 /** 075 * {@code true} if we think we are running in a web container, based on the boolean value of system property 076 * "log4j2.is.webapp", or (if this system property is not set) whether the {@code javax.servlet.Servlet} class 077 * is present in the classpath. 078 */ 079 public static final boolean IS_WEB_APP = PropertiesUtil.getProperties().getBooleanProperty( 080 "log4j2.is.webapp", Loader.isClassAvailable("javax.servlet.Servlet")); 081 082 /** 083 * Kill switch for object pooling in ThreadLocals that enables much of the LOG4J2-1270 no-GC behaviour. 084 * <p> 085 * {@code True} for non-{@link #IS_WEB_APP web apps}, disable by setting system property 086 * "log4j2.enable.threadlocals" to "false". 087 * 088 * @since 2.6 089 */ 090 public static final boolean ENABLE_THREADLOCALS = !IS_WEB_APP && PropertiesUtil.getProperties().getBooleanProperty( 091 "log4j2.enable.threadlocals", true); 092 093 /** 094 * Kill switch for garbage-free Layout behaviour that encodes LogEvents directly into 095 * {@link org.apache.logging.log4j.core.layout.ByteBufferDestination}s without creating intermediate temporary 096 * Objects. 097 * <p> 098 * {@code True} by default iff all loggers are asynchronous because system property 099 * {@code Log4jContextSelector} is set to {@code org.apache.logging.log4j.core.async.AsyncLoggerContextSelector}. 100 * Disable by setting system property "log4j2.enable.direct.encoders" to "false". 101 * 102 * @since 2.6 103 */ 104 public static final boolean ENABLE_DIRECT_ENCODERS = PropertiesUtil.getProperties().getBooleanProperty( 105 "log4j2.enable.direct.encoders", true); // enable GC-free text encoding by default 106 // the alternative is to enable GC-free encoding only by default only when using all-async loggers: 107 //AsyncLoggerContextSelector.class.getName().equals(PropertiesUtil.getProperties().getStringProperty(LOG4J_CONTEXT_SELECTOR))); 108 109 /** 110 * Initial StringBuilder size used in RingBuffer LogEvents to store the contents of reusable Messages. 111 * <p> 112 * The default value is {@value}, users can override with system property "log4j.initialReusableMsgSize". 113 * </p> 114 * @since 2.6 115 */ 116 public static final int INITIAL_REUSABLE_MESSAGE_SIZE = size("log4j.initialReusableMsgSize", 128); 117 118 /** 119 * Maximum size of the StringBuilders used in RingBuffer LogEvents to store the contents of reusable Messages. 120 * After a large message has been delivered to the appenders, the StringBuilder is trimmed to this size. 121 * <p> 122 * The default value is {@value}, which allows the StringBuilder to resize three times from its initial size. 123 * Users can override with system property "log4j.maxReusableMsgSize". 124 * </p> 125 * @since 2.6 126 */ 127 public static final int MAX_REUSABLE_MESSAGE_SIZE = size("log4j.maxReusableMsgSize", (128 * 2 + 2) * 2 + 2); 128 129 /** 130 * Size of CharBuffers used by text encoders. 131 * <p> 132 * The default value is {@value}, users can override with system property "log4j.encoder.charBufferSize". 133 * </p> 134 * @since 2.6 135 */ 136 public static final int ENCODER_CHAR_BUFFER_SIZE = size("log4j.encoder.charBufferSize", 2048); 137 138 /** 139 * Default size of ByteBuffers used to encode LogEvents without allocating temporary objects. 140 * <p> 141 * The default value is {@value}, users can override with system property "log4j.encoder.byteBufferSize". 142 * </p> 143 * @see org.apache.logging.log4j.core.layout.ByteBufferDestination 144 * @since 2.6 145 */ 146 public static final int ENCODER_BYTE_BUFFER_SIZE = size("log4j.encoder.byteBufferSize", 8 * 1024); 147 148 149 private static int size(final String property, final int defaultValue) { 150 return PropertiesUtil.getProperties().getIntegerProperty(property, defaultValue); 151 } 152 153 /** 154 * Prevent class instantiation. 155 */ 156 private Constants() { 157 } 158}