Sono nuovo in ios/swift. Vorrei usare la registrazione delle funzioni c da asl.h in file rapidi. Chiunque? Ho cercato su Google e la gente sembra scrivere le proprie lezioni veloci di registrazione. Nessuna mancanza di rispetto, ma mi piacerebbe usare solo asl. Cioè, veloce non piace #include <asl.h>
e non mi piace solo chiamando asl_log(NULL, NULL, ASL_LEVEL_INFO, "Hello World!");
Come utilizzare asl.h nei file swift-ios
risposta
Grazie, e con l'aiuto di http://doing-it-wrong.mikeweller.com/2012/07/youre-doing-it-wrong-1-nslogdebug-ios.html ho fatto le seguenti modifiche:
Aggiunto un file BRASL.h al progetto con il seguente contenuto:
//
// 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
quindi aggiunto il corrispondente .m file con:
//
// BRASL.h
//
#import "BRASL.h"
// We need this to set asl up to also write the information to the debugger
// ========================================================================
static void AddStderrOnce() {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
asl_add_log_file(NULL, STDERR_FILENO);
});
}
// Implement the log functions where necessary
// ===========================================
#if BRASL_LOG_LEVEL >= ASL_LEVEL_EMERG
void aslEmergency(NSString *string) {
AddStderrOnce();
asl_log(NULL, NULL, ASL_LEVEL_EMERG, "%s", [string UTF8String]);
}
#else
void aslEmergency(NSString *string) {}
#endif
#if BRASL_LOG_LEVEL >= ASL_LEVEL_ALERT
void aslAlert(NSString *string) {
AddStderrOnce();
asl_log(NULL, NULL, ASL_LEVEL_ALERT, "%s", [string UTF8String]);
}
#else
void aslAlert(NSString *string) {}
#endif
#if BRASL_LOG_LEVEL >= ASL_LEVEL_CRIT
void aslCritical(NSString *string) {
AddStderrOnce();
asl_log(NULL, NULL, ASL_LEVEL_CRIT, "%s", [string UTF8String]);
}
#else
void aslCritical(NSString *string) {}
#endif
#if BRASL_LOG_LEVEL >= ASL_LEVEL_ERR
void aslError(NSString *string) {
AddStderrOnce();
asl_log(NULL, NULL, ASL_LEVEL_ERR, "%s", [string UTF8String]);
}
#else
void aslError(NSString *string) {}
#endif
#if BRASL_LOG_LEVEL >= ASL_LEVEL_WARNING
void aslWarning(NSString *string) {
AddStderrOnce();
asl_log(NULL, NULL, ASL_LEVEL_WARNING, "%s", [string UTF8String]);
}
#else
void aslWarning(NSString *string) {}
#endif
#if BRASL_LOG_LEVEL >= ASL_LEVEL_NOTICE
void aslNotice(NSString *string) {
AddStderrOnce();
asl_log(NULL, NULL, ASL_LEVEL_NOTICE, "%s", [string UTF8String]);
}
#else
void aslNotice(NSString *string) {}
#endif
#if BRASL_LOG_LEVEL >= ASL_LEVEL_INFO
void aslInfo(NSString *string) {
AddStderrOnce();
asl_log(NULL, NULL, ASL_LEVEL_INFO, "%s", [string UTF8String]);
}
#else
void aslInfo(NSString *string) {}
#endif
#if BRASL_LOG_LEVEL >= ASL_LEVEL_DEBUG
void aslDebug(NSString *string) {
AddStderrOnce();
asl_log(NULL, NULL, ASL_LEVEL_DEBUG, "%s", [string UTF8String]);
}
#else
void aslDebug(NSString *string) {}
#endif
E naturalmente il file di collegamento
//
// Use this file to import your target's public headers that you would like to expose to Swift.
//
#import "BRASL.h"
Poi nel mio codice swift posso usare per esempio:
aslInfo("Initializing managed object context")
Fin qui tutto bene, sembra funzionare come pubblicizzato :)
La soluzione di cui sopra funziona bene per le piccole app che utilizzano solo un singolo thread. Quando inizi a fare il multithreading, una soluzione migliore sarebbe probabilmente iniziare a utilizzare una piccola libreria come CocoaLumberjack: https://github.com/CocoaLumberjack/CocoaLumberjack/blob/master/README.md – Rien
Works! Ma vedo solo gli output da 'ASL_LEVEL_NOTICE' verso l'alto. Nessun 'ASL_LEVEL_INFO' né' ASL_LEVEL_DEBUG' anche se sia 'aslInfo' che' aslDebug' chiamano il metodo 'asl_log' (verificato tramite debugging). Tuttavia le loro uscite non sono elencate sulla console. Qualche suggerimento? –
Finora, il modo più semplice che ho trovato è il seguente (funziona per qualsiasi c-librerie):
Step-1: File-New-File Objective-C, es MyBridgeToACLib.h, MyBridgeToACLib.m
Step-2: In 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
Step-3: In 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
Step-4: Setup la seguente "MyProjectName -Bridging-header.h". Google "XCode Bridging-Header" per le istruzioni.
// Swift and Objective-C in the Same Project
//https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/MixandMatch.html
//
// Here import all of your "Bridge"-headers
#import "MyBridgeToACLib.h"
Vorrei usare questa classe per il debugging all'interno della mia app. Non so come farlo funzionare con il Bridging-Header. Ho appena creato un file chiamato ** MyBridgeToACLib-Bridging-Header.h ** e incluso ** # import MyBridgeToACLib.h **. C'è qualcosa che mi manca? Lavoro su Objective-c e non su swift, solo un po 'di confusione su di me perché non ho mai lavorato su di esso –
Ecco alcuni progetti open-source che potrebbe interessarti:
• CleanroomASL - Un'API di basso livello, ma con swiftified per la lettura da & scrittura nel registro di sistema Apple
• CleanroomLogger - Un alto livello di registrazione Swift API che supporta la scrittura alla ASL
• AppleSystemLogSwiftPackage - Una dichiarazione Swift Package Manager (SPM) che permette di 'import ASL' all'interno del codice. (Si noti che SPM solo crea per Mac OS X al momento, quindi per il momento non ti aiuterà con iOS.)
Sulla base di ciò che hai scritto, ho il sospetto che il progetto CleanroomLogger sarebbe il più appropriato per il tuo uso
Spero che troviate questo utile,
E.
Full disclosure: ho contribuito a ciascuno di questi progetti.
- 1. Utilizzare this.sendAction() nei componenti?
- 2. Come gestire ~ nei percorsi file
- 3. Come utilizzare dettagliata-0,9 nei test cabala
- 4. Come utilizzare enum nei modelli Angular 2
- 5. Come utilizzare PowerMock nei progetti Android?
- 6. Quando utilizzare <ProjectReference> nei file di progetto?
- 7. Come gestire la localizzazione nei file JavaScript?
- 8. Come pubblicare le porte nei file docker
- 9. Come visualizzare i simboli nei file oggetto?
- 10. Come organizzare i file nei programmi Haskell?
- 11. Come utilizzare i percorsi relativi nei layer ReSharper DotSettings
- 12. Proprietà Maven nei file apt del sito
- 13. Utilizzare più regole @ font-face nei CSS
- 14. Elixir/Phoenix: come utilizzare i moduli di terze parti nei file di configurazione?
- 15. Contesto corretto da utilizzare nei callback
- 16. Tag personalizzati nei file UiBinder
- 17. Eccezioni personalizzate nei file PCL
- 18. Caratteri speciali nei file FTP
- 19. Codifica newline nei file iCal
- 20. Come posso utilizzare l'interruzione e continuare nei modelli Django?
- 21. Come utilizzare i commenti nei modelli del manubrio?
- 22. Come utilizzare gli spazi nei parametri per DBI-> connettere?
- 23. Utilizzo dei componenti WPF nei test NUnit - come utilizzare STA?
- 24. Come utilizzare node.js integrato nei moduli dagli addon C++
- 25. Come utilizzare le opzioni typeahead nei tag Bootstrap Input
- 26. Come utilizzare i modelli personalizzati nei moduli Backbone?
- 27. Come utilizzare l'app PhoneGap Developer nei progetti Cordova
- 28. Come utilizzare i flag binari nei Core Data?
- 29. come utilizzare gli helper dei binari nei lavori di resque?
- 30. È possibile utilizzare java.lang.instrument.Instrumentation nei test JUnit?
Non riesco a trovarlo in 'Darwin', che è dove dovrebbe essere. Forse potresti semplicemente scrivere un wrapper in Objective-C e farlo passare attraverso. – CodaFi