mirror of
https://github.com/suk-ws/messiva.git
synced 2024-11-22 07:04: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:
parent
31ccf14941
commit
ab95aa71d7
1
.gitignore
vendored
1
.gitignore
vendored
@ -2,6 +2,7 @@
|
||||
.idea/
|
||||
.gradle/
|
||||
.settings/
|
||||
.vscode/
|
||||
|
||||
#build
|
||||
/build/
|
||||
|
15
build.gradle
15
build.gradle
@ -4,19 +4,22 @@ plugins {
|
||||
id 'maven-publish'
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
group 'cc.sukazyo'
|
||||
version PROJECT_VERSION
|
||||
project.ext.archiveBaseName = 'messiva'
|
||||
project.ext.artifactId = 'messiva'
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
|
||||
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}"
|
||||
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${libJUnitVersion}"
|
||||
|
||||
@ -35,11 +38,11 @@ java {
|
||||
|
||||
}
|
||||
|
||||
tasks.withType(JavaCompile) {
|
||||
tasks.withType(JavaCompile).configureEach {
|
||||
options.encoding = "UTF-8"
|
||||
}
|
||||
|
||||
tasks.withType(Javadoc) {
|
||||
tasks.withType(Javadoc).configureEach {
|
||||
options.encoding = 'UTF-8'
|
||||
options.docEncoding = 'UTF-8'
|
||||
options.charSet = 'UTF-8'
|
||||
|
@ -1,9 +1,12 @@
|
||||
## Messiva
|
||||
|
||||
PROJECT_VERSION = 0.1.0.1
|
||||
PROJECT_VERSION = 0.1.1
|
||||
|
||||
## dependencies
|
||||
|
||||
libSpotbugsVersion = 4.5.0
|
||||
|
||||
libJLineVersion = 3.21.0
|
||||
libJansiVersion = 2.4.0
|
||||
|
||||
libJUnitVersion = 5.8.2
|
||||
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,5 +1,5 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
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
|
||||
zipStorePath=wrapper/dists
|
||||
|
26
src/main/java/cc/sukazyo/messiva/appender/Appender.java
Normal file
26
src/main/java/cc/sukazyo/messiva/appender/Appender.java
Normal 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;
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
|
||||
}
|
@ -1,46 +1,32 @@
|
||||
package cc.sukazyo.messiva.appender;
|
||||
|
||||
import cc.sukazyo.messiva.formatter.ILogFormatter;
|
||||
import cc.sukazyo.messiva.log.Log;
|
||||
import cc.sukazyo.messiva.utils.StringUtils;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import javax.annotation.Nullable;
|
||||
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;
|
||||
// private static class AppendDaemon extends Thread {
|
||||
// public AppendDaemon () { this.setName("console-appender-daemon::" + UUID.randomUUID()); }
|
||||
// @Override public void run () {
|
||||
//
|
||||
// }
|
||||
// }
|
||||
//
|
||||
public ConsoleAppender() {
|
||||
// DAEMON = new AppendDaemon();
|
||||
// DAEMON.start();
|
||||
public ConsoleAppender (@Nullable ILogFormatter formatter) {
|
||||
super(formatter);
|
||||
syncLock = new ReentrantLock();
|
||||
}
|
||||
|
||||
public ConsoleAppender () {
|
||||
this(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void pushLog (Log log) {
|
||||
public void pushLogChecked (@Nonnull Log log) {
|
||||
if (formatter == null) return;
|
||||
syncLock.lock();
|
||||
System.out.println(formatMessage(log));
|
||||
System.out.println(formatter.format(log));
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
|
||||
}
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
@ -10,6 +10,8 @@ public interface ILogLevelImpl {
|
||||
|
||||
void warn (String message);
|
||||
|
||||
void warning (String message);
|
||||
|
||||
void error (String message);
|
||||
|
||||
void fatal (String message);
|
||||
|
@ -2,12 +2,14 @@ package cc.sukazyo.messiva.log;
|
||||
|
||||
public enum LogLevel {
|
||||
|
||||
TRACE(-1f, "TRAC"),
|
||||
DEBUG(-0.1f, "DBUG"),
|
||||
INFO(0f, "INFO"),
|
||||
WARN(0.5f, "WARN"),
|
||||
ERROR(1f, "ERRO"),
|
||||
FATAL(10f, "FTAL");
|
||||
ALL (-Float.MAX_VALUE, "####"),
|
||||
TRACE(-1f, "TRAC"),
|
||||
DEBUG(-0.1f, "DBUG"),
|
||||
INFO (0f, "INFO"),
|
||||
WARN (0.5f, "WARN"),
|
||||
ERROR(1f, "ERRO"),
|
||||
FATAL(10f, "FTAL"),
|
||||
NONE(Float.MAX_VALUE, "!!!!");
|
||||
|
||||
public final float level;
|
||||
public final String tag;
|
||||
|
@ -5,7 +5,7 @@ public class Message {
|
||||
public final String[] message;
|
||||
|
||||
public Message(String message) {
|
||||
this.message = message.split("\n");
|
||||
this.message = message == null ? new String[]{} : message.split("\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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.log.ILogLevelImpl;
|
||||
import cc.sukazyo.messiva.log.Log;
|
||||
import cc.sukazyo.messiva.log.LogLevel;
|
||||
import cc.sukazyo.messiva.log.Message;
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
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) {
|
||||
this();
|
||||
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) {
|
||||
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));
|
||||
}
|
||||
|
||||
private void pushToAllAppender (Log log) {
|
||||
private void pushToAllAppender (@Nonnull Log log) {
|
||||
if (!levelSetting.checkLevel(log.level)) return;
|
||||
for (IAppender appender : appends) {
|
||||
appender.pushLog(log);
|
||||
}
|
Loading…
Reference in New Issue
Block a user