1
0
mirror of https://github.com/suk-ws/messiva.git synced 2024-11-22 06:44:50 +08:00

add Formatter struct; add support for LevelRestrict; fix some problems.

- upgrade gradle wrapper 7.3.1 -> 8.0.2

- add Formatter struct that will format Log object to String message.
  - now supports SimpleFormatter. which is old ConsoleAppender formatting method.
- add Appender abs-class.
- add support for LevelRestrict.
  - available on Appender and Logger.
- fix wrong LogLevel.All level number (which should be smallest).
- add LogLevel.ALL and LogLevel.NONE as smallest and biggest level.
- add warning as an alias of warn in ILogLevelImpl.
-
This commit is contained in:
A.C.Sukazyo Eyre 2023-04-08 12:06:36 +08:00
parent 31ccf14941
commit ab95aa71d7
Signed by: Eyre_S
GPG Key ID: C17CE40291207874
14 changed files with 229 additions and 48 deletions

1
.gitignore vendored
View File

@ -2,6 +2,7 @@
.idea/ .idea/
.gradle/ .gradle/
.settings/ .settings/
.vscode/
#build #build
/build/ /build/

View File

@ -4,19 +4,22 @@ plugins {
id 'maven-publish' id 'maven-publish'
} }
repositories {
mavenCentral()
}
group 'cc.sukazyo' group 'cc.sukazyo'
version PROJECT_VERSION version PROJECT_VERSION
project.ext.archiveBaseName = 'messiva' project.ext.archiveBaseName = 'messiva'
project.ext.artifactId = 'messiva' project.ext.artifactId = 'messiva'
repositories {
mavenCentral()
}
dependencies { dependencies {
compileOnlyApi "com.github.spotbugs:spotbugs-annotations:${libSpotbugsVersion}" compileOnlyApi "com.github.spotbugs:spotbugs-annotations:${libSpotbugsVersion}"
implementation "org.jline:jline:${libJLineVersion}"
implementation "org.fusesource.jansi:jansi:${libJansiVersion}"
testImplementation "org.junit.jupiter:junit-jupiter-api:${libJUnitVersion}" testImplementation "org.junit.jupiter:junit-jupiter-api:${libJUnitVersion}"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${libJUnitVersion}" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${libJUnitVersion}"
@ -35,11 +38,11 @@ java {
} }
tasks.withType(JavaCompile) { tasks.withType(JavaCompile).configureEach {
options.encoding = "UTF-8" options.encoding = "UTF-8"
} }
tasks.withType(Javadoc) { tasks.withType(Javadoc).configureEach {
options.encoding = 'UTF-8' options.encoding = 'UTF-8'
options.docEncoding = 'UTF-8' options.docEncoding = 'UTF-8'
options.charSet = 'UTF-8' options.charSet = 'UTF-8'

View File

@ -1,9 +1,12 @@
## Messiva ## Messiva
PROJECT_VERSION = 0.1.0.1 PROJECT_VERSION = 0.1.1
## dependencies ## dependencies
libSpotbugsVersion = 4.5.0 libSpotbugsVersion = 4.5.0
libJLineVersion = 3.21.0
libJansiVersion = 2.4.0
libJUnitVersion = 5.8.2 libJUnitVersion = 5.8.2

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -0,0 +1,26 @@
package cc.sukazyo.messiva.appender;
import cc.sukazyo.messiva.formatter.ILogFormatter;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public abstract class Appender implements IAppender {
@Nullable public ILogFormatter formatter;
public Appender (@Nullable ILogFormatter formatter) {
this.formatter = formatter;
}
public Appender () {
this(null);
}
@Nonnull
public Appender setFormatter (@Nullable ILogFormatter formatter) {
this.formatter = formatter;
return this;
}
}

View File

@ -0,0 +1,43 @@
package cc.sukazyo.messiva.appender;
import cc.sukazyo.messiva.component.LevelRestrictComponent;
import cc.sukazyo.messiva.formatter.ILogFormatter;
import cc.sukazyo.messiva.log.Log;
import cc.sukazyo.messiva.log.LogLevel;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public abstract class AppenderRestrictableByLevel extends Appender {
@Nonnull public LevelRestrictComponent levelSetting;
public AppenderRestrictableByLevel (@Nullable ILogFormatter formatter) {
super(formatter);
levelSetting = new LevelRestrictComponent();
}
public AppenderRestrictableByLevel () {
this(null);
}
@Nonnull
public AppenderRestrictableByLevel minLevel(@Nonnull LogLevel minLevel) {
levelSetting.minLevel(minLevel);
return this;
}
@Nonnull
public AppenderRestrictableByLevel maxLevel(@Nonnull LogLevel maxLevel) {
levelSetting.maxLevel(maxLevel);
return this;
}
public void pushLog (@Nonnull Log log) {
if (!levelSetting.checkLevel(log.level)) return;
pushLogChecked(log);
}
abstract public void pushLogChecked (@Nonnull Log log);
}

View File

@ -1,46 +1,32 @@
package cc.sukazyo.messiva.appender; package cc.sukazyo.messiva.appender;
import cc.sukazyo.messiva.formatter.ILogFormatter;
import cc.sukazyo.messiva.log.Log; import cc.sukazyo.messiva.log.Log;
import cc.sukazyo.messiva.utils.StringUtils; import cc.sukazyo.messiva.utils.StringUtils;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantLock;
public class ConsoleAppender implements IAppender { public class ConsoleAppender extends AppenderRestrictableByLevel {
private final ReentrantLock syncLock = new ReentrantLock(); @Nonnull private final ReentrantLock syncLock;
// private final AppendDaemon DAEMON; public ConsoleAppender (@Nullable ILogFormatter formatter) {
// private static class AppendDaemon extends Thread { super(formatter);
// public AppendDaemon () { this.setName("console-appender-daemon::" + UUID.randomUUID()); } syncLock = new ReentrantLock();
// @Override public void run () { }
//
// } public ConsoleAppender () {
// } this(null);
//
public ConsoleAppender() {
// DAEMON = new AppendDaemon();
// DAEMON.start();
} }
@Override @Override
public void pushLog (Log log) { public void pushLogChecked (@Nonnull Log log) {
if (formatter == null) return;
syncLock.lock(); syncLock.lock();
System.out.println(formatMessage(log)); System.out.println(formatter.format(log));
syncLock.unlock(); syncLock.unlock();
} }
private static String formatMessage (Log log) {
final StringBuilder message = new StringBuilder();
message.append('[').append(log.timestamp)
.append("][").append(log.thread.getName())
.append("]");
final String promptNewline = StringUtils.repeatChar('\'', message.length());
message.append('[').append(log.level.tag).append(']').append(log.message.message[0]);
for (int i = 1; i < log.message.message.length; i++) {
message.append('\n').append(promptNewline)
.append('[').append(log.level.tag).append(']').append(log.message.message[i]);
}
return message.toString();
}
} }

View File

@ -0,0 +1,51 @@
package cc.sukazyo.messiva.component;
import cc.sukazyo.messiva.log.LogLevel;
import javax.annotation.Nonnull;
public class LevelRestrictComponent {
@Nonnull private LogLevel minLevel;
@Nonnull private LogLevel maxLevel;
public LevelRestrictComponent (@Nonnull LogLevel minLevel, @Nonnull LogLevel maxLevel) {
this.minLevel = minLevel;
this.maxLevel = maxLevel;
}
public LevelRestrictComponent (@Nonnull LogLevel minLevel) {
this(minLevel, LogLevel.NONE);
}
public LevelRestrictComponent () {
this(LogLevel.ALL);
}
@Nonnull
public LevelRestrictComponent minLevel (@Nonnull LogLevel minLevel) {
this.minLevel = minLevel;
return this;
}
@Nonnull
public LevelRestrictComponent maxLevel (@Nonnull LogLevel maxLevel) {
this.maxLevel = maxLevel;
return this;
}
@Nonnull
public LogLevel minLevel () {
return this.minLevel;
}
@Nonnull
public LogLevel maxLevel () {
return this.maxLevel;
}
public boolean checkLevel (@Nonnull LogLevel level) {
return level.level >= minLevel.level && level.level <= maxLevel.level;
}
}

View File

@ -0,0 +1,12 @@
package cc.sukazyo.messiva.formatter;
import cc.sukazyo.messiva.log.Log;
import javax.annotation.Nonnull;
public interface ILogFormatter {
@Nonnull
String format(@Nonnull Log log);
}

View File

@ -0,0 +1,33 @@
package cc.sukazyo.messiva.formatter;
import cc.sukazyo.messiva.log.Log;
import cc.sukazyo.messiva.utils.StringUtils;
import javax.annotation.Nonnull;
public class SimpleFormatter implements ILogFormatter {
@Nonnull public String startTimestamp = "[";
@Nonnull public String endTimestamp = "]";
@Nonnull public String startThreadName = "[";
@Nonnull public String endThreadName = "]";
@Nonnull public String startLevelTag = "[";
@Nonnull public String endLevelTag = "]";
public char followingLineFillChar = '\'';
@Nonnull
@Override
public String format (@Nonnull Log log) {
final StringBuilder message = new StringBuilder();
message.append(startTimestamp).append(log.timestamp).append(endTimestamp)
.append(startThreadName).append(log.thread.getName()).append(endThreadName);
final String promptNewline = StringUtils.repeatChar(followingLineFillChar, message.length());
message.append(startLevelTag).append(log.level.tag).append(endLevelTag).append(log.message.message[0]);
for (int i = 1; i < log.message.message.length; i++) {
message.append('\n').append(promptNewline)
.append(startLevelTag).append(log.level.tag).append(endLevelTag).append(log.message.message[i]);
}
return message.toString();
}
}

View File

@ -10,6 +10,8 @@ public interface ILogLevelImpl {
void warn (String message); void warn (String message);
void warning (String message);
void error (String message); void error (String message);
void fatal (String message); void fatal (String message);

View File

@ -2,12 +2,14 @@ package cc.sukazyo.messiva.log;
public enum LogLevel { public enum LogLevel {
TRACE(-1f, "TRAC"), ALL (-Float.MAX_VALUE, "####"),
DEBUG(-0.1f, "DBUG"), TRACE(-1f, "TRAC"),
INFO(0f, "INFO"), DEBUG(-0.1f, "DBUG"),
WARN(0.5f, "WARN"), INFO (0f, "INFO"),
ERROR(1f, "ERRO"), WARN (0.5f, "WARN"),
FATAL(10f, "FTAL"); ERROR(1f, "ERRO"),
FATAL(10f, "FTAL"),
NONE(Float.MAX_VALUE, "!!!!");
public final float level; public final float level;
public final String tag; public final String tag;

View File

@ -5,7 +5,7 @@ public class Message {
public final String[] message; public final String[] message;
public Message(String message) { public Message(String message) {
this.message = message.split("\n"); this.message = message == null ? new String[]{} : message.split("\n");
} }
} }

View File

@ -1,25 +1,43 @@
package cc.sukazyo.messiva; package cc.sukazyo.messiva.logger;
import cc.sukazyo.messiva.component.LevelRestrictComponent;
import cc.sukazyo.messiva.appender.IAppender; import cc.sukazyo.messiva.appender.IAppender;
import cc.sukazyo.messiva.log.ILogLevelImpl; import cc.sukazyo.messiva.log.ILogLevelImpl;
import cc.sukazyo.messiva.log.Log; import cc.sukazyo.messiva.log.Log;
import cc.sukazyo.messiva.log.LogLevel; import cc.sukazyo.messiva.log.LogLevel;
import cc.sukazyo.messiva.log.Message; import cc.sukazyo.messiva.log.Message;
import javax.annotation.Nonnull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
public class Logger implements ILogLevelImpl { public class Logger implements ILogLevelImpl {
public final List<IAppender> appends = new ArrayList<>(); @Nonnull public final List<IAppender> appends;
public Logger () {} @Nonnull public LevelRestrictComponent levelSetting;
public Logger () {
levelSetting = new LevelRestrictComponent();
appends = new ArrayList<>();
}
public Logger (IAppender... appends) { public Logger (IAppender... appends) {
this();
this.appends.addAll(Arrays.asList(appends)); this.appends.addAll(Arrays.asList(appends));
} }
public Logger minLevel (@Nonnull LogLevel minLevel) {
levelSetting.minLevel(minLevel);
return this;
}
public Logger maxLevel (@Nonnull LogLevel maxLevel) {
levelSetting.maxLevel(maxLevel);
return this;
}
public void trace (String message) { public void trace (String message) {
pushToAllAppender(new Log(1, new Message(message), LogLevel.TRACE)); pushToAllAppender(new Log(1, new Message(message), LogLevel.TRACE));
} }
@ -48,7 +66,8 @@ public class Logger implements ILogLevelImpl {
pushToAllAppender(new Log(1, new Message(message), LogLevel.FATAL)); pushToAllAppender(new Log(1, new Message(message), LogLevel.FATAL));
} }
private void pushToAllAppender (Log log) { private void pushToAllAppender (@Nonnull Log log) {
if (!levelSetting.checkLevel(log.level)) return;
for (IAppender appender : appends) { for (IAppender appender : appends) {
appender.pushLog(log); appender.pushLog(log);
} }