如何在swift ios文件中使用asl.h

如何在swift ios文件中使用asl.h,ios,swift,logging,Ios,Swift,Logging,我是ios/swift新手。我想使用asl.h中的日志c函数 在swift文件中。任何人我在谷歌上搜索,人们似乎在编写自己的日志类。没有不敬,但我只想用asl。 也就是说,斯威夫特不喜欢 #include,它不喜欢我只调用asl_日志(NULL,NULL,asl_级别信息,“你好,世界!”)到目前为止,我发现的最简单的方法是以下(它适用于任何c库): 步骤1:将新文件Objective-C归档,例如MyBridgeToACLib.h、MyBridgeToACLib.m #include <

我是ios/swift新手。我想使用asl.h中的日志c函数 在swift文件中。任何人我在谷歌上搜索,人们似乎在编写自己的日志类。没有不敬,但我只想用asl。 也就是说,斯威夫特不喜欢
#include
,它不喜欢我只调用
asl_日志(NULL,NULL,asl_级别信息,“你好,世界!”)

到目前为止,我发现的最简单的方法是以下(它适用于任何c库):

步骤1:将新文件Objective-C归档,例如MyBridgeToACLib.h、MyBridgeToACLib.m

#include <asl.h>  // or any c-library you need to call from Swift
#import "MyBridgeToACLib.h"

@implementation MyBridgeToACLib

+ (void) debug:(NSString*) nsStr {
  // here you need to convert from Objective-C types to C-types, e.g. NSString to char*
  const char *cStr = [nsStr UTF8String];
  printf("%s\n", cStr);
  // call your c-functions
  asl_log(NULL, NULL, ASL_LEVEL_DEBUG, "%s", cStr);
}

+ (void) debug:(NSString*) nsStr secondValue:(NSInteger) nsInt {
  const char *cStr = [nsStr UTF8String];
  long cInt = nsInt;
  printf("%s%li\n", cStr, cInt);
  asl_log(NULL, NULL, ASL_LEVEL_DEBUG, "%s%li", cStr, cInt);
}
@end
步骤2:在MyBridgeToACLib.h中

#import <Foundation/Foundation.h>
@interface MyBridgeToACLib : NSObject    
  // here you need to declare a function for each c-function you want to call from swift, e.g. : 
  + (void) debug:(NSString*) nsStr;
  + (void) debug:(NSString*) nsStr secondValue:(NSInteger) nsInt;
@end

谢谢,在他的帮助下,我做了以下修改:

向项目中添加了具有以下内容的BRASL.h文件:

//
//  BRASL.h
//

#ifndef BRASL_h
#define BRASL_h

#import <asl.h>
#import <Foundation/Foundation.h>


// Define which loglevel is necessary for deployment and development
// =================================================================
// Used to conditionally implement the log functions. All log
// functions are defined so the compiler does not complain. But only
// those logfunctions that are used will contain code.
// =================================================================
#ifndef BRASL_LOG_LEVEL
    // DEBUG is set in the project build-settings
    #if DEBUG == 1
        // Set logging level for development
        #define BRASL_LOG_LEVEL ASL_LEVEL_DEBUG
    #else
        // Set logging level for deployment
        #define BRASL_LOG_LEVEL ASL_LEVEL_NOTICE
    #endif
#endif


// Define the log functions
// ========================
void aslEmergency(NSString *string);
void aslAlert(NSString *string);
void aslCritical(NSString *string);
void aslError(NSString *string);
void aslWarning(NSString *string);
void aslNotice(NSString *string);
void aslInfo(NSString *string);
void aslDebug(NSString *string);


#endif
当然还有桥接文件

//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

#import "BRASL.h"
然后在我的swift代码中,我可以使用例如:

aslInfo("Initializing managed object context")

到目前为止,一切都很好,就像广告宣传的那样:)

以下是一些您可能感兴趣的开源项目:

•-用于读取和写入苹果系统日志的低级别但快速的API

•-支持写入ASL的高级Swift日志API

•-Swift Package Manager(SPM)声明,允许您从代码中“导入ASL”。(请注意,SPM目前只为Mac OS X构建,因此它暂时无法帮助您使用iOS。)

根据您所写的内容,我怀疑CleanroomLogger项目最适合您使用

希望这对你有所帮助

E


充分披露:我为这些项目中的每一个都做出了贡献。

我似乎无法在
达尔文
下找到它,这是它应该在的地方。也许你可以用Objective-C编写一个包装器并将其连接起来。上述解决方案适用于只使用一个线程的小型应用程序。当您开始执行多线程时,一个更好的解决方案可能是开始使用一个小型库,如CocoaLumberjack:Works!但我只看到ASL_LEVEL_NOTICE向上的输出。没有
ASL_级别_信息
也没有
ASL_级别_调试
,即使
aslInfo
aslDebug
调用
ASL_日志
方法(通过调试验证)。但是,控制台上未列出其输出。有什么提示吗?我想使用这个类在我的应用程序中进行调试。只是不知道如何使它与桥接头一起工作。刚刚创建了一个名为MyBridgeToACLib bridge Header.h的文件,包括#import MyBridgeToACLib.h。我有什么遗漏吗?我研究的是Objective-c,而不是swift,只是有点让我感到困惑,因为我从未研究过它
//
//  Use this file to import your target's public headers that you would like to expose to Swift.
//

#import "BRASL.h"
aslInfo("Initializing managed object context")