mxd 3 rokov pred
rodič
commit
d0258e5549

+ 16 - 16
magic-api/src/main/java/org/ssssssss/magicapi/logging/Log4j2LoggerContext.java

@@ -6,13 +6,12 @@ import org.apache.logging.log4j.core.Layout;
 import org.apache.logging.log4j.core.LogEvent;
 import org.apache.logging.log4j.core.LoggerContext;
 import org.apache.logging.log4j.core.appender.AbstractAppender;
+import org.apache.logging.log4j.core.appender.ConsoleAppender;
 import org.apache.logging.log4j.core.config.Configuration;
 import org.apache.logging.log4j.core.config.LoggerConfig;
 import org.apache.logging.log4j.core.config.Property;
-import org.apache.logging.log4j.core.impl.ThrowableProxy;
 import org.apache.logging.log4j.core.layout.PatternLayout;
 
-import java.io.Serializable;
 import java.nio.charset.StandardCharsets;
 
 /**
@@ -27,11 +26,16 @@ public class Log4j2LoggerContext implements MagicLoggerContext {
 		LoggerContext context = (LoggerContext) LogManager.getContext(false);
 		Configuration configuration = context.getConfiguration();
 		LoggerConfig logger = configuration.getRootLogger();
-		PatternLayout layout = PatternLayout.newBuilder()
-				.withCharset(StandardCharsets.UTF_8)
-				.withConfiguration(configuration)
-				.withPattern("%d %t %p %X{TracingMsg} %c - %m%n")
-				.build();
+		Layout<String> layout = logger.getAppenders().values()
+				.stream()
+				.filter(it -> it instanceof ConsoleAppender)
+				.map(it -> (Layout<String>)it.getLayout())
+				.findFirst()
+				.orElseGet(() -> PatternLayout.newBuilder()
+						.withCharset(StandardCharsets.UTF_8)
+						.withConfiguration(configuration)
+						.withPattern(PATTERN)
+						.build());
 		MagicLog4j2Appender appender = new MagicLog4j2Appender("Magic", logger.getFilter(), layout);
 		appender.start();
 		configuration.addAppender(appender);
@@ -41,20 +45,16 @@ public class Log4j2LoggerContext implements MagicLoggerContext {
 
 	static class MagicLog4j2Appender extends AbstractAppender {
 
-		MagicLog4j2Appender(String name, Filter filter, Layout<? extends Serializable> layout) {
+		private Layout<String> layout;
+
+		MagicLog4j2Appender(String name, Filter filter, Layout<String> layout) {
 			super(name, filter, layout, true, Property.EMPTY_ARRAY);
+			this.layout = layout;
 		}
 
 		@Override
 		public void append(LogEvent event) {
-			LogInfo logInfo = new LogInfo();
-			logInfo.setLevel(event.getLevel().name().toLowerCase());
-			logInfo.setMessage(event.getMessage().getFormattedMessage());
-			ThrowableProxy throwableProxy = event.getThrownProxy();
-			if (throwableProxy != null) {
-				logInfo.setThrowable(throwableProxy.getThrowable());
-			}
-			MagicLoggerContext.println(logInfo);
+			MagicLoggerContext.println(this.layout.toSerializable(event));
 		}
 	}
 }

+ 1 - 9
magic-api/src/main/java/org/ssssssss/magicapi/logging/Log4jLoggerContext.java

@@ -5,7 +5,6 @@ import org.apache.log4j.LogManager;
 import org.apache.log4j.PatternLayout;
 import org.apache.log4j.spi.LoggingEvent;
 import org.apache.log4j.spi.RootLogger;
-import org.apache.log4j.spi.ThrowableInformation;
 
 
 /**
@@ -28,14 +27,7 @@ public class Log4jLoggerContext implements MagicLoggerContext {
 
 		@Override
 		protected void append(LoggingEvent event) {
-			LogInfo logInfo = new LogInfo();
-			logInfo.setLevel(event.getLevel().toString().toLowerCase());
-			logInfo.setMessage(String.valueOf(event.getMessage()));
-			ThrowableInformation throwableInformation = event.getThrowableInformation();
-			if (throwableInformation != null) {
-				logInfo.setThrowable(throwableInformation.getThrowable());
-			}
-			MagicLoggerContext.println(logInfo);
+			MagicLoggerContext.println(getLayout().format(event));
 		}
 
 		@Override

+ 0 - 60
magic-api/src/main/java/org/ssssssss/magicapi/logging/LogInfo.java

@@ -1,60 +0,0 @@
-package org.ssssssss.magicapi.logging;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-/**
- * 打印的日志信息
- *
- * @author mxd
- */
-public class LogInfo {
-
-	private String level;
-
-	private String message;
-
-	private String throwable;
-
-	public LogInfo() {
-	}
-
-	public LogInfo(String level, String message, Throwable throwable) {
-		this.level = level;
-		this.message = message;
-		this.setThrowable(throwable);
-	}
-
-	public String getLevel() {
-		return level;
-	}
-
-	public void setLevel(String level) {
-		this.level = level;
-	}
-
-	public String getMessage() {
-		return message;
-	}
-
-	public void setMessage(String message) {
-		this.message = message;
-	}
-
-	public String getThrowable() {
-		return throwable;
-	}
-
-	public void setThrowable(Throwable throwable) {
-		if (throwable != null) {
-			try (StringWriter writer = new StringWriter();
-				 PrintWriter printWriter = new PrintWriter(writer)) {
-				throwable.printStackTrace(printWriter);
-				this.throwable = writer.toString();
-			} catch (IOException ignored) {
-
-			}
-		}
-	}
-}

