Skip to content

Commit

Permalink
fix 重新兼容SLF4J,回退支持排除logger依赖
Browse files Browse the repository at this point in the history
  • Loading branch information
tzfun committed Dec 29, 2023
1 parent ce67367 commit 4c8f80d
Show file tree
Hide file tree
Showing 9 changed files with 68 additions and 48 deletions.
17 changes: 9 additions & 8 deletions agent/src/main/java/org/beifengtz/jvmm/agent/AgentBootStrap.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public class AgentBootStrap {
private static volatile Instrumentation instrumentation;

private static volatile boolean running;
private static volatile boolean initializedAgentLogger;
private static volatile Thread bindThread;
private static volatile JvmmAgentClassLoader agentClassLoader;
/**
Expand Down Expand Up @@ -281,9 +282,9 @@ private static void notifyListener(int listenerPort, String message) {
}

private static void bootServer(Instrumentation inst, List<URL> needPreLoad, String agentArgs) throws InterruptedException {
running = true;
// 启动日志打印代理消费线程
runLoggerConsumer();
running = true;
bindThread = new Thread(() -> {
int listenerPort = findListenerPortFromArgs(agentArgs);
try {
Expand Down Expand Up @@ -326,23 +327,22 @@ private static void bootServer(Instrumentation inst, List<URL> needPreLoad, Stri
* 为了应用宿主程序的日志配置,启动一个日志消费者线程去Agent Server内部的处理日志
*/
private static void runLoggerConsumer() {
if (running) {
if (initializedAgentLogger) {
return;
}
Thread thread = new Thread(() -> {
while (running) {
try {
LoggerEvent info = logQueue.take();

String type = info.getType().toLowerCase();
String level = info.getLevel().toLowerCase();
if (info.getArgs() == null) {
if (info.getThrowable() == null) {
LoggerUtil.logger(info.getName(), type, info.getMsg());
LoggerUtil.logger(info.getName(), level, info.getMsg());
} else {
LoggerUtil.logger(info.getName(), type, info.getMsg(), info.getThrowable());
LoggerUtil.logger(info.getName(), level, info.getMsg(), info.getThrowable());
}
} else {
LoggerUtil.logger(info.getName(), type, info.getMsg(), info.getArgs());
LoggerUtil.logger(info.getName(), level, info.getMsg(), info.getArgs());
}
} catch (Throwable e) {
LoggerUtil.error(AgentBootStrap.class, "Consume log failed", e);
Expand All @@ -351,7 +351,8 @@ private static void runLoggerConsumer() {
});
thread.setName("jvmm-logger");
thread.start();
LoggerUtil.info(AgentBootStrap.class, "Log agent thread started successfully");
initializedAgentLogger = true;
LoggerUtil.info(AgentBootStrap.class, "Agent logger thread started");
}

/**
Expand Down
20 changes: 16 additions & 4 deletions agent/src/main/java/org/beifengtz/jvmm/agent/LoggerEvent.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.beifengtz.jvmm.agent;

import java.util.Arrays;
import java.util.Map;

/**
Expand All @@ -8,14 +9,14 @@
* @author beifengtz
*/
public class LoggerEvent {
private String type;
private String level;
private String msg;
private Object[] args;
private Throwable throwable;
private String name;

public String getType() {
return type;
public String getLevel() {
return level;
}

public String getMsg() {
Expand All @@ -39,11 +40,22 @@ public static LoggerEvent fromMap(Map<String, Object> map) {
LoggerEvent event = new LoggerEvent();

event.throwable = (Throwable) map.get("throwable");
event.type = (String) map.get("type");
event.level = (String) map.get("level");
event.msg = (String) map.get("msg");
event.args = (Object[]) map.get("args");
event.name = (String) map.get("name");

return event;
}

@Override
public String toString() {
return "LoggerEvent{" +
"level='" + level + '\'' +
", msg='" + msg + '\'' +
", args=" + Arrays.toString(args) +
", throwable=" + throwable +
", name='" + name + '\'' +
'}';
}
}
1 change: 0 additions & 1 deletion client/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ tasks.compileJava.configure {
include 'module-info.class'
include 'org/beifengtz/jvmm/server/**'
include 'org/yaml/**'
include 'org/slf4j/**'
include 'META-INF/INDEX.LIST'
include 'META-INF/MANIFEST.MF'
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ private static void initLogger() {
public static void main(String[] args) throws Throwable {
initLogger();
CommandRunner.run(args);
// CommandRunner.run(new String[]{"-m", "jar"});
// CommandRunner.run(new String[]{"-m", "jar", "-e", "logger"});
}
}
26 changes: 18 additions & 8 deletions client/src/main/java/org/beifengtz/jvmm/client/CommandRunner.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
public class CommandRunner {

private static final InternalLogger logger = InternalLoggerFactory.getInstance(CommandRunner.class);

private static final String SLF4J_API_REGEX = "org/slf4j/.*";
private static final CmdLineGroup cmdGroup;

static {
Expand Down Expand Up @@ -133,6 +133,11 @@ public class CommandRunner {
.setName("s")
.setOrder(2)
.setDesc("Generate jvmm-server.jar"))
.addOption(CmdOption.create()
.setName("e")
.setOrder(3)
.setArgName("exclude")
.setDesc("Specifies the name of the dependency to be excluded in the generated jar. Optional value: logger"))
);
}

Expand Down Expand Up @@ -179,7 +184,7 @@ private static void handleGenerateJar(CmdParser cmd) throws IOException {

if (generateAll || cmd.hasArg("s")) {
if (canGenerateServerJar()) {
generateServerJar(null);
generateServerJar(null, !cmd.hasArg("e") || !cmd.getArg("e").contains("logger"));
} else {
logger.error("Can not generate server jar file, case: no runtime source.");
}
Expand All @@ -193,12 +198,12 @@ private static boolean canGenerateServerJar() {
return CommandRunner.class.getResourceAsStream("/server-source") != null && path.endsWith(".jar");
}

private static void generateServerJar(String dir) throws IOException {
private static void generateServerJar(String dir, boolean containsSlf4j) throws IOException {
if (canGenerateServerJar()) {
File serverJarFile = new File(dir, "jvmm-server.jar");
if (checkJarVersion(dir) && serverJarFile.exists()) {
return;
}
// if (checkJarVersion(dir) && serverJarFile.exists()) {
// return;
// }
logger.info("Starting to generate server jar...");
String path = CommandRunner.class.getProtectionDomain().getCodeSource().getLocation().getPath();
try {
Expand All @@ -214,7 +219,12 @@ private static void generateServerJar(String dir) throws IOException {
}
String regex = "async-profiler/.*|com/.*|io/.*|org/benf.*|META-INF/maven/.*" +
"|META-INF/native/.*|META-INF/native-image/.*|io.netty.versions.propeties|server-source/.*|" +
".*jvmm/common/.*|.*jvmm/convey/.*|.*jvmm/core/.*|.*jvmm/log/.*|oshi/.*|oshi.*|org/yaml.*|org/slf4j/.*";
".*jvmm/common/.*|.*jvmm/convey/.*|.*jvmm/core/.*|.*jvmm/log/.*|oshi/.*|oshi.*|org/yaml.*";
if (containsSlf4j) {
regex += ("|" + SLF4J_API_REGEX);
} else {
logger.info("Ignored slf4j dependency");
}
FileUtil.copyFromJar(new JarFile(path), tempDir, regex, fileName -> {
if (fileName.startsWith("server-source")) {
return fileName.replace("server-source/", "");
Expand Down Expand Up @@ -385,7 +395,7 @@ private static void handleAttach(CmdParser cmd) throws Throwable {
serverFilePath = cmd.getArg("s");
// FileUtil.delFromJar(serverFilePath, JVMM_LOGGER_REGEX);
} else if (canGenerateServerJar()) {
generateServerJar(FileUtil.getTempPath());
generateServerJar(FileUtil.getTempPath(), true);
serverFilePath = new File(FileUtil.getTempPath(), "jvmm-server.jar").getAbsolutePath();
} else {
serverFilePath = GuidedRunner.askServerFilePath();
Expand Down
23 changes: 12 additions & 11 deletions logger/src/main/java/org/beifengtz/jvmm/log/JvmmLogger.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,16 +105,6 @@ private String formatPattern(String msg, String pattern, InternalLogLevel level,

private void pushEvent(LoggerEvent event) {
JvmmLogConfiguration config = JvmmLoggerFactory.getInstance().getConfig();
InternalLogLevel targetLevel = null;
for (Entry<String, InternalLogLevel> entry : config.getLevels().entrySet()) {
if (event.getName().startsWith(entry.getKey())) {
targetLevel = entry.getValue();
}
}

if (targetLevel != null && levelCode(targetLevel) >= levelCode(level())) {
return;
}

for (Printer printer : printers) {
if (printer.preformat()) {
Expand All @@ -124,7 +114,7 @@ private void pushEvent(LoggerEvent event) {
if (event.getThrowable() != null) {
msg += ('\n' + throwableToString(event.getThrowable()));
}
printer.print(formatPattern(msg, config.getPattern(), event.getType(), printer.ignoreAnsi()));
printer.print(formatPattern(msg, config.getPattern(), event.getLevel(), printer.ignoreAnsi()));
} else {
printer.print(event);
}
Expand Down Expand Up @@ -375,6 +365,17 @@ public void error(Throwable t) {

@Override
public boolean isEnabled(InternalLogLevel level) {
JvmmLogConfiguration config = JvmmLoggerFactory.getInstance().getConfig();
InternalLogLevel targetLevel = null;
for (Entry<String, InternalLogLevel> entry : config.getLevels().entrySet()) {
if (name.startsWith(entry.getKey())) {
targetLevel = entry.getValue();
}
}
if (targetLevel != null && levelCode(level) < levelCode(targetLevel)) {
return false;
}

int target = levelCode(level);
int limit = levelCode(level());
return target >= limit;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,13 +97,10 @@ public void updatePrinters() {
String ps = config.getPrinters();
for (String p : ps.split(",")) {
if ("std".equalsIgnoreCase(p.trim())) {
System.out.println("Use std printer");
printers.add(new StdPrinter());
} else if ("file".equalsIgnoreCase(p.trim())) {
System.out.println("Use file printer");
printers.add(new FilePrinter(config));
} else if ("agentProxy".equalsIgnoreCase(p.trim())) {
System.out.println("Use agent proxy printer");
printers.add(new AgentProxyPrinter());
}
}
Expand Down
22 changes: 11 additions & 11 deletions logger/src/main/java/org/beifengtz/jvmm/log/LoggerEvent.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,44 +7,44 @@

/**
* Description: TODO
*
* <p>
* Created in 15:53 2021/12/9
*
* @author beifengtz
*/
public class LoggerEvent {

private InternalLogLevel type;
private InternalLogLevel level;
private String msg;
private Object[] args;
private Throwable throwable;
private String name;

public static LoggerEvent create(InternalLogLevel type, String msg) {
public static LoggerEvent create(InternalLogLevel level, String msg) {
LoggerEvent info = new LoggerEvent();
info.type = type;
info.level = level;
info.msg = msg;
return info;
}

public static LoggerEvent create(InternalLogLevel type, String format, Object... args) {
public static LoggerEvent create(InternalLogLevel level, String format, Object... args) {
LoggerEvent info = new LoggerEvent();
info.type = type;
info.level = level;
info.msg = format;
info.args = args;
return info;
}

public static LoggerEvent create(InternalLogLevel type, String msg, Throwable e) {
public static LoggerEvent create(InternalLogLevel level, String msg, Throwable e) {
LoggerEvent info = new LoggerEvent();
info.type = type;
info.level = level;
info.msg = msg;
info.throwable = e;
return info;
}

public InternalLogLevel getType() {
return type;
public InternalLogLevel getLevel() {
return level;
}

public String getMsg() {
Expand Down Expand Up @@ -77,7 +77,7 @@ public Map<String, Object> toMap() {
HashMap<String, Object> map = new HashMap<>();

map.put("throwable", throwable);
map.put("type", type.name());
map.put("level", level.name());
map.put("msg", msg);
map.put("args", args);
map.put("name", name);
Expand Down
2 changes: 1 addition & 1 deletion server/src/main/resources/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ log:
# Custom prefix level: OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE, ALL
levels:
io.netty: INFO
org.beifengtz: DEBUG
org.beifengtz: INFO
# Log file output directory
file: logs
# Log file prefix
Expand Down

0 comments on commit 4c8f80d

Please sign in to comment.