2015-03-04 3 views
4

Есть ли возможность создать пользовательскую функцию журнала?Swift: format console-log

Это как Println по умолчанию ("привет мир") выглядит следующим образом:

2015-03-04 18:33:55.788 MyApp[12345:671253923] Hello World 

Я хотел бы вывести что-то вроде:

18:33 MyClass > myFunc [line 1] Hello World 
+0

Вы можете проверить этот код библиотеки https://github.com/goktugyil/QorumLogs – Thellimist

ответ

1

Во-первых, на время вы можете получить текущие часы и минуты в виде строки:

func printTime()->String{ 
     let date = NSDate() 
     let calendar = NSCalendar.currentCalendar() 
     let components = calendar.components(.CalendarUnitHour | .CalendarUnitMinute, fromDate: date) 
     let hour = components.hour 
     let minutes = components.minute 

     return "\(hour):\(minutes)" 
} 

И для функции и т.д. Вы можете использовать Swift Literal Expressions__FILE__, __FUNCTION__ и __LINE__.

Но вы не хотите устанавливать его каждый раз, когда вы хотите регистрироваться. Таким образом, вы могли бы сделать что-то вроде этого:

func prettyPrint(print: String, file:String = __FILE__, functionName: String = __FUNCTION__, line:Int = __LINE__) { 
    println("\(printTime()) \(file) > \(functionName) [line \(line)] \(print)") 

} 

Вы называете prettyPrint так:

prettyPrint("hey") 

И вы получите следующий результат:

/Path/To/Your/File/MyClass.swift > hello [line 81] hey 

Но, как вы хотите, только имя вашего класса, вы можете удалить путь со следующей функцией:

func getFile(path:String = __FILE__)->String{ 
    var parts = path.componentsSeparatedByString("/") 
    return parts[parts.count-1] 
} 

Или, как ChikabuZ говорил в своем ответе вы можете непосредственно проверить класс:

let className = NSStringFromClass(self.classForCoder).pathExtension 

Окончательная функция

А вот конечная функция (ы):

func getFile(path:String = __FILE__)->String{ 
    var parts = path.componentsSeparatedByString("/") 
    return parts[parts.count-1] 
} 
func prettyPrint(print: String, functionName: String = __FUNCTION__, line:Int = __LINE__) { 
    println("\(printTime()) \(getFile()) > \(functionName) [line \(line)] \(print)") 

} 

func printTime()->String{ 
    let date = NSDate() 
    let calendar = NSCalendar.currentCalendar() 
    let components = calendar.components(.CalendarUnitHour | .CalendarUnitMinute, fromDate: date) 
    let hour = components.hour 
    let minutes = components.minute 

    return "\(hour):\(minutes)" 
} 

И результатом будет:

MyClass.swift > hello [line 81] hey 

Вы также должны отметить ответ @ emaloney на этот вопрос. В частности, что

Решения на основе решений приводят к тому, что выходные данные записываются в Системный журнал (ASL).

В идеале переход к NSLog или полномасштабная система регистрации

+0

Чем вы так много !!! Это именно то, что я искал! – Michael

1

Вы должны сделать пристройку к NSObject, что-то например:

class MyClass: NSObject 
{ 
    func myFunc() 
    { 
     myPrint("Hello World") 
    } 

} 

extension NSObject 
{ 
    func myPrint(text: String) 
    { 
     let timeFormatter = NSDateFormatter() 
     timeFormatter.dateStyle = NSDateFormatterStyle.NoStyle 
     timeFormatter.timeStyle = NSDateFormatterStyle.ShortStyle 
     let time = timeFormatter.stringFromDate(NSDate()) 

     let className = NSStringFromClass(self.classForCoder).pathExtension 
     let function = __FUNCTION__ 

     let line = "\(__LINE__)" 

     let result = time + " " + className + " > " + function + " " + line + " " + text 
     println(result) 
    } 
} 

let myClass = MyClass() 

myClass.myFunc() 
1

К сожалению, ни один из println() -На решений не приведет к выходу, захваченные Apple, System Log (ASL).

ASL - это средство ведения журнала, предоставляемое Mac OS и iOS, которое используется NSLog() (а на Mac видно через приложение консоли).Поскольку NSLog() использует ASL, записи журнала, записанные NSLog(), будут видны через консоль устройства. Сообщения, записанные через println(), не будут записываться в ASL и, как результат, не дают возможности вернуться на консоль для диагностических целей после того, как что-то произошло.

Есть два больших недостатка NSLog(), однако: (1) вы не можете настроить выходной формат и (2) он много работает над вызывающим потоком и поэтому может негативно повлиять на производительность.

CleanroomLogger is a new Swift-based open-source API for logging. Если вы знакомы с log4j или CocoaLumberjack, тогда вы поймете CleanroomLogger.

Вы можете настроить свой собственный формат вывода, предоставив свою собственную реализацию LogFormatter, чтобы ваши сообщения журнала были отформатированы именно так, как вы хотите.

Для получения дополнительной информации о CleanroomLogger, посетите the GitHub project page.

+0

Собираетесь ли вы добавить цвет в вывод журнала консоли? –

+0

Это должно быть свернуто в принятый ответ. –