import static java.lang.System.out;
import static java.lang.System.err;
import java.time.LocalDateTime;
enum LogLevel { Debug, Info, Warning, Error, Fatal }
final class Logger
{
private static Logger instance = null;
public void debug(String message, Object ...format) {
logCommit(LogLevel.Info, message, format);
}
public void info(String message, Object ...format) {
logCommit(LogLevel.Info, message, format);
}
public void log(String message, Object ...format) {
logCommit(LogLevel.Info, message, format);
}
public void warning(String message, Object ...format) {
logCommit(LogLevel.Warning, message, format);
}
public void error(String message, Object ...format) {
logCommit(LogLevel.Error, message, format);
}
public void fatal(String message, Object ...format) {
logCommit(LogLevel.Fatal, message, format);
System.exit(1);
}
private void logCommit(LogLevel level, String message, Object ...format) {
var now = LocalDateTime.now();
var level_s = levelString(level);
message = message.format(message, format);
if (level == LogLevel.Warning || level == LogLevel.Error || level == LogLevel.Fatal) {
err.println(now.toString() + " [" + level_s + "] " + message);
} else {
out.println(now.toString() + " [" + level_s + "] " + message);
}
}
private static String levelString(LogLevel level) {
switch (level) {
case Debug: return "DEBG";
case Info: return "INFO";
case Warning: return "WARN";
case Error: return "EROR";
case Fatal: return "FATL";
default : return "????";
}
}
public static Logger getInstance() {
if (Logger.instance == null) {
Logger.instance = new Logger();
}
return Logger.instance;
}
}
class HelloWorld
{
static private final Logger logger = Logger.getInstance();
public static void main(String[] args) {
logger.log("Hello, %s!", "World");
logger.fatal("Stop with code 1");
logger.log("Hello, %s!", "World");
}
}