From aa5ae55145d9207b1c53b476779018446f6d3762 Mon Sep 17 00:00:00 2001 From: ascrutae Date: Sun, 26 Jun 2016 07:39:27 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=8F=90=E4=BA=A4=E6=97=A5=E5=BF=97=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E4=BB=A5=E5=8F=8A=E6=B5=8B=E8=AF=95=E7=B1=BB=202.=20?= =?UTF-8?q?=E5=B0=86SDK=E5=88=87=E6=8D=A2=E6=88=90=E6=96=B0=E7=9A=84?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cloud/skywalking/buffer/BufferGroup.java | 4 +- .../skywalking/buffer/ContextBuffer.java | 4 +- .../ApplicationExceptionHandler.java | 4 +- .../buriedpoint/LocalBuriedPointSender.java | 5 +- .../buriedpoint/RPCBuriedPointReceiver.java | 5 +- .../buriedpoint/ThreadBuriedPointSender.java | 5 +- .../ThreadFactoryBuriedPointSender.java | 5 +- .../com/ai/cloud/skywalking/conf/Config.java | 17 ++- .../skywalking/conf/ConfigInitializer.java | 6 +- .../cloud/skywalking/logging/IFileWriter.java | 5 + .../cloud/skywalking/logging/LogManager.java | 11 ++ .../ai/cloud/skywalking/logging/Logger.java | 106 ++++++++++++++++ .../skywalking/logging/LoggerManager.java | 11 ++ .../skywalking/logging/SyncFileWriter.java | 112 +++++++++++++++++ .../skywalking/plugin/PluginBootstrap.java | 78 ++++++------ .../plugin/PluginResourcesResolver.java | 6 +- .../skywalking/plugin/TracingBootstrap.java | 6 +- .../AbstractClassEnhancePluginDefine.java | 6 +- .../enhance/ClassConstructorInterceptor.java | 5 +- .../enhance/ClassEnhancePluginDefine.java | 6 +- .../ClassInstanceMethodsInterceptor.java | 116 ++++++++---------- .../selfexamination/SDKHealthCollector.java | 5 +- .../sender/DataSenderFactoryWithBalance.java | 64 ++++------ .../ai/cloud/skywalking/util/LoggingUtil.java | 23 ++++ .../test/ai/cloud/logging/LoggingTest.java | 27 ++++ 25 files changed, 461 insertions(+), 181 deletions(-) create mode 100644 skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/IFileWriter.java create mode 100644 skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/LogManager.java create mode 100644 skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/Logger.java create mode 100644 skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/LoggerManager.java create mode 100644 skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/SyncFileWriter.java create mode 100644 skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/util/LoggingUtil.java create mode 100644 skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/logging/LoggingTest.java diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/BufferGroup.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/BufferGroup.java index 0a53214984..1fa4634f45 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/BufferGroup.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/BufferGroup.java @@ -2,13 +2,13 @@ package com.ai.cloud.skywalking.buffer; import com.ai.cloud.skywalking.conf.Config; import com.ai.cloud.skywalking.conf.Constants; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; import com.ai.cloud.skywalking.protocol.Span; import com.ai.cloud.skywalking.selfexamination.HeathReading; import com.ai.cloud.skywalking.selfexamination.SDKHealthCollector; import com.ai.cloud.skywalking.sender.DataSenderFactoryWithBalance; import com.ai.cloud.skywalking.util.AtomicRangeInteger; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import static com.ai.cloud.skywalking.conf.Config.Buffer.BUFFER_MAX_SIZE; import static com.ai.cloud.skywalking.conf.Config.Consumer.*; diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/ContextBuffer.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/ContextBuffer.java index 8409c17ed2..ad14db0476 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/ContextBuffer.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buffer/ContextBuffer.java @@ -1,11 +1,11 @@ package com.ai.cloud.skywalking.buffer; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; import com.ai.cloud.skywalking.protocol.Span; import java.util.concurrent.ThreadLocalRandom; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import static com.ai.cloud.skywalking.conf.Config.Buffer.POOL_SIZE; diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ApplicationExceptionHandler.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ApplicationExceptionHandler.java index 209422554d..458d597e6e 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ApplicationExceptionHandler.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ApplicationExceptionHandler.java @@ -5,12 +5,12 @@ import static com.ai.cloud.skywalking.conf.Config.BuriedPoint.EXCLUSIVE_EXCEPTIO import java.util.HashSet; import java.util.Set; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; import com.ai.cloud.skywalking.api.IExceptionHandler; import com.ai.cloud.skywalking.conf.Config; import com.ai.cloud.skywalking.context.Context; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; import com.ai.cloud.skywalking.protocol.Span; public class ApplicationExceptionHandler implements IExceptionHandler { diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/LocalBuriedPointSender.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/LocalBuriedPointSender.java index de3c9632bd..d59e66fe88 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/LocalBuriedPointSender.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/LocalBuriedPointSender.java @@ -1,13 +1,12 @@ package com.ai.cloud.skywalking.buriedpoint; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import com.ai.cloud.skywalking.api.IBuriedPointSender; import com.ai.cloud.skywalking.buffer.ContextBuffer; import com.ai.cloud.skywalking.conf.AuthDesc; import com.ai.cloud.skywalking.conf.Config; import com.ai.cloud.skywalking.context.Context; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; import com.ai.cloud.skywalking.model.ContextData; import com.ai.cloud.skywalking.model.EmptyContextData; import com.ai.cloud.skywalking.model.Identification; diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/RPCBuriedPointReceiver.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/RPCBuriedPointReceiver.java index 50ac1b3e56..370a14061d 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/RPCBuriedPointReceiver.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/RPCBuriedPointReceiver.java @@ -1,13 +1,12 @@ package com.ai.cloud.skywalking.buriedpoint; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import com.ai.cloud.skywalking.api.IBuriedPointReceiver; import com.ai.cloud.skywalking.buffer.ContextBuffer; import com.ai.cloud.skywalking.conf.AuthDesc; import com.ai.cloud.skywalking.conf.Config; import com.ai.cloud.skywalking.context.Context; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; import com.ai.cloud.skywalking.model.ContextData; import com.ai.cloud.skywalking.model.Identification; import com.ai.cloud.skywalking.protocol.Span; diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadBuriedPointSender.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadBuriedPointSender.java index 7b0a625d62..aef9704a3a 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadBuriedPointSender.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadBuriedPointSender.java @@ -1,13 +1,12 @@ package com.ai.cloud.skywalking.buriedpoint; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import com.ai.cloud.skywalking.api.IBuriedPointSender; import com.ai.cloud.skywalking.buffer.ContextBuffer; import com.ai.cloud.skywalking.conf.AuthDesc; import com.ai.cloud.skywalking.conf.Config; import com.ai.cloud.skywalking.context.Context; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; import com.ai.cloud.skywalking.model.ContextData; import com.ai.cloud.skywalking.model.EmptyContextData; import com.ai.cloud.skywalking.model.Identification; diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadFactoryBuriedPointSender.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadFactoryBuriedPointSender.java index c5a0ec76f3..6cc865b2fe 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadFactoryBuriedPointSender.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/buriedpoint/ThreadFactoryBuriedPointSender.java @@ -1,13 +1,12 @@ package com.ai.cloud.skywalking.buriedpoint; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import com.ai.cloud.skywalking.api.IBuriedPointSender; import com.ai.cloud.skywalking.buffer.ContextBuffer; import com.ai.cloud.skywalking.conf.AuthDesc; import com.ai.cloud.skywalking.conf.Config; import com.ai.cloud.skywalking.context.Context; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; import com.ai.cloud.skywalking.model.ContextData; import com.ai.cloud.skywalking.model.EmptyContextData; import com.ai.cloud.skywalking.model.Identification; diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/Config.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/Config.java index c6ccb22929..648d149ce1 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/Config.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/Config.java @@ -71,9 +71,20 @@ public class Config { public static long RETRY_FIND_CONNECTION_SENDER = 1000; } - + public static class HealthCollector { - // 默认健康检查上报时间 - public static long REPORT_INTERVAL = 5 * 60 * 1000L; + // 默认健康检查上报时间 + public static long REPORT_INTERVAL = 5 * 60 * 1000L; + } + + public static class Logging { + // log文件名 + public static String LOG_FILE_NAME = "skywalking-api.log"; + // log文件路径 + public static String LOG_FILE_PATH = "/home/xin/tmp"; + // 最大文件大小 + public static int MAX_LOG_FILE_LENGTH = 3 * 1024 * 1024; + // skywalking 系统错误文件日志 + public static String SYSTEM_ERROR_LOG_FILE_NAME = "skywalking-api-error.log"; } } \ No newline at end of file diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/ConfigInitializer.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/ConfigInitializer.java index 4ef8067197..24f0398e0e 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/ConfigInitializer.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/conf/ConfigInitializer.java @@ -1,5 +1,8 @@ package com.ai.cloud.skywalking.conf; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; + import static com.ai.cloud.skywalking.conf.Config.SkyWalking.AUTH_OVERRIDE; import static com.ai.cloud.skywalking.conf.Config.SkyWalking.AUTH_SYSTEM_ENV_NAME; @@ -10,9 +13,6 @@ import java.lang.reflect.Modifier; import java.util.LinkedList; import java.util.Properties; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - public class ConfigInitializer { private static Logger logger = LogManager.getLogger(ConfigInitializer.class); diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/IFileWriter.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/IFileWriter.java new file mode 100644 index 0000000000..1a297dee2f --- /dev/null +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/IFileWriter.java @@ -0,0 +1,5 @@ +package com.ai.cloud.skywalking.logging; + +public interface IFileWriter { + void write(String message); +} diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/LogManager.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/LogManager.java new file mode 100644 index 0000000000..780e8cbd00 --- /dev/null +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/LogManager.java @@ -0,0 +1,11 @@ +package com.ai.cloud.skywalking.logging; + +/** + * Created by xin on 16-6-23. + */ +public class LogManager { + + public static Logger getLogger(Class toBeLoggerClass) { + return new Logger(toBeLoggerClass); + } +} diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/Logger.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/Logger.java new file mode 100644 index 0000000000..2e6ea828f9 --- /dev/null +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/Logger.java @@ -0,0 +1,106 @@ +package com.ai.cloud.skywalking.logging; + + +import com.ai.cloud.skywalking.util.LoggingUtil; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Created by xin on 16-6-23. + */ +public class Logger { + + private Class toBeLoggerClass; + + public Logger(Class toBeLoggerClass) { + this.toBeLoggerClass = toBeLoggerClass; + } + + public void logger(String level, String message, Throwable e) { + Throwable dummyException = new Throwable(); + StackTraceElement locations[] = dummyException.getStackTrace(); + + if (locations != null && locations.length > 2) { + SyncFileWriter.instance().write(formatMessage(level, message, locations[2])); + } + + if (e != null) { + SyncFileWriter.instance().write(LoggingUtil.fetchThrowableStack(e)); + } + } + + + public void error(String message, Throwable e) { + logger(ERROR, message, e); + } + + public void error(String message) { + error(message, null); + } + + public void warn(String message, Object... parameters) { + String tmpMessage = replaceParameter(message, parameters); + logger(WARN, tmpMessage, null); + } + + + public void debug(String message) { + logger(DEBUG, message, null); + } + + public void debug(Object message) { + debug(message.toString()); + } + + public void info(Object message) { + info(message.toString()); + } + + public void info(String message) { + logger(INFO, message, null); + } + + public void debug(String message, Object... parameters) { + debug(replaceParameter(message, parameters)); + } + + public void error(String message, Object[] parameters, Throwable throwable) { + logger(ERROR, replaceParameter(message, parameters), throwable); + } + + public void info(String message, Object paramter) { + info(replaceParameter(message, new Object[]{paramter})); + } + + + private String replaceParameter(String message, Object... parameters) { + int startSize = 0; + int parametersIndex = 0; + int index = -1; + String tmpMessage = message; + while ((index = message.indexOf("{}", startSize)) != -1) { + if (parametersIndex >= parameters.length) { + break; + } + + tmpMessage = tmpMessage.replaceFirst("\\{\\}", parameters[parametersIndex++].toString()); + startSize = index + 2; + } + return tmpMessage; + } + + + private String formatMessage(String level, String message, StackTraceElement caller) { + return level + " " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " " + + caller.getClassName() + "." + caller.getMethodName() + "(" + caller.getFileName() + ":" + caller.getLineNumber() + ") " + message; + } + + + private static final String ERROR = "ERROR"; + private static final String WARN = "WARN"; + private static final String DEBUG = "DEBUG"; + private static final String INFO = "INFO"; + + +} diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/LoggerManager.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/LoggerManager.java new file mode 100644 index 0000000000..ccd1295b87 --- /dev/null +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/LoggerManager.java @@ -0,0 +1,11 @@ +package com.ai.cloud.skywalking.logging; + +/** + * Created by xin on 16-6-23. + */ +public class LoggerManager { + + public static Logger getLog(Class toBeClass) { + return new Logger(toBeClass); + } +} diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/SyncFileWriter.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/SyncFileWriter.java new file mode 100644 index 0000000000..6873537945 --- /dev/null +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/logging/SyncFileWriter.java @@ -0,0 +1,112 @@ +package com.ai.cloud.skywalking.logging; + + +import com.ai.cloud.skywalking.conf.Config; +import com.ai.cloud.skywalking.util.LoggingUtil; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; + +import static com.ai.cloud.skywalking.conf.Config.Logging.LOG_FILE_NAME; +import static com.ai.cloud.skywalking.conf.Config.Logging.LOG_FILE_PATH; + +public class SyncFileWriter implements IFileWriter { + + private static SyncFileWriter writer; + private FileOutputStream os; + private int bufferSize; + private static final Object lock = new Object(); + + private SyncFileWriter() { + try { + os = new FileOutputStream(new File(LOG_FILE_PATH, + LOG_FILE_NAME), true); + bufferSize = Long.valueOf(new File(LOG_FILE_PATH, LOG_FILE_NAME).length()).intValue(); + } catch (IOException e) { + writeErrorLog(e); + } + } + + + public static IFileWriter instance() { + if (writer == null) { + writer = new SyncFileWriter(); + } + return writer; + } + + + public void write(String message) { + writeLogRecord(message); + switchLogFileIfNecessary(); + } + + private void writeLogRecord(String message) { + try { + os.write(message.getBytes()); + os.write("\n".getBytes()); + bufferSize += message.length(); + } catch (IOException e) { + writeErrorLog(e); + } + } + + private void switchLogFileIfNecessary() { + if (bufferSize > Config.Logging.MAX_LOG_FILE_LENGTH) { + synchronized (lock) { + if (bufferSize > Config.Logging.MAX_LOG_FILE_LENGTH) { + try { + closeInputStream(); + renameLogFile(); + revertInputStream(); + } catch (IOException e) { + writeErrorLog(e); + } + bufferSize = 0; + } + } + } + } + + private void revertInputStream() throws FileNotFoundException { + os = new FileOutputStream(new File(Config.Logging.LOG_FILE_PATH, + Config.Logging.LOG_FILE_NAME), true); + } + + private void renameLogFile() { + new File(Config.Logging.LOG_FILE_PATH, Config.Logging.LOG_FILE_NAME) + .renameTo(new File(Config.Logging.LOG_FILE_PATH, + Config.Logging.LOG_FILE_NAME + + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()))); + } + + private void closeInputStream() throws IOException { + this.os.flush(); + this.os.close(); + } + + + private void writeErrorLog(Throwable e) { + FileOutputStream fileOutputStream = null; + try { + File file = new File(Config.Logging.LOG_FILE_PATH, Config.Logging.SYSTEM_ERROR_LOG_FILE_NAME); + fileOutputStream = new FileOutputStream(file, true); + fileOutputStream.write(("Failed to init sync File Writer.\n" + LoggingUtil.fetchThrowableStack(e)).getBytes()); + } catch (Exception e1) { + System.err.print(LoggingUtil.fetchThrowableStack(e1)); + } finally { + if (fileOutputStream != null) { + try { + fileOutputStream.close(); + } catch (IOException e1) { + System.err.print(LoggingUtil.fetchThrowableStack(e1)); + } + } + } + } + +} diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginBootstrap.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginBootstrap.java index 7af01976c5..94e82d381a 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginBootstrap.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginBootstrap.java @@ -1,58 +1,56 @@ package com.ai.cloud.skywalking.plugin; +import com.ai.cloud.skywalking.conf.AuthDesc; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; +import net.bytebuddy.pool.TypePool; + import java.net.URL; import java.util.List; -import net.bytebuddy.pool.TypePool; +public class PluginBootstrap { + private static Logger logger = LogManager.getLogger(PluginBootstrap.class); -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; + public static TypePool CLASS_TYPE_POOL = null; -import com.ai.cloud.skywalking.conf.AuthDesc; + public void start() { + if (!AuthDesc.isAuth()) { + return; + } -public class PluginBootstrap { - private static Logger logger = LogManager.getLogger(PluginBootstrap.class); - - public static TypePool CLASS_TYPE_POOL = null; - - public void start() { - if (!AuthDesc.isAuth()) { - return; - } - - CLASS_TYPE_POOL = TypePool.Default.ofClassPath(); - - PluginResourcesResolver resolver = new PluginResourcesResolver(); - List resources = resolver.getResources(); - - if (resources == null || resources.size() == 0) { - logger.info("no plugin files (skywalking-plugin.properties) found, continue to start application."); - return; - } - - for (URL pluginUrl : resources) { - try { - PluginCfg.CFG.load(pluginUrl.openStream()); - } catch (Throwable t) { - logger.error("plugin [{}] init failure.", pluginUrl, t); - } - } - - List pluginClassList = PluginCfg.CFG + CLASS_TYPE_POOL = TypePool.Default.ofClassPath(); + + PluginResourcesResolver resolver = new PluginResourcesResolver(); + List resources = resolver.getResources(); + + if (resources == null || resources.size() == 0) { + logger.info("no plugin files (skywalking-plugin.properties) found, continue to start application."); + return; + } + + for (URL pluginUrl : resources) { + try { + PluginCfg.CFG.load(pluginUrl.openStream()); + } catch (Throwable t) { + logger.error("plugin [{}] init failure.", new Object[]{pluginUrl}, t); + } + } + + List pluginClassList = PluginCfg.CFG .getPluginClassList(); for (String pluginClassName : pluginClassList) { try { - logger.debug("prepare to enhance class by plugin {}.", - pluginClassName); - IPlugin plugin = (IPlugin) Class.forName( - pluginClassName).newInstance(); - plugin.define(); + logger.debug("prepare to enhance class by plugin {}.", + pluginClassName); + IPlugin plugin = (IPlugin) Class.forName( + pluginClassName).newInstance(); + plugin.define(); } catch (Throwable t) { logger.error("prepare to enhance class by plugin [{}] failure.", - pluginClassName, t); + new Object[]{pluginClassName}, t); } } - } + } } diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginResourcesResolver.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginResourcesResolver.java index 8f063cb14c..f381d6417f 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginResourcesResolver.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/PluginResourcesResolver.java @@ -1,14 +1,14 @@ package com.ai.cloud.skywalking.plugin; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; + import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - public class PluginResourcesResolver { private static Logger logger = LogManager.getLogger(PluginResourcesResolver.class); diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/TracingBootstrap.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/TracingBootstrap.java index 0872906491..aa17bb4386 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/TracingBootstrap.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/TracingBootstrap.java @@ -1,11 +1,11 @@ package com.ai.cloud.skywalking.plugin; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; + import java.lang.reflect.InvocationTargetException; import java.util.Arrays; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - /** * 替代应用函数的main函数入口,确保在程序入口处运行
* 用于替代-javaagent的另一种模式
diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/AbstractClassEnhancePluginDefine.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/AbstractClassEnhancePluginDefine.java index 8a5c4cab2f..c97275bac9 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/AbstractClassEnhancePluginDefine.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/AbstractClassEnhancePluginDefine.java @@ -1,15 +1,15 @@ package com.ai.cloud.skywalking.plugin.interceptor; import static com.ai.cloud.skywalking.plugin.PluginBootstrap.CLASS_TYPE_POOL; + +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.ClassFileLocator; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.dynamic.loading.ClassLoadingStrategy; import net.bytebuddy.pool.TypePool.Resolution; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import com.ai.cloud.skywalking.plugin.IPlugin; import com.ai.cloud.skywalking.plugin.PluginException; import com.ai.cloud.skywalking.util.StringUtil; diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassConstructorInterceptor.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassConstructorInterceptor.java index 8536a9433c..bd6ec24341 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassConstructorInterceptor.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassConstructorInterceptor.java @@ -1,13 +1,12 @@ package com.ai.cloud.skywalking.plugin.interceptor.enhance; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; import net.bytebuddy.implementation.bind.annotation.AllArguments; import net.bytebuddy.implementation.bind.annotation.FieldProxy; import net.bytebuddy.implementation.bind.annotation.RuntimeType; import net.bytebuddy.implementation.bind.annotation.This; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; public class ClassConstructorInterceptor { diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassEnhancePluginDefine.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassEnhancePluginDefine.java index 504deaa673..1a50361a49 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassEnhancePluginDefine.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassEnhancePluginDefine.java @@ -2,6 +2,9 @@ package com.ai.cloud.skywalking.plugin.interceptor.enhance; import static net.bytebuddy.matcher.ElementMatchers.any; import static net.bytebuddy.matcher.ElementMatchers.not; + +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implementation.MethodDelegation; @@ -10,9 +13,6 @@ import net.bytebuddy.implementation.bind.annotation.FieldProxy; import net.bytebuddy.matcher.ElementMatcher; import net.bytebuddy.matcher.ElementMatchers; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import com.ai.cloud.skywalking.plugin.PluginException; import com.ai.cloud.skywalking.plugin.interceptor.AbstractClassEnhancePluginDefine; import com.ai.cloud.skywalking.plugin.interceptor.EnhanceException; diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java index ac9c81e9c8..1403ac56fd 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/plugin/interceptor/enhance/ClassInstanceMethodsInterceptor.java @@ -1,76 +1,68 @@ package com.ai.cloud.skywalking.plugin.interceptor.enhance; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; +import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; +import net.bytebuddy.implementation.bind.annotation.*; + import java.lang.reflect.Method; import java.util.concurrent.Callable; -import net.bytebuddy.implementation.bind.annotation.AllArguments; -import net.bytebuddy.implementation.bind.annotation.FieldValue; -import net.bytebuddy.implementation.bind.annotation.Origin; -import net.bytebuddy.implementation.bind.annotation.RuntimeType; -import net.bytebuddy.implementation.bind.annotation.SuperCall; -import net.bytebuddy.implementation.bind.annotation.This; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import com.ai.cloud.skywalking.plugin.interceptor.EnhancedClassInstanceContext; - /** * 类方法拦截、控制器 - * - * @author wusheng * + * @author wusheng */ public class ClassInstanceMethodsInterceptor { - private static Logger logger = LogManager - .getLogger(ClassInstanceMethodsInterceptor.class); + private static Logger logger = LogManager + .getLogger(ClassInstanceMethodsInterceptor.class); + + private IntanceMethodsAroundInterceptor interceptor; - private IntanceMethodsAroundInterceptor interceptor; + public ClassInstanceMethodsInterceptor(IntanceMethodsAroundInterceptor interceptor) { + this.interceptor = interceptor; + } - public ClassInstanceMethodsInterceptor(IntanceMethodsAroundInterceptor interceptor) { - this.interceptor = interceptor; - } + @RuntimeType + public Object intercept( + @This Object obj, + @AllArguments Object[] allArguments, + @Origin Method method, + @SuperCall Callable zuper, + @FieldValue(ClassEnhancePluginDefine.contextAttrName) EnhancedClassInstanceContext instanceContext) + throws Exception { + InstanceMethodInvokeContext interceptorContext = new InstanceMethodInvokeContext(obj, + method.getName(), allArguments); + MethodInterceptResult result = new MethodInterceptResult(); + try { + interceptor.beforeMethod(instanceContext, interceptorContext, result); + } catch (Throwable t) { + logger.error("class[{}] before method[{}] intercept failue:{}", + new Object[]{obj.getClass(), method.getName(), t.getMessage()}, t); + } + if (!result.isContinue()) { + return result._ret(); + } - @RuntimeType - public Object intercept( - @This Object obj, - @AllArguments Object[] allArguments, - @Origin Method method, - @SuperCall Callable zuper, - @FieldValue(ClassEnhancePluginDefine.contextAttrName) EnhancedClassInstanceContext instanceContext) - throws Exception { - InstanceMethodInvokeContext interceptorContext = new InstanceMethodInvokeContext(obj, - method.getName(), allArguments); - MethodInterceptResult result = new MethodInterceptResult(); - try { - interceptor.beforeMethod(instanceContext, interceptorContext, result); - } catch (Throwable t) { - logger.error("class[{}] before method[{}] intercept failue:{}", - obj.getClass(), method.getName(), t.getMessage(), t); - } - if(!result.isContinue()){ - return result._ret(); - } - - Object ret = null; - try { - ret = zuper.call(); - } catch(Throwable t){ - try { - interceptor.handleMethodException(t, instanceContext, interceptorContext, ret); - } catch (Throwable t2) { - logger.error("class[{}] handle method[{}] exception failue:{}", - obj.getClass(), method.getName(), t2.getMessage(), t2); - } - throw t; - }finally { - try { - ret = interceptor.afterMethod(instanceContext, interceptorContext, ret); - } catch (Throwable t) { - logger.error("class[{}] after method[{}] intercept failue:{}", - obj.getClass(), method.getName(), t.getMessage(), t); - } - } - return ret; - } + Object ret = null; + try { + ret = zuper.call(); + } catch (Throwable t) { + try { + interceptor.handleMethodException(t, instanceContext, interceptorContext, ret); + } catch (Throwable t2) { + logger.error("class[{}] handle method[{}] exception failue:{}", + new Object[]{obj.getClass(), method.getName(), t2.getMessage()}, t2); + } + throw t; + } finally { + try { + ret = interceptor.afterMethod(instanceContext, interceptorContext, ret); + } catch (Throwable t) { + logger.error("class[{}] after method[{}] intercept failue:{}", + new Object[]{obj.getClass(), method.getName(), t.getMessage()}, t); + } + } + return ret; + } } diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/selfexamination/SDKHealthCollector.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/selfexamination/SDKHealthCollector.java index 69a06ac1bc..f4050a6e91 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/selfexamination/SDKHealthCollector.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/selfexamination/SDKHealthCollector.java @@ -4,11 +4,10 @@ import java.util.Arrays; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - import com.ai.cloud.skywalking.conf.AuthDesc; import com.ai.cloud.skywalking.conf.Config; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; import com.ai.cloud.skywalking.util.BuriedPointMachineUtil; public class SDKHealthCollector extends Thread { diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/sender/DataSenderFactoryWithBalance.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/sender/DataSenderFactoryWithBalance.java index b304d67661..66232888a9 100644 --- a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/sender/DataSenderFactoryWithBalance.java +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/sender/DataSenderFactoryWithBalance.java @@ -1,32 +1,22 @@ package com.ai.cloud.skywalking.sender; -import static com.ai.cloud.skywalking.conf.Config.Sender.CHECKER_THREAD_WAIT_INTERVAL; -import static com.ai.cloud.skywalking.conf.Config.Sender.CLOSE_SENDER_COUNTDOWN; -import static com.ai.cloud.skywalking.conf.Config.Sender.CONNECT_PERCENT; -import static com.ai.cloud.skywalking.conf.Config.Sender.RETRY_GET_SENDER_WAIT_INTERVAL; -import static com.ai.cloud.skywalking.conf.Config.Sender.SWITCH_SENDER_INTERVAL; +import com.ai.cloud.skywalking.conf.Config; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; +import com.ai.cloud.skywalking.selfexamination.HeathReading; +import com.ai.cloud.skywalking.selfexamination.SDKHealthCollector; +import com.ai.cloud.skywalking.util.StringUtil; import java.io.IOException; import java.net.InetSocketAddress; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.concurrent.ThreadLocalRandom; -import org.apache.logging.log4j.Level; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import com.ai.cloud.skywalking.conf.Config; -import com.ai.cloud.skywalking.selfexamination.HeathReading; -import com.ai.cloud.skywalking.selfexamination.SDKHealthCollector; -import com.ai.cloud.skywalking.util.StringUtil; +import static com.ai.cloud.skywalking.conf.Config.Sender.*; public class DataSenderFactoryWithBalance { - private static Logger logger = LogManager.getLogger(DataSenderFactoryWithBalance.class); + private static Logger logger = LogManager.getLogger(DataSenderFactoryWithBalance.class); // unUsedServerAddress存放没有使用的服务器地址, private static List unusedServerAddresses = new ArrayList(); @@ -171,7 +161,7 @@ public class DataSenderFactoryWithBalance { try { Thread.sleep(CLOSE_SENDER_COUNTDOWN); } catch (InterruptedException e) { - logger.log(Level.ALL, "Sleep Failed"); + logger.error("Sleep Failed", e); } toBeSwitchSender.close(); unusedServerAddresses.remove(tmpSender @@ -184,10 +174,10 @@ public class DataSenderFactoryWithBalance { sleepTime = 0; } } catch (Throwable e) { - SDKHealthCollector.getCurrentHeathReading(null).updateData(HeathReading.ERROR, "DataSenderChecker running failed:" + e.getMessage()); + SDKHealthCollector.getCurrentHeathReading(null).updateData(HeathReading.ERROR, "DataSenderChecker running failed:" + e.getMessage()); logger.error("DataSenderChecker running failed", e); - } finally{ - SDKHealthCollector.getCurrentHeathReading(null).updateData(HeathReading.INFO, "using available DataSender connect to: " + listUsingServers()); + } finally { + SDKHealthCollector.getCurrentHeathReading(null).updateData(HeathReading.INFO, "using available DataSender connect to: " + listUsingServers()); } sleepTime += CHECKER_THREAD_WAIT_INTERVAL; @@ -205,7 +195,7 @@ public class DataSenderFactoryWithBalance { DataSender result = null; int index = 0; - if (unusedServerAddresses.size() > 1){ + if (unusedServerAddresses.size() > 1) { index = ThreadLocalRandom.current().nextInt(0, unusedServerAddresses.size()); } @@ -232,19 +222,19 @@ public class DataSenderFactoryWithBalance { } public static void unRegister(DataSender socket) { - socket.setStatus(DataSender.SenderStatus.FAILED); + socket.setStatus(DataSender.SenderStatus.FAILED); } - - private static String listUsingServers(){ - StringBuilder usingAddrDesc = new StringBuilder(); - if(usingDataSender.size() > 0){ - for(DataSender sender : usingDataSender){ - if(usingAddrDesc.length() > 0){ - usingAddrDesc.append(","); - } - usingAddrDesc.append(sender.getServerAddr().toString()); - } - } - return usingAddrDesc.toString(); + + private static String listUsingServers() { + StringBuilder usingAddrDesc = new StringBuilder(); + if (usingDataSender.size() > 0) { + for (DataSender sender : usingDataSender) { + if (usingAddrDesc.length() > 0) { + usingAddrDesc.append(","); + } + usingAddrDesc.append(sender.getServerAddr().toString()); + } + } + return usingAddrDesc.toString(); } } diff --git a/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/util/LoggingUtil.java b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/util/LoggingUtil.java new file mode 100644 index 0000000000..c1747af54f --- /dev/null +++ b/skywalking-collector/skywalking-api/src/main/java/com/ai/cloud/skywalking/util/LoggingUtil.java @@ -0,0 +1,23 @@ +package com.ai.cloud.skywalking.util; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +/** + * Created by xin on 16-6-24. + */ +public class LoggingUtil { + public static String fetchThrowableStack(Throwable e) { + ByteArrayOutputStream buf = new ByteArrayOutputStream(); + e.printStackTrace(new java.io.PrintWriter(buf, true)); + String expMessage = buf.toString(); + try { + buf.close(); + } catch (IOException e1) { + System.err.println("Failed to close throwable stack stream."); + e.printStackTrace(); + } + + return expMessage; + } +} diff --git a/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/logging/LoggingTest.java b/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/logging/LoggingTest.java new file mode 100644 index 0000000000..6c41a8ebaf --- /dev/null +++ b/skywalking-collector/skywalking-api/src/test/java/test/ai/cloud/logging/LoggingTest.java @@ -0,0 +1,27 @@ +package test.ai.cloud.logging; + +import com.ai.cloud.skywalking.conf.Config; +import com.ai.cloud.skywalking.logging.LogManager; +import com.ai.cloud.skywalking.logging.Logger; +import org.junit.Test; + +public class LoggingTest { + + Logger logger = LogManager.getLogger(LoggingTest.class); + + @Test + public void testNormalLogging() { + logger.debug("Hello World"); + } + + @Test + public void testErrorLogging() { + logger.error("Hello World", new RuntimeException("Failed message")); + } + + @Test + public void testConvertFile() { + Config.Logging.MAX_LOG_FILE_LENGTH = 2400; + logger.error("Hello World", new RuntimeException("Failed message")); + } +} -- GitLab