From bd40099a5f285b8796aed46a94cda214f0a29747 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E5=8D=8E?= Date: Sat, 11 Sep 2021 00:05:14 +0800 Subject: [PATCH] add logback support for send log 2 manager --- fizz-core/pom.xml | 11 ++ .../java/we/config/AggregateRedisConfig.java | 8 +- .../src/main/java/we/config/LogConfig.java | 104 ++++++++++++++ .../src/main/java/we/log/LogProperties.java | 8 ++ .../src/main/java/we/log/LogSendAppender.java | 133 +----------------- .../we/log/LogSendAppenderWithLog4j2.java | 126 +++++++++++++++++ .../we/log/LogSendAppenderWithLogback.java | 94 +++++++++++++ .../src/main/java/we/log/LogSendService.java | 2 +- 8 files changed, 350 insertions(+), 136 deletions(-) create mode 100644 fizz-core/src/main/java/we/config/LogConfig.java create mode 100644 fizz-core/src/main/java/we/log/LogProperties.java create mode 100644 fizz-core/src/main/java/we/log/LogSendAppenderWithLog4j2.java create mode 100644 fizz-core/src/main/java/we/log/LogSendAppenderWithLogback.java diff --git a/fizz-core/pom.xml b/fizz-core/pom.xml index f766b75..678d698 100644 --- a/fizz-core/pom.xml +++ b/fizz-core/pom.xml @@ -57,6 +57,11 @@ org.springframework.boot spring-boot-starter-log4j2 + + ch.qos.logback + logback-classic + true + org.springframework.boot @@ -145,6 +150,12 @@ spring-cloud-starter-alibaba-nacos-discovery + + org.springframework.boot + spring-boot-configuration-processor + true + + org.apache.commons commons-pool2 diff --git a/fizz-core/src/main/java/we/config/AggregateRedisConfig.java b/fizz-core/src/main/java/we/config/AggregateRedisConfig.java index 04e39ed..8030fed 100644 --- a/fizz-core/src/main/java/we/config/AggregateRedisConfig.java +++ b/fizz-core/src/main/java/we/config/AggregateRedisConfig.java @@ -23,13 +23,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.dao.DataAccessException; -import org.springframework.data.redis.connection.ReactiveRedisClusterConnection; -import org.springframework.data.redis.connection.ReactiveRedisConnection; -import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory; -import org.springframework.data.redis.connection.RedisClusterConnection; -import org.springframework.data.redis.connection.RedisConnection; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.connection.RedisSentinelConnection; +import org.springframework.data.redis.connection.*; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.ReactiveStringRedisTemplate; import org.springframework.data.redis.core.RedisTemplate; diff --git a/fizz-core/src/main/java/we/config/LogConfig.java b/fizz-core/src/main/java/we/config/LogConfig.java new file mode 100644 index 0000000..eeafcbb --- /dev/null +++ b/fizz-core/src/main/java/we/config/LogConfig.java @@ -0,0 +1,104 @@ +package we.config; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.PatternLayout; +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.Appender; +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.boot.context.event.ApplicationStartingEvent; +import org.springframework.boot.context.event.SpringApplicationEvent; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.event.EventListener; +import we.log.LogProperties; +import we.log.LogSendAppenderWithLogback; + +@Configuration +public class LogConfig { + + @Bean + @ConfigurationProperties("fizz.logging") + public LogProperties logProperties() { + return new LogProperties(); + } + + @Configuration + @ConditionalOnClass(AbstractAppender.class) + @AutoConfigureAfter(AggregateRedisConfig.class) + public static class CustomLog4j2Config { + } + + @Configuration + @ConditionalOnClass(LoggerContext.class) + @AutoConfigureAfter(AggregateRedisConfig.class) + public static class CustomLogbackConfig { + @Bean + public Object initLogSendAppenderWithLogback(LogProperties logProperties) { + return new LoggingConfigurationApplicationListener(logProperties); + } + } + + public static class LoggingConfigurationApplicationListener { + private static final Logger logger = LoggerFactory.getLogger(LoggingConfigurationApplicationListener.class); + private static final String APPENDER_NAME = "fizzLogSendAppender"; + private static final String LAYOUT = "%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %level %logger{36} - %msg%n"; + private LogProperties logProperties; + + public LoggingConfigurationApplicationListener() { + } + + public LoggingConfigurationApplicationListener(LogProperties logProperties) { + this.logProperties = logProperties; + } + + @EventListener + public void contextRefreshed(SpringApplicationEvent event) { + onApplicationEvent(event); + } + + @EventListener + public void applicationStarting(ApplicationStartingEvent event) { + onApplicationEvent(event); + } + + @EventListener + public void applicationReady(ApplicationReadyEvent event) { + onApplicationEvent(event); + } + + public void onApplicationEvent(ApplicationEvent event) { + LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory(); + final ch.qos.logback.classic.Logger root = context.getLogger(Logger.ROOT_LOGGER_NAME); + String layoutConfig = StringUtils.isBlank(logProperties.getLayout()) ? LAYOUT : logProperties.getLayout(); + + final LogSendAppenderWithLogback newAppender = new LogSendAppenderWithLogback(); + newAppender.setName(APPENDER_NAME); + newAppender.setContext(context); + PatternLayout layout = new PatternLayout(); + layout.setPattern(layoutConfig); + newAppender.setLayout(layout); + + Appender appender = root.getAppender(APPENDER_NAME); + if (appender == null) { + newAppender.start(); + root.addAppender(newAppender); + logger.info("Added fizz log send appender:{}", APPENDER_NAME); + } else { + newAppender.start(); + root.detachAppender(APPENDER_NAME); + root.addAppender(newAppender); + logger.info("Refresh fizz log send appender:{}", APPENDER_NAME); + } + } + } + + +} diff --git a/fizz-core/src/main/java/we/log/LogProperties.java b/fizz-core/src/main/java/we/log/LogProperties.java new file mode 100644 index 0000000..b9aa883 --- /dev/null +++ b/fizz-core/src/main/java/we/log/LogProperties.java @@ -0,0 +1,8 @@ +package we.log; + +import lombok.Data; + +@Data +public class LogProperties { + private String layout; +} diff --git a/fizz-core/src/main/java/we/log/LogSendAppender.java b/fizz-core/src/main/java/we/log/LogSendAppender.java index a4f8b4c..f2b1b5a 100644 --- a/fizz-core/src/main/java/we/log/LogSendAppender.java +++ b/fizz-core/src/main/java/we/log/LogSendAppender.java @@ -1,133 +1,10 @@ -/* - * Copyright (C) 2020 the original author or authors. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ package we.log; -import org.apache.logging.log4j.core.Appender; -import org.apache.logging.log4j.core.Core; -import org.apache.logging.log4j.core.Filter; -import org.apache.logging.log4j.core.Layout; -import org.apache.logging.log4j.core.LogEvent; -import org.apache.logging.log4j.core.appender.AbstractAppender; -import org.apache.logging.log4j.core.config.Property; -import org.apache.logging.log4j.core.config.plugins.Plugin; -import org.apache.logging.log4j.core.config.plugins.PluginAttribute; -import org.apache.logging.log4j.core.config.plugins.PluginElement; -import org.apache.logging.log4j.core.config.plugins.PluginFactory; -import org.apache.logging.log4j.core.layout.PatternLayout; -import we.FizzAppContext; -import we.flume.clients.log4j2appender.LogService; -import we.util.NetworkUtils; - -import java.io.Serializable; import java.util.concurrent.atomic.AtomicInteger; -/** - * log send appender - * - * @author zhongjie - */ -@Plugin(name = LogSendAppender.PLUGIN_NAME, category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true) -public class LogSendAppender extends AbstractAppender { - - static final String PLUGIN_NAME = "LogSend"; - public static LogSendService logSendService; - public static Boolean logEnabled; - private static LogSend[] logSends = new LogSend[1000]; - private static AtomicInteger logSendIndex = new AtomicInteger(0); - - private LogSendAppender(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { - super(name, filter, layout, ignoreExceptions, properties); - } - - @Override - public void append(LogEvent event) { - if (logEnabled != null && !logEnabled) { - return; - } - - if (logEnabled == null && FizzAppContext.appContext == null && logSendService == null) { - // local cache - logSends[logSendIndex.getAndIncrement() % logSends.length] = new LogSend(this.getBizId(event.getMessage().getParameters()), - NetworkUtils.getServerIp(), event.getLevel().intLevel(), event.getTimeMillis(), new String(this.getLayout().toByteArray(event))); - return; - } - - if (logEnabled == null && logSendService == null) { - // no legal logSendService, discard the local cache - logEnabled = Boolean.FALSE; - logSends = null; - return; - } - - if (logEnabled == null) { - logEnabled = Boolean.TRUE; - - LogSend[] logSends; - synchronized (LogSendAppender.class) { - logSends = LogSendAppender.logSends; - LogSendAppender.logSends = null; - } - - // logSendService is ready, send the local cache - if (logSends != null) { - int size = Math.min(logSendIndex.get(), logSends.length); - for (int i = 0; i < size; i++) { - logSendService.send(logSends[i]); - } - } - } - - LogSend logSend = new LogSend(this.getBizId(event.getMessage().getParameters()), NetworkUtils.getServerIp(), - event.getLevel().intLevel(), event.getTimeMillis(), new String(this.getLayout().toByteArray(event))); - logSendService.send(logSend); - } - - private String getBizId(Object[] parameters) { - Object bizId = LogService.getBizId(); - if (parameters != null) { - for (int i = parameters.length - 1; i > -1; --i) { - Object p = parameters[i]; - if (p == LogService.BIZ_ID) { - if (i != parameters.length - 1) { - bizId = parameters[i + 1]; - } - break; - } - } - } - if (bizId == null) { - return ""; - } - return bizId.toString(); - } - - @PluginFactory - public static LogSendAppender createAppender(@PluginAttribute("name") String name, - @PluginElement("Filter") final Filter filter, - @PluginElement("Layout") Layout layout, - @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { - if (name == null) { - LOGGER.error("No name provided for LogSendAppender!"); - return null; - } - - if (layout == null) { - layout = PatternLayout.createDefaultLayout(); - } - return new LogSendAppender(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); - } +public class LogSendAppender { + public static volatile LogSendService logSendService; + public static volatile Boolean logEnabled; + public static volatile LogSend[] logSends = new LogSend[1000]; + public static volatile AtomicInteger logSendIndex = new AtomicInteger(0); } diff --git a/fizz-core/src/main/java/we/log/LogSendAppenderWithLog4j2.java b/fizz-core/src/main/java/we/log/LogSendAppenderWithLog4j2.java new file mode 100644 index 0000000..20533e2 --- /dev/null +++ b/fizz-core/src/main/java/we/log/LogSendAppenderWithLog4j2.java @@ -0,0 +1,126 @@ +/* + * Copyright (C) 2020 the original author or authors. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package we.log; + +import org.apache.logging.log4j.core.*; +import org.apache.logging.log4j.core.appender.AbstractAppender; +import org.apache.logging.log4j.core.config.Property; +import org.apache.logging.log4j.core.config.plugins.Plugin; +import org.apache.logging.log4j.core.config.plugins.PluginAttribute; +import org.apache.logging.log4j.core.config.plugins.PluginElement; +import org.apache.logging.log4j.core.config.plugins.PluginFactory; +import org.apache.logging.log4j.core.layout.PatternLayout; +import we.FizzAppContext; +import we.flume.clients.log4j2appender.LogService; +import we.util.NetworkUtils; + +import java.io.Serializable; + +import static we.log.LogSendAppender.*; + +/** + * log send appender with log4j2 + * + * @author zhongjie + */ +@Plugin(name = LogSendAppenderWithLog4j2.PLUGIN_NAME, category = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE, printObject = true) +public class LogSendAppenderWithLog4j2 extends AbstractAppender { + + static final String PLUGIN_NAME = "LogSend"; + + private LogSendAppenderWithLog4j2(String name, Filter filter, Layout layout, boolean ignoreExceptions, Property[] properties) { + super(name, filter, layout, ignoreExceptions, properties); + } + + @Override + public void append(LogEvent event) { + if (logEnabled != null && !logEnabled) { + return; + } + + if (logEnabled == null && FizzAppContext.appContext == null && logSendService == null) { + // local cache + logSends[logSendIndex.getAndIncrement() % logSends.length] = new LogSend(this.getBizId(event.getMessage().getParameters()), + NetworkUtils.getServerIp(), event.getLevel().intLevel(), event.getTimeMillis(), new String(this.getLayout().toByteArray(event))); + return; + } + + if (logEnabled == null && logSendService == null) { + // no legal logSendService, discard the local cache + logEnabled = Boolean.FALSE; + logSends = null; + return; + } + + if (logEnabled == null) { + logEnabled = Boolean.TRUE; + + LogSend[] logSends; + synchronized (LogSendAppender.class) { + logSends = LogSendAppender.logSends; + LogSendAppender.logSends = null; + } + + // logSendService is ready, send the local cache + if (logSends != null) { + int size = Math.min(logSendIndex.get(), logSends.length); + for (int i = 0; i < size; i++) { + logSendService.send(logSends[i]); + } + } + } + + LogSend logSend = new LogSend(this.getBizId(event.getMessage().getParameters()), NetworkUtils.getServerIp(), + event.getLevel().intLevel(), event.getTimeMillis(), new String(this.getLayout().toByteArray(event))); + logSendService.send(logSend); + } + + private String getBizId(Object[] parameters) { + Object bizId = LogService.getBizId(); + if (parameters != null) { + for (int i = parameters.length - 1; i > -1; --i) { + Object p = parameters[i]; + if (p == LogService.BIZ_ID) { + if (i != parameters.length - 1) { + bizId = parameters[i + 1]; + } + break; + } + } + } + if (bizId == null) { + return ""; + } + return bizId.toString(); + } + + @PluginFactory + public static LogSendAppenderWithLog4j2 createAppender(@PluginAttribute("name") String name, + @PluginElement("Filter") final Filter filter, + @PluginElement("Layout") Layout layout, + @PluginAttribute("ignoreExceptions") boolean ignoreExceptions) { + if (name == null) { + LOGGER.error("No name provided for LogSendAppender!"); + return null; + } + + if (layout == null) { + layout = PatternLayout.createDefaultLayout(); + } + return new LogSendAppenderWithLog4j2(name, filter, layout, ignoreExceptions, Property.EMPTY_ARRAY); + } +} diff --git a/fizz-core/src/main/java/we/log/LogSendAppenderWithLogback.java b/fizz-core/src/main/java/we/log/LogSendAppenderWithLogback.java new file mode 100644 index 0000000..1520c7d --- /dev/null +++ b/fizz-core/src/main/java/we/log/LogSendAppenderWithLogback.java @@ -0,0 +1,94 @@ +package we.log; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.AppenderBase; +import ch.qos.logback.core.Layout; +import ch.qos.logback.core.LogbackException; +import lombok.Getter; +import lombok.Setter; +import we.FizzAppContext; +import we.flume.clients.log4j2appender.LogService; +import we.util.NetworkUtils; + +import static we.log.LogSendAppender.*; + +/** + * log send appender with logback + * + * @author huahuang + */ +public class LogSendAppenderWithLogback extends AppenderBase { + + //负责将日志事件转换为字符串,需Getter和Setter方法 + @Getter + @Setter + private Layout layout; + + @Override + protected void append(ILoggingEvent event) { + try { + if (logEnabled != null && !logEnabled) { + return; + } + + if (logEnabled == null && FizzAppContext.appContext == null && logSendService == null) { + // local cache + logSends[logSendIndex.getAndIncrement() % logSends.length] = new LogSend( + this.getBizId(event.getArgumentArray()), NetworkUtils.getServerIp(), event.getLevel().levelInt, + event.getTimeStamp(), this.getLayout().doLayout(event)); + return; + } + + if (logEnabled == null && logSendService == null) { + // no legal logSendService, discard the local cache + logEnabled = Boolean.FALSE; + logSends = null; + return; + } + + if (logEnabled == null) { + logEnabled = Boolean.TRUE; + + LogSend[] logSends; + synchronized (LogSendAppender.class) { + logSends = LogSendAppender.logSends; + LogSendAppender.logSends = null; + } + + // logSendService is ready, send the local cache + if (logSends != null) { + int size = Math.min(logSendIndex.get(), logSends.length); + for (int i = 0; i < size; i++) { + logSendService.send(logSends[i]); + } + } + } + + LogSend logSend = new LogSend(this.getBizId(event.getArgumentArray()), NetworkUtils.getServerIp(), + event.getLevel().levelInt, event.getTimeStamp(), this.getLayout().doLayout(event)); + logSendService.send(logSend); + } catch (Exception ex) { + throw new LogbackException(event.getFormattedMessage(), ex); + } + } + + private String getBizId(Object[] parameters) { + Object bizId = LogService.getBizId(); + if (parameters != null) { + for (int i = parameters.length - 1; i > -1; --i) { + Object p = parameters[i]; + if (p == LogService.BIZ_ID) { + if (i != parameters.length - 1) { + bizId = parameters[i + 1]; + } + break; + } + } + } + if (bizId == null) { + return ""; + } + return bizId.toString(); + } + +} diff --git a/fizz-core/src/main/java/we/log/LogSendService.java b/fizz-core/src/main/java/we/log/LogSendService.java index 5df7dbd..b1b4bd6 100644 --- a/fizz-core/src/main/java/we/log/LogSendService.java +++ b/fizz-core/src/main/java/we/log/LogSendService.java @@ -17,7 +17,7 @@ package we.log; /** - * log send service interface, used by {@link LogSendAppender} to send log to fizz-manager + * log send service interface, used by {@link LogSendAppenderWithLog4j2} to send log to fizz-manager * * @author zhongjie */