ikemuc
ikemuc

Reputation: 43

XCGLogger 3.0 doesn't write logfile to filesystem (iOS 9)

I want to use XCGLogger 3.0 to do the logging in an iOS9 app written in Swift 2. In the AppDelegate, I define

let log = XCGLogger.defaultInstance() 

and in application:didFinishLaunchingWithOptions I do the setup with:

log.setup(.Debug, showThreadName: true, showLogLevel: true, showFileNames: true, showLineNumbers: true, writeToFile: "/tmp/app.log", fileLogLevel: .Debug)

When I start the app in the simulator I see the output of XCGLogger in the console of XCode 7. The output is:

2015-11-04 18:28:40.798 [Info] > myapp Version: 1.0 Build: 1 PID: 49243

2015-11-04 18:28:40.798 [Info] > XCGLogger Version: 3.0 - LogLevel: Debug

2015-11-04 18:28:40.801 [Info] > XCGLogger writing to log to: file:///tmp/app.log

But when I look at the sandbox filesystem of the correct simulator instance (using SimPholders2), there is no logfile app.log.

It's even worse when I start the app on my IPhone 6. The output in the XCode console is:

2015-11-04 18:36:14.692 [Error] > Attempt to open log file for writing failed: The operation couldn’t be completed. (Cocoa error 2.)

I also tried different pathes like "/tmp/app.log", "Library/Caches/de.myidentifier.myapp/app.log", "/Library/Caches/de.myidentifier.myapp/app.log" etc. but without success...

What am I doing wrong?

Upvotes: 3

Views: 1816

Answers (2)

Kristaps Grinbergs
Kristaps Grinbergs

Reputation: 352

If someone needs here is Swift 4 version of Dave Wood's example. And thank you for XCGLogger, it's a great tool.

let cacheDirectory: URL = {
    let urls = FileManager.default.urls(for: .cachesDirectory, in: .userDomainMask)
    return urls[urls.endIndex - 1]
}()

let logPath = cacheDirectory.appendingPathComponent("app.log")

let fileDestination = FileDestination(writeToFile: logPath, identifier: "testLogger.fileDestination", shouldAppend: true)

Upvotes: 2

Dave Wood
Dave Wood

Reputation: 13333

On iOS, you can't just write to the /tmp folder. You need to ensure the path is in the application's sandbox.

To do that, you need to ask the system for your cache directory. The sample app in XCGLogger includes the code to do that, but I'll include it here as well.

Try this:

let cacheDirectory: NSURL = {
    let urls = NSFileManager.defaultManager().URLsForDirectory(.CachesDirectory, inDomains: .UserDomainMask)
    return urls[urls.endIndex - 1] 
}()
let logPath: NSURL = cacheDirectory.URLByAppendingPathComponent("app.log")
log.setup(.Debug, showThreadName: true, showLogLevel: true, showFileNames: true, showLineNumbers: true, writeToFile: logPath, fileLogLevel: .Debug)

Upvotes: 12

Related Questions