From 6bb8e8c9039ea0e5476b6ce0f0c15de081820b65 Mon Sep 17 00:00:00 2001 From: Pavel Pautov Date: Tue, 7 Feb 2023 22:16:29 -0800 Subject: [PATCH] Redirect gRPC and Protobuf logs into Nginx error log. By default, these libraries may log directly into stderr. --- src/http_module.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/http_module.cpp b/src/http_module.cpp index 8c9252a..f97d8b5 100644 --- a/src/http_module.cpp +++ b/src/http_module.cpp @@ -4,6 +4,9 @@ extern "C" { #include } +#include +#include + #include "str_view.hpp" #include "trace_context.hpp" #include "batch_exporter.hpp" @@ -475,6 +478,28 @@ ngx_int_t onRequestEnd(ngx_http_request_t* r) return NGX_DECLINED; } +void grpcLogHandler(gpr_log_func_args* args) +{ + ngx_uint_t level = args->severity == GPR_LOG_SEVERITY_ERROR ? NGX_LOG_ERR : + args->severity == GPR_LOG_SEVERITY_INFO ? NGX_LOG_INFO : + /*GPR_LOG_SEVERITY_DEBUG*/ NGX_LOG_DEBUG; + + ngx_log_error(level, ngx_cycle->log, 0, "OTel/grpc: %s", args->message); +} + +void protobufLogHandler(google::protobuf::LogLevel logLevel, + const char* filename, int line, const std::string& msg) +{ + using namespace google::protobuf; + + ngx_uint_t level = logLevel == LOGLEVEL_FATAL ? NGX_LOG_EMERG : + logLevel == LOGLEVEL_ERROR ? NGX_LOG_ERR : + logLevel == LOGLEVEL_WARNING ? NGX_LOG_WARN : + /*LOGLEVEL_INFO*/ NGX_LOG_INFO; + + ngx_log_error(level, ngx_cycle->log, 0, "OTel/protobuf: %s", msg.c_str()); +} + ngx_int_t initModule(ngx_conf_t* cf) { auto cmcf = (ngx_http_core_main_conf_t*)ngx_http_conf_get_module_main_conf( @@ -496,6 +521,9 @@ ngx_int_t initModule(ngx_conf_t* cf) *h = onRequestEnd; + gpr_set_log_function(grpcLogHandler); + google::protobuf::SetLogHandler(protobufLogHandler); + return NGX_OK; }