CocoaLumberjack Динамическая регистрация в Swift
Я пытаюсь использовать CocoaLumberjack в Swift. Использование модуля 'CocoaLumberjack/Swift'
В объективной C I сделать следующее
int ddLogLevel = DDLogLevelOff;
@implementation CLDDLoglevel
+ (int)ddLogLevel
{
return ddLogLevel;
}
+ (void)setLogLevel:(int)logLevel
{
ddLogLevel = logLevel;
}
В Swift я не понимаю как это сделать
Я сделал класс, который реализовал DDRegisteredDynamicLogging
Это дает мне два метода
static func ddLogLevel() -> DDLogLevel {
}
static func ddSetLogLevel(level: DDLogLevel) {
}
Однако мне все еще неясно, где и как объявить DDLogLevel для установки и получения.
Эквивалент int ddLogLevel = DDLogLevelOff;
Я старался
static var ddLogLevel: DDLogLevel = defaultDebugLevel
2 ответа
Это не идеально, но я заставил это работать для CocoaLumberjack 2.2.0 следующим образом:
Добавьте следующее к вашему классу:
static var ddLogLevel: DDLogLevel = .Off static func ddSetLogLevel(level: DDLogLevel) { ddLogLevel = level }
Это гарантирует, что CocoaLumberjack идентифицирует ваш класс как зарегистрированный для целей ведения журнала и позволит вам изменить его уровень ведения журнала во время выполнения.
При регистрации используйте, например,
DDLogWarn("Danger, Will Robinson", level: self.dynamicType.ddLogLevel)
level
параметр имеет решающее значение. Без этого сообщение всегда будет зарегистрировано.
Я надеюсь, что поддержка Swift от CocoaLumberjack повзрослеет и устранит эти камни преткновения. До тех пор, счастливого входа!
Для тех, кто все еще ищет простой способ динамического изменения уровней ведения журнала в Swift, просто используйте dynamicLogLevel
в любое время. Например:
dynamicLogLevel = .info
Другое решение доступно в этом обсуждении. Это работает для меня на данный момент, и я экспериментирую с этим.
Вы должны принять UnitDDLoggable
определяя
var logPrefix = ""
var logLevel = DDLogLevel.Debug
Это позволяет просто написать:
DDLogWarn("Danger, Will Robinson"
Код для Swift 2.3:
import CocoaLumberjackSwift
/// Base protocol for unit specific logging. Generally you won't implement this protocol directly, you will
/// implement one of the protocols that inherit from it
protocol UnitLoggable {
/// Prefix to append to each log line, should include a trailing space to separate it from the log message
var logPrefix:String { get }
}
/// Implment this protocol to use CocoaLumberjack logging with the level controlable at the file level
protocol UnitDDLoggable : UnitLoggable {
/// Lumberjack log level to use for this code unit, Lumberjack log calls in this unit will use this level
/// not the default log level, to use the shared lumberjack level this property should return defaultDebugLevel
var logLevel:DDLogLevel { get }
}
extension UnitDDLoggable {
final func DDLogDebug(@autoclosure logText: () -> String, context: Int = 0, file: StaticString = #file, function: StaticString = #function, line: UInt = #line, tag: AnyObject? = nil, asynchronous async: Bool = true) {
SwiftLogMacro(async, level: logLevel, flag: .Debug, context: context, file: file, function: function, line: line, tag: tag, string: logPrefix + logText())
}
final func DDLogInfo(@autoclosure logText: () -> String, context: Int = 0, file: StaticString = #file, function: StaticString = #function, line: UInt = #line, tag: AnyObject? = nil, asynchronous async: Bool = true) {
SwiftLogMacro(async, level: logLevel, flag: .Info, context: context, file: file, function: function, line: line, tag: tag, string: logPrefix + logText())
}
final func DDLogWarn(@autoclosure logText: () -> String, context: Int = 0, file: StaticString = #file, function: StaticString = #function, line: UInt = #line, tag: AnyObject? = nil, asynchronous async: Bool = true) {
SwiftLogMacro(async, level: logLevel, flag: .Warning, context: context, file: file, function: function, line: line, tag: tag, string: logPrefix + logText())
}
final func DDLogVerbose(@autoclosure logText: () -> String, context: Int = 0, file: StaticString = #file, function: StaticString = #function, line: UInt = #line, tag: AnyObject? = nil, asynchronous async: Bool = true) {
SwiftLogMacro(async, level: logLevel, flag: .Verbose, context: context, file: file, function: function, line: line, tag: tag, string: logPrefix + logText())
}
final func DDLogError(@autoclosure logText: () -> String,context: Int = 0, file: StaticString = #file, function: StaticString = #function, line: UInt = #line, tag: AnyObject? = nil, asynchronous async: Bool = false) {
SwiftLogMacro(async, level: logLevel, flag: .Error, context: context, file: file, function: function, line: line, tag: tag, string: logPrefix + logText())
}
}