package org.araqne.logdb.query.command;
import java.util.List;
import java.util.Map;
import org.araqne.log.api.Log;
import org.araqne.log.api.LogPipe;
import org.araqne.log.api.LoggerRegistry;
import org.araqne.logdb.DriverQueryCommand;
import org.araqne.logdb.QueryStopReason;
import org.araqne.logdb.Row;
import org.araqne.logdb.RowBatch;
import org.araqne.logdb.Strings;
import org.araqne.logdb.TimeSpan;
public class Logger extends DriverQueryCommand implements LogPipe {
private LoggerRegistry loggerRegistry;
private TimeSpan window;
private List<String> loggerNames;
private volatile boolean stopped = false;
public Logger(LoggerRegistry loggerRegistry, TimeSpan window, List<String> loggerNames) {
this.loggerRegistry = loggerRegistry;
this.window = window;
this.loggerNames = loggerNames;
}
@Override
public String getName() {
return "logger";
}
public void run() {
try {
for (String name : loggerNames) {
org.araqne.log.api.Logger logger = loggerRegistry.getLogger(name);
if (logger != null)
logger.addLogPipe(this);
}
long expire = System.currentTimeMillis() + window.amount * window.unit.getMillis();
while (true) {
if (System.currentTimeMillis() >= expire)
break;
if (stopped)
break;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
}
}
} finally {
for (String name : loggerNames) {
org.araqne.log.api.Logger logger = loggerRegistry.getLogger(name);
if (logger != null)
logger.removeLogPipe(this);
}
}
}
@Override
public void onLog(org.araqne.log.api.Logger logger, Log log) {
Map<String, Object> m = Row.clone(log.getParams());
m.put("_logger", logger.getFullName());
m.put("_time", log.getDate());
pushPipe(new Row(m));
}
@Override
public void onLogBatch(org.araqne.log.api.Logger logger, Log[] logs) {
int count = 0;
for (Log log : logs) {
if (log != null)
count++;
}
Row[] rows = new Row[count];
int i = 0;
for (Log log : logs) {
if (log != null) {
Map<String, Object> m = Row.clone(log.getParams());
m.put("_logger", logger.getFullName());
m.put("_time", log.getDate());
rows[i++] = new Row(m);
}
}
RowBatch rowBatch = new RowBatch();
rowBatch.rows = rows;
rowBatch.size = count;
pushPipe(rowBatch);
}
@Override
public void onClose(QueryStopReason reason) {
stopped = true;
}
@Override
public String toString() {
return "logger window=" + window + " " + Strings.join(loggerNames, ", ");
}
}