Example: write directly to a file

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();