Search code examples
swiftloggingwritetofile

Writing to log file seems to overwrite previous save


As an exercise, I'm trying to write a logging class that logs strings to a text file. I've got my application to write and read from the file. However, if I try to log multiple times it seems to only pick up the most recent log.

Attempt

writing

private let file = "logfile.txt"

func write(text: String) {

    let path = getDocumentsDirectory()

    do {
        try text.writeToFile(path, atomically: false, encoding: NSUTF8StringEncoding)
    }
    catch let error {
        print("error: \n \(error)")
    }
}

reading

func read() {

    let path = getDocumentsDirectory()

    do {
        let text2 = try String(contentsOfFile: path, encoding: NSUTF8StringEncoding)

        print("From Log: \n \(text2)")
    }
    catch let error {
        print("error: \n \(error)")
    }


}

func getDocumentsDirectory() -> String {
    guard let dir : NSString = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first else {
        return ""
    }
    let documentsDirectory : String = dir.stringByAppendingPathComponent(file)
    return documentsDirectory
}

Result

When I try to read my file I only get the last line saved.

Question

If my goal is to endlessly append new logs to a file, and to read the log file in bulk. What changes to my code do I need to make?


more details:

I'm writing to the file on application load:

Logger.shared.write("instance one writes")
Logger.shared.write("instance one writes again")
Logger.shared.write("instance one writes yet again") 

and then attempting to read:

Logger.shared.read()

output:

From Log:
instance one writes yet again


Solution

  • The writeToFile(_:atomically:encoding:) method provided by Foundation replaces the contents of the given file. There are several ways of appending to files: