// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef NET_LOG_NET_LOG_H_ #define NET_LOG_NET_LOG_H_ #include <stdint.h> #include <string> #include <vector> #include "base/atomicops.h" #include "base/compiler_specific.h" #include "base/memory/raw_ptr.h" #include "base/memory/raw_ref.h" #include "base/synchronization/lock.h" #include "base/time/time.h" #include "base/types/pass_key.h" #include "base/values.h" #include "build/build_config.h" #include "net/base/net_export.h" #include "net/log/net_log_capture_mode.h" #include "net/log/net_log_entry.h" #include "net/log/net_log_event_type.h" #include "net/log/net_log_source.h" #include "net/log/net_log_source_type.h" namespace net { class NetLogWithSource; // NetLog is the destination for log messages generated by the network stack. // Each log message has a "source" field which identifies the specific entity // that generated the message (for example, which URLRequest or which // SpdySession). // // To avoid needing to pass in the "source ID" to the logging functions, NetLog // is usually accessed through a NetLogWithSource, which will always pass in a // specific source ID. // // All methods on NetLog are thread safe, with the exception that no NetLog or // NetLog::ThreadSafeObserver functions may be called by an observer's // OnAddEntry() method, as doing so will result in a deadlock. // // For a broader introduction see the design document: // https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/netlog // // ================================== // Materializing parameters // ================================== // // Events can contain a JSON serializable base::Value [1] referred to as its // "parameters". // // Functions for emitting events have overloads that take a |get_params| // argument for this purpose. // // |get_params| is essentially a block of code to conditionally execute when // the parameters need to be materialized. It is most easily specified as a C++ // lambda. // // This idiom for specifying parameters avoids spending time building the // base::Value when capturing is off. For instance when specified as a lambda // that takes 0 arguments, the inlined code from template expansion roughly // does: // // if (net_log->IsCapturing()) { // base::Value params = get_params(); // net_log->EmitEventToAllObsevers(type, source, phase, std::move(params)); // } // // Alternately, the |get_params| argument could be an invocable that takes a // NetLogCaptureMode parameter: // // base::Value params = get_params(capture_mode); // // In this case, |get_params| depends on the logging granularity and would be // called once per observed NetLogCaptureMode. // // [1] Being "JSON serializable" means you cannot use // base::Value::Type::BINARY. Instead use NetLogBinaryValue() to repackage // it as a base::Value::Type::STRING. class NET_EXPORT NetLog { … }; } // namespace net #endif // NET_LOG_NET_LOG_H_