1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache license, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the license for the specific language governing permissions and 15 * limitations under the license. 16 */ 17 package org.apache.logging.log4j.core.util; 18 19 import java.nio.charset.Charset; 20 import java.nio.charset.StandardCharsets; 21 22 import org.apache.logging.log4j.util.PropertiesUtil; 23 24 /** 25 * Log4j Constants. 26 */ 27 public final class Constants { 28 29 /** 30 * Name of the system property to use to identify the LogEvent factory. 31 */ 32 public static final String LOG4J_LOG_EVENT_FACTORY = "Log4jLogEventFactory"; 33 34 /** 35 * Name of the system property to use to identify the ContextSelector Class. 36 */ 37 public static final String LOG4J_CONTEXT_SELECTOR = "Log4jContextSelector"; 38 39 /** 40 * Property name for the default status (internal log4j logging) level to use if not specified in configuration. 41 */ 42 public static final String LOG4J_DEFAULT_STATUS_LEVEL = "Log4jDefaultStatusLevel"; 43 44 /** 45 * JNDI context name string literal. 46 */ 47 public static final String JNDI_CONTEXT_NAME = "java:comp/env/log4j/context-name"; 48 49 /** 50 * Line separator. 51 */ 52 public static final String LINE_SEPARATOR = PropertiesUtil.getProperties().getStringProperty("line.separator", 53 "\n"); 54 55 /** 56 * Number of milliseconds in a second. 57 */ 58 public static final int MILLIS_IN_SECONDS = 1000; 59 60 /** 61 * Equivalent to StandardCharsets.UTF_8. 62 * 63 * @deprecated Use {@link StandardCharsets#UTF_8}. Will be removed in 2.5. 64 */ 65 @Deprecated 66 public static final Charset UTF_8 = StandardCharsets.UTF_8; 67 68 /** 69 * Supports user request LOG4J2-898 to have the option to format a message in the background thread. 70 */ 71 public static final boolean FORMAT_MESSAGES_IN_BACKGROUND = PropertiesUtil.getProperties().getBooleanProperty( 72 "log4j.format.msg.async", false); 73 74 /** 75 * {@code true} if we think we are running in a web container, based on the boolean value of system property 76 * "log4j2.is.webapp", or (if this system property is not set) whether the {@code javax.servlet.Servlet} class 77 * is present in the classpath. 78 */ 79 public static final boolean IS_WEB_APP = PropertiesUtil.getProperties().getBooleanProperty( 80 "log4j2.is.webapp", Loader.isClassAvailable("javax.servlet.Servlet")); 81 82 /** 83 * Kill switch for object pooling in ThreadLocals that enables much of the LOG4J2-1270 no-GC behaviour. 84 * <p> 85 * {@code True} for non-{@link #IS_WEB_APP web apps}, disable by setting system property 86 * "log4j2.enable.threadlocals" to "false". 87 * 88 * @since 2.6 89 */ 90 public static final boolean ENABLE_THREADLOCALS = !IS_WEB_APP && PropertiesUtil.getProperties().getBooleanProperty( 91 "log4j2.enable.threadlocals", true); 92 93 /** 94 * Kill switch for garbage-free Layout behaviour that encodes LogEvents directly into 95 * {@link org.apache.logging.log4j.core.layout.ByteBufferDestination}s without creating intermediate temporary 96 * Objects. 97 * <p> 98 * {@code True} by default iff all loggers are asynchronous because system property 99 * {@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 }