[英]Multiple patterns not working while writing the logs to console
我的要求是將不同的日志寫入需要具有不同模式的控制台。
我使用了多個 appender 並使用了一個單獨的記錄器,但它沒有采用我為 appender 提供的模式,而是采用了另一種模式。
下面是log4j2.properties
name = PropertiesConfig
appenders = console, console1
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %t %-5p %c{6}:%L - %m%n
appender.console1.type = Console
appender.console1.name = STDOUT1
appender.console1.layout.type = PatternLayout
appender.console1.layout.pattern = %m%n
loggers = rolling
logger.rolling.name = org.apache.logging.log4j.core.appender.rolling
#Configure module specific
logger.org.apache.kafka.common.network.Selector = info
logger.com.test.test1 = fine
logger.com.test.test1.service.impl.RSStd=info
#configure rootLogger and attach all the appenders to it
rootLogger.level = info
rootLogger.appenderRef.console.ref = STDOUT
logger.performancelog.name = PERFORMANCE_LOG
logger.performancelog.additivity = false
logger.performancelog.level = info
logger.performancelog.appenderRef.console1.ref = STDOUT1
每次它選擇這個模式
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %t %-5p %c{6}:%L - %m%n
代替
appender.console1.layout.pattern = %m%n
下面是我的 java 代碼GlobalLogger
import java.util.Objects;
import org.apache.logging.log4j.core.appender.ConsoleAppender;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
import org.apache.logging.log4j.core.LoggerContext;
import org.apache.logging.log4j.core.layout.PatternLayout;
import org.owasp.esapi.ESAPI;
import org.apache.logging.log4j.core.config.Configuration;
import com.test.sample.common.constants.CommonConstants;
import com.test.sample.obj.ProcessRuntime;
public class GlobalLogger {
private static final String Ref = ", Ref=";
private final Logger logger;
private final Logger testLogger;
public static GlobalLogger getLogger(Class<?> cls) {
return getLogger (cls.getName());
}
public static GlobalLogger getLogger(String pkgName) {
return new GlobalLogger(LogManager.getLogger(pkgName));
}
private GlobalLogger(Logger logger) {
this.testLogger=LogManager.getLogger("PERFORMANCE_LOG");
this.logger = logger;
}
public static GlobalLogger getTESTLogger(String loggerName) { //1.1
return new GlobalLogger(LogManager.getLogger(loggerName));
}
public void logIbgm(Object message){ //1.1
testLogger.info("(PERFORMANCE_LOG) " + validateInput(message));
}
public boolean isTrace() {
return logger.isTraceEnabled();
}
public void trace(Object message){
if (isTrace()) {
logger.trace(lineNumber() + Ref + (Objects.equals(null, ProcessRuntime.getRequestId())?"":ProcessRuntime.getRequestId())+ ", " +validateInput( message));
}
}
public void trace(Object message, Throwable t){
if(isTrace()){
logger.trace(lineNumber() + Ref + (Objects.equals(null, ProcessRuntime.getRequestId())?"":ProcessRuntime.getRequestId()) + ", " + validateInput(message), t);
}
}
public boolean isDebug() {
return logger.isDebugEnabled();
}
public void debug(Object message){
if(isDebug()){
logger.debug(lineNumber() + Ref + (Objects.equals(null, ProcessRuntime.getRequestId())?"":ProcessRuntime.getRequestId())+ ", " + validateInput(message));
}
}
public void debug(Object message, Throwable t){
if(isDebug()){
logger.debug(lineNumber() + Ref + (Objects.equals(null, ProcessRuntime.getRequestId())?"":ProcessRuntime.getRequestId())+ ", " +validateInput( message), t);
}
}
public boolean isInfo() {
return logger.isInfoEnabled();
}
public void info(Object message){
if(isInfo()){
logger.info(lineNumber() + Ref + (Objects.equals(null, ProcessRuntime.getRequestId())?"":ProcessRuntime.getRequestId()) + ", " +validateInput(message));
}
}
public void info(Object message, Throwable t){
if(isInfo()){
logger.info(lineNumber() + Ref + (Objects.equals(null, ProcessRuntime.getRequestId())?"":ProcessRuntime.getRequestId())+ ", " + validateInput(message), t);
}
}
public boolean isWarn() {
return logger.isWarnEnabled();
}
public void warn(Object message){
if(isWarn()){
logger.warn(lineNumber() + Ref + (Objects.equals(null, ProcessRuntime.getRequestId())?"":ProcessRuntime.getRequestId())+ ", " + validateInput(message));
}
}
public void warn(Object message, Throwable t){
if(isWarn()){
logger.warn(lineNumber() + Ref + (Objects.equals(null, ProcessRuntime.getRequestId())?"":ProcessRuntime.getRequestId())+ ", " + validateInput(message), t);
}
}
public void error(Object message){
logger.error(lineNumber() + Ref + (Objects.equals(null, ProcessRuntime.getRequestId())?"":ProcessRuntime.getRequestId())+ ", " + validateInput(message));
}
public void error(Object message, Throwable t){
logger.error(lineNumber() + Ref + (Objects.equals(null, ProcessRuntime.getRequestId())?"":ProcessRuntime.getRequestId()) + ", " + validateInput(message), t);
}
/*
* Get the Actual Line Number
*/
private String lineNumber() {
StackTraceElement[] threadTrackArray = Thread.currentThread().getStackTrace();
if (threadTrackArray.length > 3) {
return ":" + Integer.toString(threadTrackArray[3].getLineNumber()) + "-";
}
return "";
}
public static void consoleLoggerInit () {
consoleLoggerInit (null);
}
public static void consoleLoggerInit (Level logLevel) {
final LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
final Configuration config = ctx.getConfiguration();
if (config != null) {
config.getRootLogger().getAppenders().clear();
if (logLevel != null) {
config.getRootLogger().setLevel(logLevel);
} else {
config.getRootLogger().setLevel(Level.INFO);
}
config.addAppender(ConsoleAppender.createDefaultAppenderForLayout(PatternLayout.newBuilder().withPattern("%5p [%t] (%c{1}) %m%n")
.withConfiguration(config).build()));
}
}
public static String validateInput(Object msg) {
try {
String aString="";
if(msg!=null)
aString=msg.toString();
return ESAPI.validator().getValidInput(CommonConstants.ESAPI_CONSTANTS.CONTEXT_INPUT_VALIDATION, aString,
CommonConstants.ESAPI_CONSTANTS.VAL_TYPE_SOMETHING_ELSE, aString.length()+1,false);
} catch (Exception e) {
return "";
}
}
}
我正在使用this.testLogger=LogManager.getLogger("PERFORMANCE_LOG");
和方法
public void logIbgm(Object message){ //1.1
testLogger.info("(PERFORMANCE_LOG) " + validateInput(message));
}
PERFORMANCE_LOG is the name that is the same used for the logger name in log4j2.properties
pom.xml
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.1</version>
</dependency>
您正在使用appenders
和loggers
屬性來指定 appender 和 logger 標識符的列表。 雖然這些屬性仍然受支持,但自 2.6 版以來不再需要它們(參見LOG4J2-1308 )。 要啟用您的“PERFORMANCE_LOG”記錄器:
刪除loggers
屬性(默認情況下啟用所有記錄器 ID),
或者將其設置為所有已啟用記錄器的列表,例如:
loggers = rolling, performancelog
備注:雖然允許在同一個 output stream 上有多個附加程序,但這肯定不是推薦的配置。 Log4j2 中的PatternLayout
支持“模式選擇器”(參見文檔),可以在您的場景中使用。
使用MarkerPatternSelector
的可能解決方案需要:
顯然是一個標記,例如:
private static final Marker PERF_MARKER = MarkerManager.getMarker("PERFORMANCE_LOG");
使用標記模式選擇器配置的模式布局:
appender.c.l.type = PatternLayout appender.c.l.mps.type = MarkerPatternSelector appender.c.l.mps.defaultPattern = %d{yyyy-MM-dd HH:mm:ss,SSS} %t %-5p %c{6}:%L - %m%n appender.c.l.mps.0.type = PatternMatch appender.c.l.mps.0.key = PERFORMANCE_LOG appender.c.l.mps.0.pattern = (%marker) %m%n
要使用PERFORMANCE
標記進行記錄,您可以使用任何記錄器,只需使用帶有標記參數或LogBuilder
的Logger
方法:
logger.info(PERF_MARKER, () -> validateInput(message)); logger.atInfo().withMarker(PERF_MARKER).log("{}", () -> validateInput(message));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.