You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
2.9 KiB
165 lines
2.9 KiB
package mightypork.utils.logging.writers;
|
|
|
|
|
|
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;
|
|
|
|
import mightypork.utils.logging.Log;
|
|
import mightypork.utils.logging.monitors.LogMonitor;
|
|
|
|
|
|
/**
|
|
* Basic logger
|
|
*
|
|
* @author Ondřej Hruška (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 Throwable t) {
|
|
throw new RuntimeException("Failed to init log.", t);
|
|
}
|
|
|
|
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());
|
|
log(Level.INFO, "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);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
|