@@ -112,8 +112,9 @@ class TonlibRequestHandler : public userver::server::handlers::HttpHandlerBase {
112112 std::string HandleRequestThrow (const HttpRequest& request, RequestContext& context) const override {
113113 auto session = tonlib_component_.GetNewSession ();
114114 schemas::v2::TonlibErrorResponse error_response;
115+ Request tonlib_request;
115116 try {
116- auto tonlib_request = ParseTonlibRequestThrow (request, context);
117+ tonlib_request = ParseTonlibRequestThrow (request, context);
117118 auto tonlib_response = HandleRequestTonlibThrow (tonlib_request, session);
118119 if (tonlib_response.is_error ()) {
119120 auto tonlib_error = tonlib_response.move_as_error ();
@@ -129,7 +130,10 @@ class TonlibRequestHandler : public userver::server::handlers::HttpHandlerBase {
129130 if (use_custom_serializer_) {
130131 throw std::runtime_error (" not implemented" );
131132 }
132- return ToString (userver::formats::json::ValueBuilder{response}.ExtractValue ());
133+
134+ auto response_body = userver::formats::json::ValueBuilder{response}.ExtractValue ();
135+ LogTonlibRequest (request, context, tonlib_request, response_body, std::nullopt , userver::logging::Level::kInfo );
136+ return ToString (response_body);
133137 } catch (const utils::TonlibException& error) {
134138 error_response = PrepareErrorResponse (error);
135139 } catch (const std::exception& exc) {
@@ -142,7 +146,10 @@ class TonlibRequestHandler : public userver::server::handlers::HttpHandlerBase {
142146 auto & http_response = request.GetHttpResponse ();
143147 http_response.SetContentType (userver::http::content_type::kApplicationJson );
144148 http_response.SetStatus (static_cast <userver::server::http::HttpStatus>(error_response.code ));
145- return ToString (userver::formats::json::ValueBuilder{error_response}.ExtractValue ());
149+
150+ auto response_body = userver::formats::json::ValueBuilder{error_response}.ExtractValue ();
151+ LogTonlibRequest (request, context, tonlib_request, std::nullopt , response_body, userver::logging::Level::kWarning );
152+ return ToString (response_body);
146153 }
147154 TonlibRequestHandler (
148155 const userver::components::ComponentConfig& config, const userver::components::ComponentContext& context
@@ -155,6 +162,28 @@ class TonlibRequestHandler : public userver::server::handlers::HttpHandlerBase {
155162 use_custom_serializer_ (config[" use_custom_serializer" ].As<bool >(false )) {
156163 }
157164
165+ void LogTonlibRequest (
166+ const HttpRequest& request,
167+ RequestContext&,
168+ const Request& req,
169+ std::optional<userver::formats::json::Value> response = std::nullopt ,
170+ std::optional<userver::formats::json::Value> error = std::nullopt ,
171+ const userver::logging::Level log_level = userver::logging::Level::kInfo
172+ ) const {
173+ userver::logging::LogExtra log_extra;
174+ log_extra.Extend (" http_method" , request.GetMethodStr ());
175+ log_extra.Extend (" api_method" , request.GetRequestPath ());
176+ auto request_body = userver::formats::json::ValueBuilder{req}.ExtractValue ();
177+ log_extra.Extend (" request" , request_body);
178+ if (response.has_value ()) {
179+ log_extra.Extend (" response" , response.value ());
180+ }
181+ if (error.has_value ()) {
182+ log_extra.Extend (" response" , error.value ());
183+ }
184+ LOG_TO (*logger_, log_level) << log_extra;
185+ }
186+
158187 static userver::yaml_config::Schema GetStaticConfigSchema () {
159188 return userver::yaml_config::MergeSchemas<HttpHandlerBase>(R"(
160189type: object
0 commit comments