唉,我疯了。
我有以下功能,我尝试使用自定义记录器
进行记录CFWriteStreamWrite(CFWriteStreamRef stream, const UInt8 *buffer,
CFIndex bufferLength) {
NSData *data = [[NSData alloc] initWithBytes:buffer length: bufferLength];
NSString *errorDesc = nil;
NSPropertyListFormat format;
NSString * str = (NSString*)[NSPropertyListSerialization
propertyListFromData:data
mutabilityOption:NSPropertyListMutableContainersAndLeaves
format:&format
errorDescription:&errorDesc];
custom_log(CF, "CFURLCreateWithString: %s", str);
}
当我使用自定义记录器时,我得到了垃圾输出
CFURLCreateWithString: < °3€
但是当使用NSLog时,一切正常,
Feb 10 00:36:39: {
bundleID = "com.test.testapp";
pid = 2852;
}
自定义记录器
EXPORT void custom_log(unsigned int facility, const char *msg, ...) {
if (minLogLevel <= INFO) {
char *msgBuffer;
va_list args;
va_start(args, msg);
vasprintf(&msgBuffer, msg, args);
va_end(args);
dispatch_async(logQueue, ^{
write(facility, INFO, msgBuffer);
});
}
}
请告诉我我哪里出错了,过去3个小时我都在尝试转换为不同的数据类型。没有运气。
另外,是否可以将NSLog的输出变为字符串然后我将其传递给我的记录器?
答案 0 :(得分:1)
您可能遇到的一个问题是,NSString
与c_str
方法可能希望替换vasprintf
的{{1}}不同
要解决此问题,我很确定您无法直接将%s
转换为NSPropertyListSerialization
,但我自己并未对其进行测试。您可能正在寻找这样的替代方案:
NSString
当然,既然你已经在合成一个字符串,为什么不在同一个地方完成呢?
NSString * str = [NSString stringWithFormat:@"%@", [NSPropertyListSerialization
propertyListFromData:data
mutabilityOption:NSPropertyListMutableContainersAndLeaves
format:&format
errorDescription:&errorDesc]];
custom_log(CF, "CFURLCreateWithString: %s", [str UTF8String]);
作为一个有趣的辅助项目,你可以考虑在main.mm中做这样的事情。如果您想要的不仅仅是错误内容,请将NSString * str = [NSString stringWithFormat:@"CFURLCreateWithString: %@", [NSPropertyListSerialization
propertyListFromData:data
mutabilityOption:NSPropertyListMutableContainersAndLeaves
format:&format
errorDescription:&errorDesc]];
custom_log(CF, [str UTF8String]);
替换为stderr
:
stdout