15

我想制作一个错误日志,其中包含问题正在使用的文件和行。但是我没有找到好的参考。所有代码都使用 JNI、C++ 端。

这次尝试失败:

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , LOG_TAG,"%s %s %s",__VA_ARGS__, __FILE__, __LINE__)

这个只显示味精,没有文件和行

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR  , LOG_TAG,__VA_ARGS__, __FILE__, __LINE__)

我怎样才能清楚地打印所有信息?是否可以只打印一些参数__VA_ARGS__,例如__VA_NARG__?这类事情的额外信息或有用的参考资料?

4

4 回答 4

19

非常有趣和有用的问题!我找到了这个解决方案,它可能不是最简单的,但对我有用:

#define LOGE(x...) do { \
  char buf[512]; \
  sprintf(buf, x); \
  __android_log_print(ANDROID_LOG_ERROR,"TAG", "%s | %s:%i", buf, __FILE__, __LINE__); \
} while (0)

这一行:

LOGE("Test: %i", 42)

记录以下内容:

TAG    Test: 42 | path/to/file.cpp:line

512如果您打算记录更长的内容,请注意缓冲区的任意长度!

希望这可以帮助!

于 2013-10-15T09:23:55.513 回答
2

这是古老的,但我在寻找同样的东西时遇到了它。但是,我设法从多个来源整合了一个更好的解决方案。

#define LOGV(fmt, ...) ((void)__android_log_print(ANDROID_LOG_VERBOSE, "Your Tag", "%s: " fmt, __FUNCTION__, ## __VA_ARGS__))

你应该注意到这## __VA_ARGS__不是标准的。不过可以在 GCC 和 clang 上工作,所以在 Android 上没有问题。

于 2017-11-14T15:26:59.810 回答
1

您可以使用这样的东西(根据您的需要进行修改):

#include <android/log.h>
#define LOGD(tag, fmt, ...) __android_log_print(ANDROID_LOG_DEBUG, tag, fmt "\n--> %s\n----> %s:%d", ##__VA_ARGS__, __FILE__, __FUNCTION__, __LINE__)
#define LOGE(tag, fmt, ...) __android_log_print(ANDROID_LOG_ERROR, tag, fmt "\n--> %s\n----> %s:%d", ##__VA_ARGS__, __FILE__, __FUNCTION__, __LINE__)

在代码中可以这样使用:

LOGD("TAG", "debug message");
LOGE("TAG", "error message");
std::string msg = "dynamic message";
LOGD("TAG", "%s", msg.c_str());
于 2017-09-07T10:21:43.423 回答
1

我解决了这个问题:

#define TP_STR_HELPER(x) #x
#define TP_STR(x) TP_STR_HELPER(x)

#define DLog(fmt, ...) __android_log_print(ANDROID_LOG_DEBUG, "BLAH", "%s:%s " fmt "\n", __PRETTY_FUNCTION__, TP_STR(__LINE__), ##__VA_ARGS__)
于 2015-08-10T22:57:22.160 回答