objective-c - 如何将所有错误(包括未捕获的异常、NSLog 调用和其他日志)重定向到 Mac OS X 上的日志文件?

标签 objective-c cocoa macos logging

我正在尝试为 Cocoa 应用程序寻找一个用 ObjC 编写的日志记录框架。

到目前为止我尝试了什么:

  1. 使用 NSLog,但后来意识到配置和重定向非常困难。我想我可以破解它并编写一个宏来获取我想要的信息,例如线程 ID、当前函数、当前行、当前文件、当前时间、消息等等,然后使用 NSLog,但是...<
  2. NSLog 最终使用 NSLogv,它最终使用 asl,所以我认为“太棒了”,我尝试使用 asl 代替,使用默认客户端和上下文(如果我这样做正确,我将不得不创建一个新客户端对于每个线程),但是,除非我创建一个宏,否则这也非常冗长,我注意到通过 asl 发送的日志在整个系统范围内广播,而 NSLog 只记录到 stderr,我希望它们都转到同一个记录!
  3. 然后我注意到错误以不同的方式(不同的日期戳等)格式化,所以现在有第三个日志记录上下文。

我可以使用什么日志记录框架设置来以方便的方式通过该框架记录所有消息,以便在应用程序出现问题时,开发人员可以获取日志文件并找出问题所在?

我不想简单地重定向 stderr,我想要一个包含所有日志的结构化日志输出。我不希望某些日志进入标准输出,我不希望任何日志发送到 syslogd,我只希望将所有日志写入单个文件,该文件可靠地标识有关该日志消息的所有相关信息(例如线程 ID、消息、调用记录器的函数等),采用易于查看和可视化的格式。

我想要的是将所有当前日志重定向到新目的地。

有人有什么建议吗?

编辑:

实际上,用 ObjC 术语来说,我想做的是:

  1. 对 NSLog 函数进行“方法调整”。这可能吗?是否可以(重新)配置 Apple System Logger 的使用以覆盖同一应用程序中服务的任何先前配置?
  2. 确定我必须捕获未处理异常的所有位置。这包括但可能不限于:未处理的 Cocoa 异常。未处理的 ObjC 异常。未处理的 C++ 异常。 Unix 信号。
  3. 捕获并记录堆栈中的错误,例如 CoreGraphics 引发的错误。 (那些只记录一条消息“使用调试器添加断点!!!”的消息)。

最佳答案

您可以使用 _NSSetLogCStringFunction() 拦截 NSLog() 消息(但不是一般的 ASL)。已记录 here适用于 Windows 的 WebObjects 4,但它也存在于当前的 Mac OS 和 iOS 版本中。但是,它是一个随时可能消失的私有(private)函数,因此您不应在已发布的代码中依赖它。

如果您希望能够安全地为非调试构建执行此操作,我建议复制 this enhancement requestRadar .

关于objective-c - 如何将所有错误(包括未捕获的异常、NSLog 调用和其他日志)重定向到 Mac OS X 上的日志文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4332041/

相关文章:

ios - 人脸对比

ios - “NSInvalidArgumentException”,原因 : 'Can' t use nil for keys or values on PFObject. 使用 NSNull 作为值。 (以前的答案不修复它)

objective-c - 如何为 NSView 制作网格背景图案?

cocoa - Mac OS X 版本的Texture2D.m、.h 可用吗?

ios - Exchange 2010 错误发布的 ICS 源中的全天事件

objective-c - 如何调用 UItableview 委托(delegate)方法。 tableview什么时候在 "for"循环?

macos - NSManagedObject 更改值不正确

objective-c - 如何从网络启动 native OSX 应用程序(并传递参数)?

MySQL Ruby Gem 安装问题

iphone - 有没有办法让 NSManagedObjectContext 不必每次都调用我的 AppDelegate?