JavaScript Node.js: Inhalt einer Datei darstellen - Aktualisierung nach Änderung der Datei

kamanu

Lt. Commander
Registriert
März 2012
Beiträge
1.663
Hallo zusammen,

ich versuche grad ein Log-File als Website darzustellen. Das klappt soweit bisher auch. Inklusive Bereinigung des Logs um die Übersichtlichkeit zu erhöhen.
Nun müsste ich aber jedes Mal wenn sich im Log was ändert quasi den Webserver neustarten. Das ist natürlich keine wirkliche Lösung. Sonderlich viel Ahnung von Javascript und Node.js habe ich (noch) nicht und vermute es geht verhältnismäßig einfach.
Aber hier erstmal mein Code:
Javascript:
var http = require("http");
var lines = [];
var fs = require("fs");
var filePath = "debug.log";

//Reads file and splits into lines
var text = fs.readFileSync(filePath).toString("utf-8");
var lines = text.split("\n");
//Neues Array für die Zeilen, die nachher gesäubert werden
var filteredLines = [];

aufhuebschen();
startWebServerAndShowList();

//Startet den Webserver
function startWebServerAndShowList(){
    http.createServer(function(req, res){
        writeWebsite(req, res);
    }).listen(8080);
}
//Schreibt den Inhalt der Website
function writeWebsite(req, res){
    res.writeHead(200, {'Content-Type': 'text/html'});
    filteredLines.forEach(function(entry){
        res.write(entry + "<br>");
    });
    res.end();
}
//Überprüft wann das Log-File zuletzt geändert wurde. Wird allerdings noch nicht genutzt.
function checkLastModified(){
    mtime = fs.statSync(filePath).mtime;
    console.log(mtime);   
}
//Entfernt nicht relevante Zeilen
function checkRelevance(line){
    if(line.includes("IN:", 20) && (line.includes("2015") || line.includes("2017") || line.includes("2018") || line.includes("2019") || line.includes("2020")))
        return true;
    else if(line.includes("OUT:", 20) && (line.includes("2015") || line.includes("2017") || line.includes("2018") || line.includes("2019") || line.includes("2020")))
        return true;
    else if(line.includes("TIMESTAMP:", 20))
        return true;
    else
        return false
}
//Entfernt Zeugs aus den übrigen Zeilen, dass nicht wirklich relevant ist.
function aufhuebschen(){
    lines.reverse();
    filteredLines = lines.filter(checkRelevance); //Nur noch IN & OUT
    for(i = 0; i < filteredLines.length; i++){ //Generelles Säubern
        filteredLines[i] = filteredLines[i].replace("(bliblablub)", "")
    }
}

Ich vermute mal, dass der Code selbst schon nicht sonderlich optimal ist. Wenn also dazu jemand noch Verbesserungsvorschläge hat, sind die gern gesehen. Priorität hätte für mich allerdings erstmal, dass aktualisieren des Inhalts der Website bei Änderung des Logs.

Gruß

kamanu
 
Ohne mit den Code jetzt genauer angesehen zu haben:

Javascript:
fs.watch('./debug.log', {}, (eventType, filename) => {
    if (filename) {
        console.log(filename);
    }
});

Damit hast du einen File-Watcher der dich bei einer Änderung einer Datei informiert.
 
  • Gefällt mir
Reaktionen: kamanu
in dem von Hoo erwähneten fs.watch das File bei Änderung neu lesen, aufbereiten und in eine Variable schreiben (wenn nicht zu Groß)
und im writeWebsite() den content zurückgeben. das wäre die Ram lastigere variante.

Alternativ könnte man auch bei jedem Request bei writeWebsite() das File auslesen, aufbereiten und direkt zurückgeben. das wäre dann vom i/O her aufwändiger.
 
  • Gefällt mir
Reaktionen: kamanu
Danke ihr beiden :)
Hab erstmal die Variante von @Hooo genutzt. Deine Variante probiere ich die Tage mal aus @Rayderick :)
 
Zurück
Oben