LOG StderrLogger StdioLogger

 

 

static void KernelLogLine(const char* msg, int length, android::base::LogSeverity severity, const char* tag) {

        // clang-format off

        static constexpr int kLogSeverityToKernelLogLevel[] = {

                [android::base::VERBOSE] = 7, // KERN_DEBUG (there is no verbose kernel log level)

                [android::base::DEBUG] = 7, // KERN_DEBUG               

                [android::base::INFO] = 6, // KERN_INFO

                [android::base::WARNING] = 4, // KERN_WARNING

                [android::base::ERROR] = 3, // KERN_ERROR

                [android::base::FATAL_WITHOUT_ABORT] = 2, // KERN_CRIT

                [android::base::FATAL] = 2, // KERN_CRIT

        };

        // clang-format on

        static_assert(arraysize(kLogSeverityToKernelLogLevel) == android::base::FATAL + 1,

                "Mismatch in size of kLogSeverityToKernelLogLevel and values in LogSeverity");

 

        static int klog_fd = OpenKmsg();

        if (klog_fd == -1) return;

 

        int level = kLogSeverityToKernelLogLevel[severity];

 

        // The kernel's printk buffer is only 1024 bytes.

        // TODO: should we automatically break up long lines into multiple lines?

        // Or we could log but with something like "..." at the end?

        char buf[1024] __attribute__((__uninitialized__));

        size_t size = snprintf(buf, sizeof(buf), "<%d>%s: %.*s\n", level, tag, length, msg);

        if (size > sizeof(buf)) {

                size = snprintf(buf, sizeof(buf), "<%d>%s: %zu-byte message too long for printk\n",

                        level, tag, size);

        }

 

        iovec iov[1];

        iov[0].iov_base = buf;

        iov[0].iov_len = size;

        TEMP_FAILURE_RETRY(writev(klog_fd, iov, 1));

}

 

void KernelLogger(android::base::LogId, android::base::LogSeverity severity, const char* tag,

        const char*, unsigned int, const char* full_message) {

                SplitByLines(full_message, KernelLogLine, severity, tag);

}

 

 

void StderrLogger(LogId, LogSeverity severity, const char* tag, const char* file, unsigned int line,

        const char* message) {

        struct tm now;

        time_t t = time(nullptr);

 

#if defined(_WIN32)

        localtime_s(&now, &t);

#else

        localtime_r(&t, &now);

#endif

        auto output_string = StderrOutputGenerator(now, getpid(), GetThreadId(), severity, tag, file, line, message);

 

        fputs(output_string.c_str(), stderr);

}

 

void StdioLogger(LogId, LogSeverity severity, const char* /*tag*/, const char* /*file*/,

        unsigned int /*line*/, const char* message) {

        if (severity >= WARNING) {

                fflush(stdout);

                fprintf(stderr, "%s: %s\n", GetFileBasename(getprogname()), message);

        } else {

                fprintf(stdout, "%s\n", message);

        }

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值