parent
e940c53dd6
commit
ebbcf50f74
@ -1,16 +0,0 @@ |
|||||||
package mightypork.rogue; |
|
||||||
|
|
||||||
|
|
||||||
import java.lang.Thread.UncaughtExceptionHandler; |
|
||||||
|
|
||||||
|
|
||||||
public class CrashHandler implements UncaughtExceptionHandler { |
|
||||||
|
|
||||||
@Override |
|
||||||
public void uncaughtException(Thread t, Throwable e) |
|
||||||
{ |
|
||||||
e.printStackTrace(); |
|
||||||
App.onCrash(e); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -0,0 +1,16 @@ |
|||||||
|
package mightypork.rogue; |
||||||
|
|
||||||
|
|
||||||
|
public class Main { |
||||||
|
|
||||||
|
/** |
||||||
|
* @param args |
||||||
|
*/ |
||||||
|
public static void main(String[] args) |
||||||
|
{ |
||||||
|
Config.init(); |
||||||
|
Config.save(); |
||||||
|
|
||||||
|
(new App()).start(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,125 @@ |
|||||||
|
package mightypork.utils.logging; |
||||||
|
|
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.FileFilter; |
||||||
|
import java.text.SimpleDateFormat; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.Comparator; |
||||||
|
import java.util.Date; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import mightypork.utils.files.FileUtils; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Logger that cleans directory & archives old logs |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
* @copy (c) 2014 |
||||||
|
*/ |
||||||
|
public class ArchivingLog extends SimpleLog { |
||||||
|
|
||||||
|
/** Number of old logs to keep */ |
||||||
|
private final int logs_to_keep; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Log |
||||||
|
* |
||||||
|
* @param name log name |
||||||
|
* @param file log file (in log directory) |
||||||
|
* @param oldLogCount number of old log files to keep: -1 all, 0 none. |
||||||
|
*/ |
||||||
|
public ArchivingLog(String name, File file, int oldLogCount) { |
||||||
|
super(name, file); |
||||||
|
this.logs_to_keep = oldLogCount; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Log, not keeping 5 last log files (default); |
||||||
|
* |
||||||
|
* @param name log name |
||||||
|
* @param file log file (in log directory) |
||||||
|
*/ |
||||||
|
public ArchivingLog(String name, File file) { |
||||||
|
super(name, file); |
||||||
|
this.logs_to_keep = 5; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void init() |
||||||
|
{ |
||||||
|
cleanLoggingDirectory(); |
||||||
|
|
||||||
|
super.init(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void cleanLoggingDirectory() |
||||||
|
{ |
||||||
|
if (logs_to_keep == 0) return; // overwrite
|
||||||
|
|
||||||
|
final File log_file = getFile(); |
||||||
|
final File log_dir = log_file.getParentFile(); |
||||||
|
final String fname = FileUtils.getBasename(log_file.toString()); |
||||||
|
|
||||||
|
// move old file
|
||||||
|
for (final File f : FileUtils.listDirectory(log_dir)) { |
||||||
|
if (!f.isFile()) continue; |
||||||
|
if (f.equals(getFile())) { |
||||||
|
|
||||||
|
final Date d = new Date(f.lastModified()); |
||||||
|
final String fbase = fname + '_' + (new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss")).format(d); |
||||||
|
final String suff = "." + getSuffix(); |
||||||
|
String cntStr = ""; |
||||||
|
File f2; |
||||||
|
|
||||||
|
for (int cnt = 0; (f2 = new File(log_dir, fbase + cntStr + suff)).exists(); cntStr = "_" + (++cnt)) {} |
||||||
|
|
||||||
|
f.renameTo(f2); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (logs_to_keep == -1) return; // keep all
|
||||||
|
|
||||||
|
final List<File> oldLogs = FileUtils.listDirectory(log_dir, new FileFilter() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean accept(File f) |
||||||
|
{ |
||||||
|
if (f.isDirectory()) return false; |
||||||
|
if (!f.getName().endsWith(getSuffix())) return false; |
||||||
|
if (!f.getName().startsWith(fname)) return false; |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
}); |
||||||
|
|
||||||
|
Collections.sort(oldLogs, new Comparator<File>() { |
||||||
|
|
||||||
|
@Override |
||||||
|
public int compare(File o1, File o2) |
||||||
|
{ |
||||||
|
return o1.getName().compareTo(o2.getName()); |
||||||
|
} |
||||||
|
}); |
||||||
|
|
||||||
|
// playing with fireee
|
||||||
|
for (int i = 0; i < oldLogs.size() - logs_to_keep; i++) { |
||||||
|
oldLogs.get(i).delete(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return log filename suffix |
||||||
|
*/ |
||||||
|
private String getSuffix() |
||||||
|
{ |
||||||
|
return FileUtils.getExtension(getFile()); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
package mightypork.utils.logging; |
||||||
|
|
||||||
|
|
||||||
|
import java.util.logging.Level; |
||||||
|
|
||||||
|
|
||||||
|
public abstract class BaseLogMonitor implements LogMonitor { |
||||||
|
|
||||||
|
private boolean enabled = true; |
||||||
|
private Level accepted = Level.ALL; |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void onMessageLogged(Level level, String message) |
||||||
|
{ |
||||||
|
if (!enabled) return; |
||||||
|
if (accepted.intValue() > level.intValue()) return; |
||||||
|
|
||||||
|
logMessage(level, message); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
protected abstract void logMessage(Level level, String message); |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void setLevel(Level level) |
||||||
|
{ |
||||||
|
this.accepted = level; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void enable(boolean flag) |
||||||
|
{ |
||||||
|
this.enabled = flag; |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -1,424 +0,0 @@ |
|||||||
package mightypork.utils.logging; |
|
||||||
|
|
||||||
|
|
||||||
import java.io.File; |
|
||||||
import java.io.FileFilter; |
|
||||||
import java.io.PrintWriter; |
|
||||||
import java.io.StringWriter; |
|
||||||
import java.text.SimpleDateFormat; |
|
||||||
import java.util.Collections; |
|
||||||
import java.util.Comparator; |
|
||||||
import java.util.Date; |
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.List; |
|
||||||
import java.util.logging.FileHandler; |
|
||||||
import java.util.logging.Formatter; |
|
||||||
import java.util.logging.Level; |
|
||||||
import java.util.logging.LogRecord; |
|
||||||
import java.util.logging.Logger; |
|
||||||
|
|
||||||
import mightypork.utils.files.FileUtils; |
|
||||||
import mightypork.utils.string.StringUtils; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Static logger class. |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
* @copy (c) 2014 |
|
||||||
*/ |
|
||||||
public class LogInstance { |
|
||||||
|
|
||||||
/** log file */ |
|
||||||
private final File file; |
|
||||||
|
|
||||||
/** Log name */ |
|
||||||
private final String name; |
|
||||||
|
|
||||||
/** Number of old logs to keep */ |
|
||||||
private final int logs_to_keep; |
|
||||||
|
|
||||||
/** Logs dir */ |
|
||||||
private final File log_dir; |
|
||||||
|
|
||||||
/** Logger instance. */ |
|
||||||
private Logger logger; |
|
||||||
|
|
||||||
/** Logging enabled */ |
|
||||||
private boolean enabled = true; |
|
||||||
|
|
||||||
private boolean sysout = true; |
|
||||||
|
|
||||||
private int monitorId = 0; |
|
||||||
private final HashMap<Integer, LogMonitor> monitors = new HashMap<>(); |
|
||||||
|
|
||||||
private LogToSysoutMonitor sysoutMonitor; |
|
||||||
|
|
||||||
private final long started_ms; |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Log |
|
||||||
* |
|
||||||
* @param name log name |
|
||||||
* @param dir log directory |
|
||||||
* @param oldLogCount number of old log files to keep: -1 all, 0 none. |
|
||||||
*/ |
|
||||||
public LogInstance(String name, File dir, int oldLogCount) { |
|
||||||
this.name = name; |
|
||||||
this.file = new File(dir, name + getSuffix()); |
|
||||||
this.log_dir = dir; |
|
||||||
this.logs_to_keep = oldLogCount; |
|
||||||
this.started_ms = System.currentTimeMillis(); |
|
||||||
|
|
||||||
init(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Prepare logs for logging |
|
||||||
*/ |
|
||||||
private void init() |
|
||||||
{ |
|
||||||
logger = Logger.getLogger(name); |
|
||||||
|
|
||||||
cleanLoggingDirectory(); |
|
||||||
|
|
||||||
FileHandler handler = null; |
|
||||||
|
|
||||||
try { |
|
||||||
handler = new FileHandler(file.getPath()); |
|
||||||
} catch (final Exception e) { |
|
||||||
throw new RuntimeException("Failed to init log", e); |
|
||||||
} |
|
||||||
|
|
||||||
handler.setFormatter(new LogFormatter()); |
|
||||||
logger.addHandler(handler); |
|
||||||
|
|
||||||
enabled = true; |
|
||||||
|
|
||||||
sysoutMonitor = new LogToSysoutMonitor(); |
|
||||||
|
|
||||||
addMonitor(sysoutMonitor); |
|
||||||
|
|
||||||
logger.setUseParentHandlers(false); |
|
||||||
logger.setLevel(Level.ALL); |
|
||||||
final String stamp = (new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(new Date()); |
|
||||||
i("Logger \"" + name + "\" initialized.\n" + stamp); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
private void cleanLoggingDirectory() |
|
||||||
{ |
|
||||||
if (logs_to_keep == 0) return; // overwrite
|
|
||||||
|
|
||||||
// move old file
|
|
||||||
for (final File f : FileUtils.listDirectory(file.getParentFile())) { |
|
||||||
if (!f.isFile()) continue; |
|
||||||
if (f.equals(file)) { |
|
||||||
|
|
||||||
final Date d = new Date(f.lastModified()); |
|
||||||
final String fbase = name + '_' + (new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss")).format(d); |
|
||||||
final String suff = getSuffix(); |
|
||||||
String cntStr = ""; |
|
||||||
File f2; |
|
||||||
|
|
||||||
for (int cnt = 0; (f2 = new File(log_dir, fbase + cntStr + suff)).exists(); cntStr = "_" + (++cnt)) {} |
|
||||||
|
|
||||||
f.renameTo(f2); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
if (logs_to_keep == -1) return; // keep all
|
|
||||||
|
|
||||||
final List<File> oldLogs = FileUtils.listDirectory(log_dir, new FileFilter() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public boolean accept(File f) |
|
||||||
{ |
|
||||||
if (f.isDirectory()) return false; |
|
||||||
if (!f.getName().endsWith(getSuffix())) return false; |
|
||||||
if (!f.getName().startsWith(name)) return false; |
|
||||||
|
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
}); |
|
||||||
|
|
||||||
Collections.sort(oldLogs, new Comparator<File>() { |
|
||||||
|
|
||||||
@Override |
|
||||||
public int compare(File o1, File o2) |
|
||||||
{ |
|
||||||
return o1.getName().compareTo(o2.getName()); |
|
||||||
} |
|
||||||
}); |
|
||||||
|
|
||||||
for (int i = 0; i < oldLogs.size() - logs_to_keep; i++) { |
|
||||||
oldLogs.get(i).delete(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Add log monitor |
|
||||||
* |
|
||||||
* @param mon monitor |
|
||||||
* @return assigned ID |
|
||||||
*/ |
|
||||||
public synchronized int addMonitor(LogMonitor mon) |
|
||||||
{ |
|
||||||
final int id = monitorId; |
|
||||||
monitorId++; |
|
||||||
monitors.put(id, mon); |
|
||||||
return id; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Remove a monitor by ID |
|
||||||
* |
|
||||||
* @param id monitor ID |
|
||||||
*/ |
|
||||||
public synchronized void removeMonitor(int id) |
|
||||||
{ |
|
||||||
monitors.remove(id); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public void setSysoutLevel(Level level) |
|
||||||
{ |
|
||||||
sysoutMonitor.setLevel(level); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public void setFileLevel(Level level) |
|
||||||
{ |
|
||||||
logger.setLevel(level); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Enable logging. |
|
||||||
* |
|
||||||
* @param flag do enable logging |
|
||||||
*/ |
|
||||||
public void enable(boolean flag) |
|
||||||
{ |
|
||||||
enabled = flag; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Enable printing logs to sysout |
|
||||||
* |
|
||||||
* @param flag do enable logging |
|
||||||
*/ |
|
||||||
public void enableSysout(boolean flag) |
|
||||||
{ |
|
||||||
sysout = flag; |
|
||||||
sysoutMonitor.enable(sysout); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public void log(Level level, String msg) |
|
||||||
{ |
|
||||||
if (enabled) { |
|
||||||
logger.log(level, msg); |
|
||||||
|
|
||||||
final String fmt = formatMessage(level, msg, null); |
|
||||||
|
|
||||||
for (final LogMonitor mon : monitors.values()) { |
|
||||||
mon.onMessageLogged(level, fmt); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public void log(Level level, String msg, Throwable t) |
|
||||||
{ |
|
||||||
if (enabled) { |
|
||||||
logger.log(level, msg, t); |
|
||||||
|
|
||||||
final String fmt = formatMessage(level, msg, t); |
|
||||||
|
|
||||||
for (final LogMonitor mon : monitors.values()) { |
|
||||||
mon.onMessageLogged(level, fmt); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Log FINE message |
|
||||||
* |
|
||||||
* @param msg message |
|
||||||
*/ |
|
||||||
public void f1(String msg) |
|
||||||
{ |
|
||||||
log(Level.FINE, msg); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Log FINER message |
|
||||||
* |
|
||||||
* @param msg message |
|
||||||
*/ |
|
||||||
public void f2(String msg) |
|
||||||
{ |
|
||||||
log(Level.FINER, msg); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Log FINEST message |
|
||||||
* |
|
||||||
* @param msg message |
|
||||||
*/ |
|
||||||
public void f3(String msg) |
|
||||||
{ |
|
||||||
log(Level.FINEST, msg); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Log INFO message |
|
||||||
* |
|
||||||
* @param msg message |
|
||||||
*/ |
|
||||||
public void i(String msg) |
|
||||||
{ |
|
||||||
log(Level.INFO, msg); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Log WARNING message (less severe than ERROR) |
|
||||||
* |
|
||||||
* @param msg message |
|
||||||
*/ |
|
||||||
public void w(String msg) |
|
||||||
{ |
|
||||||
log(Level.WARNING, msg); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Log ERROR message |
|
||||||
* |
|
||||||
* @param msg message |
|
||||||
*/ |
|
||||||
public void e(String msg) |
|
||||||
{ |
|
||||||
log(Level.SEVERE, msg); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Log THROWING message |
|
||||||
* |
|
||||||
* @param msg message |
|
||||||
* @param thrown thrown exception |
|
||||||
*/ |
|
||||||
public void e(String msg, Throwable thrown) |
|
||||||
{ |
|
||||||
log(Level.SEVERE, msg, thrown); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Log exception thrown |
|
||||||
* |
|
||||||
* @param thrown thrown exception |
|
||||||
*/ |
|
||||||
public void e(Throwable thrown) |
|
||||||
{ |
|
||||||
log(Level.SEVERE, null, thrown); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* PowerCraft Log file formatter. |
|
||||||
* |
|
||||||
* @author MightyPork |
|
||||||
* @copy (c) 2012 |
|
||||||
*/ |
|
||||||
private class LogFormatter extends Formatter { |
|
||||||
|
|
||||||
@Override |
|
||||||
public String format(LogRecord record) |
|
||||||
{ |
|
||||||
return LogInstance.this.formatMessage(record.getLevel(), record.getMessage(), record.getThrown()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* @return log filename suffix (incl. dot) |
|
||||||
*/ |
|
||||||
protected String getSuffix() |
|
||||||
{ |
|
||||||
return ".log"; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
private String formatMessage(Level level, String message, Throwable throwable) |
|
||||||
{ |
|
||||||
|
|
||||||
final String nl = System.getProperty("line.separator"); |
|
||||||
|
|
||||||
if (message.equals("\n")) { |
|
||||||
return nl; |
|
||||||
} |
|
||||||
|
|
||||||
if (message.charAt(0) == '\n') { |
|
||||||
message = nl + message.substring(1); |
|
||||||
} |
|
||||||
|
|
||||||
final long time_ms = (System.currentTimeMillis() - started_ms); |
|
||||||
final double time_s = time_ms / 1000D; |
|
||||||
final String time = String.format("%6.2f ", time_s); |
|
||||||
final String time_blank = StringUtils.repeat(" ", time.length()); |
|
||||||
|
|
||||||
String prefix = "[ ? ]"; |
|
||||||
|
|
||||||
if (level == Level.FINE) { |
|
||||||
prefix = "[ # ] "; |
|
||||||
} else if (level == Level.FINER) { |
|
||||||
prefix = "[ - ] "; |
|
||||||
} else if (level == Level.FINEST) { |
|
||||||
prefix = "[ ] "; |
|
||||||
} else if (level == Level.INFO) { |
|
||||||
prefix = "[ i ] "; |
|
||||||
} else if (level == Level.SEVERE) { |
|
||||||
prefix = "[!E!] "; |
|
||||||
} else if (level == Level.WARNING) { |
|
||||||
prefix = "[!W!] "; |
|
||||||
} |
|
||||||
|
|
||||||
message = time + prefix + message.replaceAll("\n", nl + time_blank + prefix) + nl; |
|
||||||
|
|
||||||
if (throwable != null) { |
|
||||||
message += getStackTrace(throwable); |
|
||||||
} |
|
||||||
|
|
||||||
return message; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* Get stack trace from throwable |
|
||||||
* |
|
||||||
* @param t |
|
||||||
* @return trace |
|
||||||
*/ |
|
||||||
private static String getStackTrace(Throwable t) |
|
||||||
{ |
|
||||||
final StringWriter sw = new StringWriter(); |
|
||||||
final PrintWriter pw = new PrintWriter(sw, true); |
|
||||||
t.printStackTrace(pw); |
|
||||||
pw.flush(); |
|
||||||
sw.flush(); |
|
||||||
return sw.toString(); |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,70 @@ |
|||||||
|
package mightypork.utils.logging; |
||||||
|
|
||||||
|
|
||||||
|
import java.util.logging.Level; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Log interface
|
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public interface LogWriter { |
||||||
|
|
||||||
|
/** |
||||||
|
* Prepare logs for logging |
||||||
|
*/ |
||||||
|
void init(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Add log monitor |
||||||
|
* |
||||||
|
* @param mon monitor |
||||||
|
*/ |
||||||
|
void addMonitor(LogMonitor mon); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Remove a monitor |
||||||
|
* |
||||||
|
* @param removed monitor to remove |
||||||
|
*/ |
||||||
|
void removeMonitor(LogMonitor removed); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set logging level |
||||||
|
* |
||||||
|
* @param level |
||||||
|
*/ |
||||||
|
void setLevel(Level level); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Enable logging. |
||||||
|
* |
||||||
|
* @param flag do enable logging |
||||||
|
*/ |
||||||
|
void enable(boolean flag); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Log a message |
||||||
|
* |
||||||
|
* @param level message level |
||||||
|
* @param msg message text |
||||||
|
*/ |
||||||
|
void log(Level level, String msg); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Log a message |
||||||
|
* |
||||||
|
* @param level message level |
||||||
|
* @param msg message text |
||||||
|
* @param t thrown exception |
||||||
|
*/ |
||||||
|
void log(Level level, String msg, Throwable t); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,251 @@ |
|||||||
|
package mightypork.utils.logging; |
||||||
|
|
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.text.SimpleDateFormat; |
||||||
|
import java.util.Date; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.logging.FileHandler; |
||||||
|
import java.util.logging.Formatter; |
||||||
|
import java.util.logging.Level; |
||||||
|
import java.util.logging.LogRecord; |
||||||
|
import java.util.logging.Logger; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Basic logger |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public class SimpleLog implements LogWriter { |
||||||
|
|
||||||
|
/** |
||||||
|
* Log file formatter. |
||||||
|
*/ |
||||||
|
class LogFormatter extends Formatter { |
||||||
|
|
||||||
|
@Override |
||||||
|
public String format(LogRecord record) |
||||||
|
{ |
||||||
|
return Log.formatMessage(record.getLevel(), record.getMessage(), record.getThrown(), started_ms); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** Log file */ |
||||||
|
private final File file; |
||||||
|
|
||||||
|
/** Log name */ |
||||||
|
private final String name; |
||||||
|
|
||||||
|
/** Logger instance. */ |
||||||
|
private Logger logger; |
||||||
|
|
||||||
|
private boolean enabled = true; |
||||||
|
private final HashSet<LogMonitor> monitors = new HashSet<>(); |
||||||
|
private final long started_ms; |
||||||
|
|
||||||
|
|
||||||
|
public SimpleLog(String name, File file) { |
||||||
|
this.name = name; |
||||||
|
this.file = file; |
||||||
|
this.started_ms = System.currentTimeMillis(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void init() |
||||||
|
{ |
||||||
|
logger = Logger.getLogger(getName()); |
||||||
|
|
||||||
|
FileHandler handler = null; |
||||||
|
try { |
||||||
|
handler = new FileHandler(getFile().getPath()); |
||||||
|
} catch (final Exception e) { |
||||||
|
throw new RuntimeException("Failed to init log.", e); |
||||||
|
} |
||||||
|
|
||||||
|
handler.setFormatter(new LogFormatter()); |
||||||
|
logger.addHandler(handler); |
||||||
|
logger.setUseParentHandlers(false); |
||||||
|
logger.setLevel(Level.ALL); |
||||||
|
|
||||||
|
printHeader(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
protected void printHeader() |
||||||
|
{ |
||||||
|
final String stamp = (new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(new Date()); |
||||||
|
i("Logger \"" + getName() + "\" initialized.\n" + stamp); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Add log monitor |
||||||
|
* |
||||||
|
* @param mon monitor |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public synchronized void addMonitor(LogMonitor mon) |
||||||
|
{ |
||||||
|
monitors.add(mon); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Remove a monitor |
||||||
|
* |
||||||
|
* @param removed monitor to remove |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public synchronized void removeMonitor(LogMonitor removed) |
||||||
|
{ |
||||||
|
monitors.remove(removed); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void setLevel(Level level) |
||||||
|
{ |
||||||
|
logger.setLevel(level); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void enable(boolean flag) |
||||||
|
{ |
||||||
|
enabled = flag; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public File getFile() |
||||||
|
{ |
||||||
|
return file; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
public String getName() |
||||||
|
{ |
||||||
|
return name; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void log(Level level, String msg) |
||||||
|
{ |
||||||
|
if (enabled) { |
||||||
|
logger.log(level, msg); |
||||||
|
|
||||||
|
final String fmt = Log.formatMessage(level, msg, null, started_ms); |
||||||
|
|
||||||
|
for (final LogMonitor mon : monitors) { |
||||||
|
mon.onMessageLogged(level, fmt); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void log(Level level, String msg, Throwable t) |
||||||
|
{ |
||||||
|
if (enabled) { |
||||||
|
logger.log(level, msg, t); |
||||||
|
|
||||||
|
final String fmt = Log.formatMessage(level, msg, t, started_ms); |
||||||
|
|
||||||
|
for (final LogMonitor mon : monitors) { |
||||||
|
mon.onMessageLogged(level, fmt); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Log FINE message |
||||||
|
* |
||||||
|
* @param msg message |
||||||
|
*/ |
||||||
|
public void f1(String msg) |
||||||
|
{ |
||||||
|
log(Level.FINE, msg); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Log FINER message |
||||||
|
* |
||||||
|
* @param msg message |
||||||
|
*/ |
||||||
|
public void f2(String msg) |
||||||
|
{ |
||||||
|
log(Level.FINER, msg); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Log FINEST message |
||||||
|
* |
||||||
|
* @param msg message |
||||||
|
*/ |
||||||
|
public void f3(String msg) |
||||||
|
{ |
||||||
|
log(Level.FINEST, msg); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Log INFO message |
||||||
|
* |
||||||
|
* @param msg message |
||||||
|
*/ |
||||||
|
public void i(String msg) |
||||||
|
{ |
||||||
|
log(Level.INFO, msg); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Log WARNING message (less severe than ERROR) |
||||||
|
* |
||||||
|
* @param msg message |
||||||
|
*/ |
||||||
|
public void w(String msg) |
||||||
|
{ |
||||||
|
log(Level.WARNING, msg); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Log ERROR message |
||||||
|
* |
||||||
|
* @param msg message |
||||||
|
*/ |
||||||
|
public void e(String msg) |
||||||
|
{ |
||||||
|
log(Level.SEVERE, msg); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Log THROWING message |
||||||
|
* |
||||||
|
* @param msg message |
||||||
|
* @param thrown thrown exception |
||||||
|
*/ |
||||||
|
public void e(String msg, Throwable thrown) |
||||||
|
{ |
||||||
|
log(Level.SEVERE, msg, thrown); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Log exception thrown |
||||||
|
* |
||||||
|
* @param thrown thrown exception |
||||||
|
*/ |
||||||
|
public void e(Throwable thrown) |
||||||
|
{ |
||||||
|
log(Level.SEVERE, null, thrown); |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue