我有一个 C++ 库,Java 应用程序通过 JNI 使用它。在 Java 应用程序中,我使用 logback 来生成日志。
现在我还需要记录 C++ 库消息,并且我必须在 Java 使用的同一个文件中执行它,这样我才能按时间顺序排列所有内容。
我目前尚未实现的方法是创建一个名为Logger的 C++ 类,它将通过 JNI 将消息发送到 Java,然后 Java 将记录这些消息。缺点是我失去了 Logback 功能,例如记录线程名称或生成日志的代码行。
有没有更好的办法?
我过去使用过的一个可能的解决方案:-
将 logback 与数据库附加程序一起使用。数据库将确保事务提交按顺序进行,并带有时间戳。在某些数据库中,您可以将其设为触发器并使用可能更有效的本机时间戳。
C++ 部分将需要有一个类似的附加程序和/或修改以写入同一个表。(log4cpp 有效,或者如果你有一个专有的,它可能需要稍微修改)
Select * from table order by timestamp asc output to a file 将按顺序为您提供日志。
在我的最后一个地方,我们使用 sqlite 来存储这些日志,因为与 oracle 或更重的负载相比,开销很小,如果以后需要,我们可以删除文件。
一个简单的解决方案是使用通用的日志记录服务,例如 syslog。在您的 Java 代码中,设置适当的附加程序以将日志写入 syslog。在您的 C++ 代码中,只需本机调用 syslog。系统日志将按时间顺序组合所有日志。
#include <android/log.h>
...
int error;
...
__android_log_print(ANDROID_LOG_ERROR, LOG_TAG, "Some error: code = %d", error);
...