+ 13 - 10
magic-api/src/main/java/org/ssssssss/magicapi/logging/LogbackLoggerContext.java

@@ -1,8 +1,8 @@
 package org.ssssssss.magicapi.logging;
 
 import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.PatternLayout;
 import ch.qos.logback.classic.spi.ILoggingEvent;
-import ch.qos.logback.classic.spi.ThrowableProxy;
 import ch.qos.logback.core.UnsynchronizedAppenderBase;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -18,7 +18,11 @@ public class LogbackLoggerContext implements MagicLoggerContext {
 	public void generateAppender() {
 		LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
 		ch.qos.logback.classic.Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME);
-		MagicLogbackAppender appender = new MagicLogbackAppender();
+		PatternLayout layout = new PatternLayout();
+		layout.setContext(context);
+		layout.setPattern(PATTERN);
+		layout.start();
+		MagicLogbackAppender appender = new MagicLogbackAppender(layout);
 		appender.setContext(context);
 		appender.setName(LOGGER_NAME);
 		appender.start();
@@ -27,16 +31,15 @@ public class LogbackLoggerContext implements MagicLoggerContext {
 
 	static class MagicLogbackAppender extends UnsynchronizedAppenderBase<ILoggingEvent> {
 
+		private PatternLayout layout;
+
+		public MagicLogbackAppender(PatternLayout layout) {
+			this.layout = layout;
+		}
+
 		@Override
 		protected void append(ILoggingEvent event) {
-			LogInfo logInfo = new LogInfo();
-			logInfo.setLevel(event.getLevel().levelStr.toLowerCase());
-			logInfo.setMessage(event.getFormattedMessage());
-			ThrowableProxy throwableProxy = (ThrowableProxy) event.getThrowableProxy();
-			if (throwableProxy != null) {
-				logInfo.setThrowable(throwableProxy.getThrowable());
-			}
-			MagicLoggerContext.println(logInfo);
+			MagicLoggerContext.println(layout.doLayout(event));
 		}
 	}
 }

+ 7 - 3
magic-api/src/main/java/org/ssssssss/magicapi/logging/MagicLoggerContext.java

@@ -3,6 +3,8 @@ package org.ssssssss.magicapi.logging;
 import org.ssssssss.magicapi.config.MessageType;
 import org.ssssssss.magicapi.config.WebSocketSessionManager;
 
+import java.util.Collections;
+
 /**
  * 日志上下文
  *
@@ -12,18 +14,20 @@ public interface MagicLoggerContext {
 
 	String LOGGER_NAME = "magic";
 
+	String PATTERN = "%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx";
+
 	ThreadLocal<String> SESSION = new InheritableThreadLocal<>();
 
 	/**
 	 * 打印日志
-	 *
+	 *re
 	 * @param logInfo 日志信息
 	 */
-	static void println(LogInfo logInfo) {
+	static void println(String logInfo) {
 		// 获取SessionId
 		String sessionId = SESSION.get();
 		if (sessionId != null) {
-			WebSocketSessionManager.sendBySessionId(sessionId, MessageType.LOG, logInfo);
+			WebSocketSessionManager.sendBySessionId(sessionId, MessageType.LOG, Collections.singletonList(logInfo));
 		}
 	}
 

+ 1 - 0
magic-editor/src/console/package.json

@@ -11,6 +11,7 @@
     "build:lib": "vue-cli-service build --name magic-editor --target lib --entry ./src/index.js"
   },
   "dependencies": {
+    "anser": "^2.1.0",
     "axios": "^0.21.0",
     "core-js": "^3.6.5",
     "monaco-editor": "^0.29.1",

+ 6 - 7
magic-editor/src/console/src/assets/index.css

@@ -1,6 +1,6 @@
 .ma-container {
     font-size: 12px;
-    font-family: 'Consolas', '微软雅黑';
+    font-family: 'Consolas', "Courier New",monospace, '微软雅黑';
     letter-spacing: 0px;
     overflow: auto;
     display: flex;
@@ -83,12 +83,6 @@
     --toolbox-list-arrow-color: #b3b3b3;
     /* 左侧工具条列表中头部图标的颜色 */
     --toolbox-list-header-icon-color: #7f7f7f;
-    /* 日志级别颜色 */
-    --log-info-color: #00cd00;
-    --log-warn-color: #A66F00;
-    --log-debug-color: #00cccc;
-    --log-error-color: #cd0000;
-    --log-trace-color: #0000EE;
 
     /* 中间选项卡边框颜色 */
     --tab-bar-border-color: #c9c9c9;
@@ -118,12 +112,17 @@
     --suggest-hover-background: #D6EBFF;
     --suggest-hover-color: #000;
     --statusbar-em-color: #007f31;
+    --run-log-background: #fff;
     scrollbar-color: var(--scollbar-color) var(--scollbar-color);
     scrollbar-width: thin;
     outline: 0;
 
 }
 
+.ma-container pre{
+    font-family: 'Consolas', "Courier New",monospace, '微软雅黑';
+}
+
 .ma-container * {
     margin: 0;
     padding: 0;

+ 15 - 62
magic-editor/src/console/src/components/layout/magic-log.vue

@@ -1,20 +1,13 @@
 <template>
   <div ref="container" class="ma-log" @contextmenu.prevent="e=>onContextMenu(e)">
-    <div v-for="(item, key) in logs" :key="'run_log_' + key" :class="{collapse: item.newline&&!item.expand}">
-      <div>{{ item.timestamp }}</div>
-      <div :style="{color :'var(--log-'+ item.level.toLocaleLowerCase() + '-color)'}">
-        {{ item.level }}
-      </div>
-      <i class="ma-icon" :class="{'ma-icon-expand': !item.expand, 'ma-icon-collapse': item.expand}" v-if="item.newline" @click.stop="doExpand(item)"></i>
-      <div :class="{throwable: item.throwable === true}" v-html="item.message"></div>
-    </div>
+    <pre v-for="(item, key) in logs" :key="'run_log_' + key" v-html="item">
+    </pre>
   </div>
 </template>
 
 <script>
 import bus from "@/scripts/bus";
-import * as utils from "@/scripts/utils";
-import contants from "@/scripts/contants";
+import Anser from 'anser'
 
 export default {
   name: "MagicLog",
@@ -34,20 +27,11 @@ export default {
       item.expand = !item.expand;
     },
     onLogReceived(row){
-      row.timestamp = utils.formatDate(new Date())
-      let throwable = row.throwable
-      delete row.throwable
-      row.message = (row.message || '').replace(/ /g, '&nbsp;').replace(/\n/g,'<br>')
-      row.expand = false;
-      if (throwable) {
-        row.message += throwable.replace(/ /g, '&nbsp;').replace(/\n/g,'<br>')
-        row.throwable = true
-      }
-      row.newline = row.message.indexOf('<br>') > -1
-      if(this.logs.length >= contants.LOG_MAX_ROWS){
-        this.logs.shift()
-      }
-      this.logs.push(row)
+      let html = Anser.linkify(Anser.ansiToHtml(Anser.escapeForHtml(row[0])));
+      // 替换链接为新标签页打开
+      html = html.replace(/<a /g,'<a target="blank" ');
+      html = html.replace(/(\tat .*\()(.*?:\d+)(\).*?[\r\n])/g,'$1<span style="color:#808080;text-decoration: underline;">$2</span>$3')
+      this.logs.push(html)
       let container = this.$refs.container;
       this.$nextTick(() => container.scrollTop = container.scrollHeight)
     },
@@ -67,48 +51,17 @@ export default {
 <style scoped>
 .ma-log {
   overflow: auto;
-  font-size: 1.1em;
+  font-size: 13.5px;
   height: 100%;
-  background: var(--toolbox-background);
+  background: var(--run-log-background);
+  padding-top: 5px;
+  padding-left: 5px;
 }
 
-.ma-log > div > div {
-  display: inline;
+.ma-log pre{
   line-height: 20px;
-  white-space: nowrap;
 }
-
-.ma-log > div > div:first-child {
-  padding: 0 5px;
-}
-
-.ma-log > div > div:nth-child(2) {
-  width: 50px;
-  padding: 0 5px;
-  text-align: right;
-  margin-left: 5px;
-}
-
-.ma-log > div > div:last-child {
-  padding: 0 10px;
-}
-
-.ma-log .throwable {
-  color: var(--log-error-color)
-}
-
-.ma-log i{
-  margin-right: -10px;
-  margin-left: -10px;
-  font-size: 12px;
-  width: 20px;
-  display: inline-block;
-  height: 20px;
-  text-align: center;
-}
-.ma-log .collapse{
-  height: 20px;
-  line-height: 20px;
-  overflow: hidden;
+.ma-log >>> pre span{
+  opacity: 1 !important;
 }
 </style>

+ 2 - 1
magic-editor/src/console/src/scripts/editor/dark-theme.js

@@ -100,6 +100,7 @@ export default {
         'text-key-color': '#9876aa',
         'suggest-hover-background': '#113A5C',
         'suggest-hover-color': '#fff',
-        'statusbar-em-color': '#68dd9a'
+        'statusbar-em-color': '#68dd9a',
+        'run-log-background': '#2b2b2b'
     }
 };