diff --git a/agent/pom.xml b/agent/pom.xml
index a59627a21..a3e89eead 100644
--- a/agent/pom.xml
+++ b/agent/pom.xml
@@ -40,6 +40,7 @@
pinpoint-test
test
+
org.springframework
spring-test
@@ -55,6 +56,7 @@
spring-webmvc
test
+
javax.servlet
javax.servlet-api
diff --git a/agent/src/test/java/com/navercorp/pinpoint/plugin/log4j/Log4jIT.java b/agent/src/test/java/com/navercorp/pinpoint/plugin/log4j/Log4jIT.java
index bdb9a3cd3..899d3db07 100644
--- a/agent/src/test/java/com/navercorp/pinpoint/plugin/log4j/Log4jIT.java
+++ b/agent/src/test/java/com/navercorp/pinpoint/plugin/log4j/Log4jIT.java
@@ -25,7 +25,7 @@ import com.navercorp.pinpoint.test.plugin.Dependency;
import com.navercorp.pinpoint.test.plugin.PinpointPluginTestSuite;
@RunWith(PinpointPluginTestSuite.class)
-@Dependency({"log4j:log4j:[1.1.3],[1.2.17,)"})
+@Dependency({"log4j:log4j:[1.2.16,)"})
public class Log4jIT {
@Test
diff --git a/agent/src/test/java/com/navercorp/pinpoint/plugin/logback/LogbackIT.java b/agent/src/test/java/com/navercorp/pinpoint/plugin/logback/LogbackIT.java
new file mode 100644
index 000000000..01033ea1f
--- /dev/null
+++ b/agent/src/test/java/com/navercorp/pinpoint/plugin/logback/LogbackIT.java
@@ -0,0 +1,40 @@
+/**
+z * Copyright 2014 NAVER Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.navercorp.pinpoint.plugin.logback;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+
+import com.navercorp.pinpoint.test.plugin.Dependency;
+import com.navercorp.pinpoint.test.plugin.PinpointPluginTestSuite;
+
+@RunWith(PinpointPluginTestSuite.class)
+@Dependency({"ch.qos.logback:logback-classic:[1.0.13],[1.1.3,)", "org.slf4j:slf4j-api:1.7.12"})
+public class LogbackIT {
+
+ @Test
+ public void test() throws Exception {
+ Logger logger = LoggerFactory.getLogger(getClass());
+ logger.error("maru");
+
+ Assert.assertNotNull(MDC.get("PtxId"));
+ Assert.assertNotNull(MDC.get("PspanId"));
+ }
+}
diff --git a/plugins/log4j/src/main/java/com/navercorp/pinpoint/plugin/log4j/Log4jPlugin.java b/plugins/log4j/src/main/java/com/navercorp/pinpoint/plugin/log4j/Log4jPlugin.java
index 08d40addc..f5db7dec6 100644
--- a/plugins/log4j/src/main/java/com/navercorp/pinpoint/plugin/log4j/Log4jPlugin.java
+++ b/plugins/log4j/src/main/java/com/navercorp/pinpoint/plugin/log4j/Log4jPlugin.java
@@ -15,8 +15,6 @@
*/
package com.navercorp.pinpoint.plugin.log4j;
-import static com.navercorp.pinpoint.common.trace.HistogramSchema.*;
-
import java.security.ProtectionDomain;
import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass;
@@ -27,15 +25,10 @@ import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin;
import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPluginInstrumentContext;
import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPluginSetupContext;
import com.navercorp.pinpoint.bootstrap.plugin.transformer.PinpointClassFileTransformer;
-import com.navercorp.pinpoint.common.trace.AnnotationKey;
-import com.navercorp.pinpoint.common.trace.ServiceType;
public class Log4jPlugin implements ProfilerPlugin {
private final PLogger logger = PLoggerFactory.getLogger(getClass());
- public static final ServiceType GSON_SERVICE_TYPE = ServiceType.of(5010, "GSON", NORMAL_SCHEMA);
- public static final AnnotationKey GSON_ANNOTATION_KEY_JSON_LENGTH = new AnnotationKey(9000, "gson.json.length");
-
@Override
public void setup(ProfilerPluginSetupContext context) {
context.addClassFileTransformer("org.apache.log4j.spi.LoggingEvent", new PinpointClassFileTransformer() {
@@ -49,11 +42,11 @@ public class Log4jPlugin implements ProfilerPlugin {
return null;
}
- if (!mdcClass.hasMethod("put", new String[]{"java.lang.String", "java.lang.Object"})) {
+ if (!mdcClass.hasMethod("put", "java.lang.String", "java.lang.Object")) {
logger.warn("modify fail. Because put method does not exist at org.apache.log4j.MDC class.");
return null;
}
- if (!mdcClass.hasMethod("remove", new String[]{"java.lang.String"})) {
+ if (!mdcClass.hasMethod("remove", "java.lang.String")) {
logger.warn("modify fail. Because remove method does not exist at org.apache.log4j.MDC class.");
return null;
}
diff --git a/plugins/logback/.gitignore b/plugins/logback/.gitignore
new file mode 100644
index 000000000..8c2d47305
--- /dev/null
+++ b/plugins/logback/.gitignore
@@ -0,0 +1,5 @@
+/target/
+/.settings/
+/.classpath
+/.project
+/*.iml
diff --git a/plugins/logback/clover.license b/plugins/logback/clover.license
new file mode 100644
index 000000000..569fa6175
--- /dev/null
+++ b/plugins/logback/clover.license
@@ -0,0 +1,5 @@
+RMRqrdbgbKFhbaVnDxHUdDQvrOQXxIBklnvcmahheubVC
+mh2KM35CLkwUHS4DH7QVhxy52J5hnWbyEm6Cyd3KkF
+ 4.0.0
+
+ com.navercorp.pinpoint
+ pom
+ ../..
+ 1.5.0-SNAPSHOT
+
+
+ pinpoint-logback-plugin
+ pinpoint-logback-plugin
+ jar
+
+
+
+ com.navercorp.pinpoint
+ pinpoint-bootstrap-core
+ provided
+
+
+ org.slf4j
+ slf4j-api
+ provided
+
+
+
diff --git a/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/LogbackPlugin.java b/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/LogbackPlugin.java
new file mode 100644
index 000000000..ed2243819
--- /dev/null
+++ b/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/LogbackPlugin.java
@@ -0,0 +1,68 @@
+/**
+ * Copyright 2014 NAVER Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.navercorp.pinpoint.plugin.logback;
+
+import static com.navercorp.pinpoint.common.trace.HistogramSchema.*;
+
+import java.security.ProtectionDomain;
+
+import com.navercorp.pinpoint.bootstrap.instrument.InstrumentClass;
+import com.navercorp.pinpoint.bootstrap.instrument.InstrumentException;
+import com.navercorp.pinpoint.bootstrap.logging.PLogger;
+import com.navercorp.pinpoint.bootstrap.logging.PLoggerFactory;
+import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin;
+import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPluginInstrumentContext;
+import com.navercorp.pinpoint.bootstrap.plugin.ProfilerPluginSetupContext;
+import com.navercorp.pinpoint.bootstrap.plugin.transformer.PinpointClassFileTransformer;
+import com.navercorp.pinpoint.common.trace.AnnotationKey;
+import com.navercorp.pinpoint.common.trace.ServiceType;
+
+public class LogbackPlugin implements ProfilerPlugin {
+ private final PLogger logger = PLoggerFactory.getLogger(getClass());
+
+ public static final ServiceType GSON_SERVICE_TYPE = ServiceType.of(5010, "GSON", NORMAL_SCHEMA);
+ public static final AnnotationKey GSON_ANNOTATION_KEY_JSON_LENGTH = new AnnotationKey(9000, "gson.json.length");
+
+ @Override
+ public void setup(ProfilerPluginSetupContext context) {
+ context.addClassFileTransformer("ch.qos.logback.classic.spi.LoggingEvent", new PinpointClassFileTransformer() {
+
+ @Override
+ public byte[] transform(ProfilerPluginInstrumentContext pluginContext, ClassLoader loader, String className, Class> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {
+ InstrumentClass mdcClass = pluginContext.getInstrumentClass(loader, "org.slf4j.MDC", null);
+
+ if (mdcClass == null) {
+ logger.warn("modify fail. Because org.slf4j.MDC does not exist.");
+ return null;
+ }
+
+ if (!mdcClass.hasMethod("put", "java.lang.String", "java.lang.String")) {
+ logger.warn("modify fail. Because put method does not exist at org.slf4j.MDC class.");
+ return null;
+ }
+ if (!mdcClass.hasMethod("remove", "java.lang.String")) {
+ logger.warn("modify fail. Because remove method does not exist at org.slf4j.MDC class.");
+ return null;
+ }
+
+ InstrumentClass target = pluginContext.getInstrumentClass(loader, className, classfileBuffer);
+ target.addInterceptor("com.navercorp.pinpoint.plugin.logback.interceptor.LoggingEventOfLogbackInterceptor");
+
+ return target.toBytecode();
+ }
+ });
+ }
+}
diff --git a/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/interceptor/LoggingEventOfLogbackInterceptor.java b/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/interceptor/LoggingEventOfLogbackInterceptor.java
index c7b46c827..ba85fe608 100644
--- a/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/interceptor/LoggingEventOfLogbackInterceptor.java
+++ b/plugins/logback/src/main/java/com/navercorp/pinpoint/plugin/logback/interceptor/LoggingEventOfLogbackInterceptor.java
@@ -13,45 +13,44 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-package com.navercorp.pinpoint.profiler.modifier.log.logback.interceptor;
+package com.navercorp.pinpoint.plugin.logback.interceptor;
import org.slf4j.MDC;
import com.navercorp.pinpoint.bootstrap.context.Trace;
import com.navercorp.pinpoint.bootstrap.context.TraceContext;
-import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor;
-import com.navercorp.pinpoint.bootstrap.interceptor.TargetClassLoader;
-import com.navercorp.pinpoint.bootstrap.interceptor.TraceContextSupport;
-import com.navercorp.pinpoint.profiler.modifier.log.MdcKey;
+import com.navercorp.pinpoint.bootstrap.interceptor.BeforeInterceptor0;
+import com.navercorp.pinpoint.bootstrap.plugin.annotation.TargetConstructor;
+import com.navercorp.pinpoint.bootstrap.plugin.annotation.Targets;
/**
* @author minwoo.jung
*/
-public class LoggingEventOfLogbackInterceptor implements SimpleAroundInterceptor, TraceContextSupport, TargetClassLoader {
+@Targets(constructors={
+ @TargetConstructor({}),
+ @TargetConstructor({"java.lang.String", "ch.qos.logback.classic.Logger", "ch.qos.logback.classic.Level", "java.lang.String", "java.lang.Throwable", "java.lang.Object[]"})
+})
+public class LoggingEventOfLogbackInterceptor implements BeforeInterceptor0 {
+ private static final String TRANSACTION_ID = "PtxId";
+ private static final String SPAN_ID = "PspanId";
- private TraceContext traceContext;
+ private final TraceContext traceContext;
- @Override
- public void before(Object target, Object[] args) {
- Trace trace = traceContext.currentTraceObject();
-
- if (trace == null) {
- MDC.remove(MdcKey.TRANSACTION_ID);
- MDC.remove(MdcKey.SPAN_ID);
- return;
- } else {
- MDC.put(MdcKey.TRANSACTION_ID, trace.getTraceId().getTransactionId());
- MDC.put(MdcKey.SPAN_ID, String.valueOf(trace.getTraceId().getSpanId()));
- }
- }
-
- @Override
- public void after(Object target, Object[] args, Object result, Throwable throwable) {
- }
-
- @Override
- public void setTraceContext(TraceContext traceContext) {
+ public LoggingEventOfLogbackInterceptor(TraceContext traceContext) {
this.traceContext = traceContext;
}
+ @Override
+ public void before(Object target) {
+ Trace trace = traceContext.currentTraceObject();
+
+ if (trace == null) {
+ MDC.remove(TRANSACTION_ID);
+ MDC.remove(SPAN_ID);
+ return;
+ } else {
+ MDC.put(TRANSACTION_ID, trace.getTraceId().getTransactionId());
+ MDC.put(SPAN_ID, String.valueOf(trace.getTraceId().getSpanId()));
+ }
+ }
}
diff --git a/plugins/logback/src/main/resources/META-INF/services/com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin b/plugins/logback/src/main/resources/META-INF/services/com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin
new file mode 100644
index 000000000..69d0586bd
--- /dev/null
+++ b/plugins/logback/src/main/resources/META-INF/services/com.navercorp.pinpoint.bootstrap.plugin.ProfilerPlugin
@@ -0,0 +1 @@
+com.navercorp.pinpoint.plugin.logback.LogbackPlugin
\ No newline at end of file
diff --git a/plugins/pom.xml b/plugins/pom.xml
index 0655ab09a..a5e464352 100644
--- a/plugins/pom.xml
+++ b/plugins/pom.xml
@@ -37,6 +37,7 @@
mybatis
okhttp
log4j
+ logback
@@ -165,6 +166,11 @@
pinpoint-log4j-plugin
${project.version}
+
+ com.navercorp.pinpoint
+ pinpoint-logback-plugin
+ ${project.version}
+
diff --git a/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/log/logback/interceptor/LoggingEventOfLogbackInterceptor.java b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/log/logback/interceptor/LoggingEventOfLogbackInterceptor.java
new file mode 100644
index 000000000..c7b46c827
--- /dev/null
+++ b/profiler/src/main/java/com/navercorp/pinpoint/profiler/modifier/log/logback/interceptor/LoggingEventOfLogbackInterceptor.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2014 NAVER Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.navercorp.pinpoint.profiler.modifier.log.logback.interceptor;
+
+import org.slf4j.MDC;
+
+import com.navercorp.pinpoint.bootstrap.context.Trace;
+import com.navercorp.pinpoint.bootstrap.context.TraceContext;
+import com.navercorp.pinpoint.bootstrap.interceptor.SimpleAroundInterceptor;
+import com.navercorp.pinpoint.bootstrap.interceptor.TargetClassLoader;
+import com.navercorp.pinpoint.bootstrap.interceptor.TraceContextSupport;
+import com.navercorp.pinpoint.profiler.modifier.log.MdcKey;
+
+/**
+ * @author minwoo.jung
+ */
+public class LoggingEventOfLogbackInterceptor implements SimpleAroundInterceptor, TraceContextSupport, TargetClassLoader {
+
+ private TraceContext traceContext;
+
+ @Override
+ public void before(Object target, Object[] args) {
+ Trace trace = traceContext.currentTraceObject();
+
+ if (trace == null) {
+ MDC.remove(MdcKey.TRANSACTION_ID);
+ MDC.remove(MdcKey.SPAN_ID);
+ return;
+ } else {
+ MDC.put(MdcKey.TRANSACTION_ID, trace.getTraceId().getTransactionId());
+ MDC.put(MdcKey.SPAN_ID, String.valueOf(trace.getTraceId().getSpanId()));
+ }
+ }
+
+ @Override
+ public void after(Object target, Object[] args, Object result, Throwable throwable) {
+ }
+
+ @Override
+ public void setTraceContext(TraceContext traceContext) {
+ this.traceContext = traceContext;
+ }
+
+}