It's often useful to be able to write directly to a file in the file system. Here's a simple example of how to write a JSON object to file, without opening/closing the file every time.
// We don't want to open and close the file for every query, so we store the writer in the
// connection context
if ( ! context.filterContext.logFile) {
let FileWriter = Java.type("java.io.FileWriter");
let BufferedWriter = Java.type("java.io.BufferedWriter");
context.filterContext.logFile = new BufferedWriter(new FileWriter("/tmp/GalliumFilter.log", true));
}
let evt = {
date: new Date(),
eventType: "query",
text: context.packet.query
};
context.filterContext.logFile.write(JSON.stringify(evt) + "\n");
context.filterContext.logFile.flush();
If you want to have a rolling log, where a new file is created every day (could easily be changed to every hour, or whatever):
// Check whether we need to open a new log file
let now = new Date();
let today = now.getFullYear() + "-" + ("0"+(now.getMonth()+1)).slice(-2) + "-" + ("0" + now.getDate()).slice(-2);
if (today !== context.filterContext.logFileDate) {
if (context.filterContext.logFile) {
try {
context.filterContext.logFile.close();
}
catch(e) {
// Ignore
}
context.filterContext.logFile = null;
}
}
// Open the log file if necessary
if ( ! context.filterContext.logFile) {
let FileWriter = Java.type("java.io.FileWriter");
let BufferedWriter = Java.type("java.io.BufferedWriter");
context.filterContext.logFile = new BufferedWriter(new FileWriter("/tmp/GalliumFilter-" + today + ".log", true));
context.filterContext.logFileDate = today;
}
// Write something to the log file
let evt = {
date: new Date(),
eventType: "query",
text: context.packet.query
};
context.filterContext.logFile.write(JSON.stringify(evt) + "\n");
context.filterContext.logFile.flush();