15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_BASE_NET_LOG_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_BASE_NET_LOG_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/atomicops.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/observer_list.h" 155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string16.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/synchronization/lock.h" 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_export.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DictionaryValue; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NetLog is the destination for log messages generated by the network stack. 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Each log message has a "source" field which identifies the specific entity 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// that generated the message (for example, which URLRequest or which 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// SocketStream). 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// To avoid needing to pass in the "source ID" to the logging functions, NetLog 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is usually accessed through a BoundNetLog, which will always pass in a 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specific source ID. 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 36eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// All methods are thread safe, with the exception that no NetLog or 37eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// NetLog::ThreadSafeObserver functions may be called by an observer's 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// OnAddEntry() method. Doing so will result in a deadlock. 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// For a broader introduction see the design document: 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/netlog 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT NetLog { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum EventType { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define EVENT_TYPE(label) TYPE_ ## label, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log_event_type_list.h" 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef EVENT_TYPE 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EVENT_COUNT 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The 'phase' of an event trace (whether it marks the beginning or end 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of an event.). 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum EventPhase { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PHASE_NONE, 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PHASE_BEGIN, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PHASE_END, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The "source" identifies the entity that generated the log message. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum SourceType { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define SOURCE_TYPE(label) SOURCE_ ## label, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_log_source_type_list.h" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef SOURCE_TYPE 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOURCE_COUNT 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Specifies the granularity of events that should be emitted to the log. 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Since the LogLevel may be read and set on any thread without locking, it 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // may be possible for an Observer to receive an event or parameters that 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // normally wouldn't be logged at the currently active log level. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum LogLevel { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Log everything possible, even if it is slow and memory expensive. 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Includes logging of transferred bytes. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG_ALL, 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Log all events, but do not include the actual transferred bytes as 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // parameters for bytes sent/received events. 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG_ALL_BUT_BYTES, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Log all events, but do not include the actual transferred bytes and 8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // remove cookies and HTTP credentials. 8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) LOG_STRIP_PRIVATE_DATA, 8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Don't log any events. 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LOG_NONE, 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A callback function that return a Value representation of the parameters 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // associated with an event. If called, it will be called synchonously, 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // so it need not have owning references. May be called more than once, or 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not at all. May return NULL. 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<base::Value*(LogLevel)> ParametersCallback; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Identifies the entity that generated this log. The |id| field should 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // uniquely identify the source, and is used by log observers to infer 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // message groupings. Can use NetLog::NextID() to create unique IDs. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct NET_EXPORT Source { 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const uint32 kInvalidId; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Source(); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Source(SourceType type, uint32 id); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool IsValid() const; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds the source to a DictionaryValue containing event parameters, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // using the name "source_dependency". 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddToEventParameters(base::DictionaryValue* event_params) const; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a callback that returns a dictionary with a single entry 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // named "source_dependecy" that describes |this|. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ParametersCallback ToEventParametersCallback() const; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Attempts to extract a Source from a set of event parameters. Returns 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // true and writes the result to |source| on success. Returns false and 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // makes |source| an invalid source on failure. 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mmenke): Long term, we want to remove this. 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool FromEventParameters(base::Value* event_params, Source* source); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SourceType type; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32 id; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 123a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) struct NET_EXPORT EntryData { 124a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EntryData(EventType type, 125a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Source source, 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EventPhase phase, 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::TimeTicks time, 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ParametersCallback* parameters_callback); 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ~EntryData(); 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const EventType type; 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const Source source; 133a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const EventPhase phase; 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const base::TimeTicks time; 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const ParametersCallback* const parameters_callback; 136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) }; 137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // An Entry pre-binds EntryData to a LogLevel, so observers will observe the 139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // output of ToValue() and ParametersToValue() at their log level rather than 140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // current maximum. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class NET_EXPORT Entry { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Entry(const EntryData* data, LogLevel log_level); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~Entry(); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 146a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EventType type() const { return data_->type; } 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) Source source() const { return data_->source; } 148a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EventPhase phase() const { return data_->phase; } 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Serializes the specified event to a Value. The Value also includes the 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // current time. Caller takes ownership of returned Value. Takes in a time 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to allow back-dating entries. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Value* ToValue() const; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the parameters as a Value. Returns NULL if there are no 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // parameters. Caller takes ownership of returned Value. 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Value* ParametersToValue() const; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 160a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const EntryData* const data_; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Log level when the event occurred. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const LogLevel log_level_; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is not safe to copy this class, since |parameters_callback_| may 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // include pointers that become stale immediately after the event is added, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // even if the code were modified to keep its own copy of the callback. 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Entry); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An observer, that must ensure its own thread safety, for events 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // being added to a NetLog. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class NET_EXPORT ThreadSafeObserver { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Constructs an observer that wants to see network events, with 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the specified minimum event granularity. A ThreadSafeObserver can only 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observe a single NetLog at a time. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observers will be called on the same thread an entry is added on, 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and are responsible for ensuring their own thread safety. 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Observers must stop watching a NetLog before either the Observer or the 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NetLog is destroyed. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ThreadSafeObserver(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the minimum log level for events this observer wants to 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // receive. Must not be called when not watching a NetLog. 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LogLevel log_level() const; 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the NetLog we are currently watching, if any. Returns NULL 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // otherwise. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog* net_log() const; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method will be called on the thread that the event occurs on. It 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // is the responsibility of the observer to handle it in a thread safe 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // manner. 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It is illegal for an Observer to call any NetLog or 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NetLog::Observer functions in response to a call to OnAddEntry. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnAddEntry(const Entry& entry) = 0; 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ThreadSafeObserver(); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class NetLog; 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) void OnAddEntryData(const EntryData& entry_data); 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Both of these values are only modified by the NetLog. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LogLevel log_level_; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog* net_log_; 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ThreadSafeObserver); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) NetLog(); 218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) virtual ~NetLog(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Emits a global event to the log stream, with its own unique source ID. 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddGlobalEntry(EventType type); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddGlobalEntry(EventType type, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetLog::ParametersCallback& parameters_callback); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a unique ID which can be used as a source ID. All returned IDs 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // will be unique and greater than 0. 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) uint32 NextID(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the logging level for this NetLog. This is used to avoid computing 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and saving expensive log entries. 231868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LogLevel GetLogLevel() const; 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Adds an observer and sets its log level. The observer must not be 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // watching any NetLog, including this one, when this is called. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NetLog implementations must call NetLog::OnAddObserver to update the 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // observer's internal state. 238868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void AddThreadSafeObserver(ThreadSafeObserver* observer, LogLevel log_level); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the log level of |observer| to |log_level|. |observer| must be 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // watching |this|. NetLog implementations must call 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NetLog::OnSetObserverLogLevel to update the observer's internal state. 243868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void SetObserverLogLevel(ThreadSafeObserver* observer, LogLevel log_level); 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Removes an observer. NetLog implementations must call 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NetLog::OnAddObserver to update the observer's internal state. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For thread safety reasons, it is recommended that this not be called in 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // an object's destructor. 250868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void RemoveThreadSafeObserver(ThreadSafeObserver* observer); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Converts a time to the string format that the NetLog uses to represent 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // times. Strings are used since integers may overflow. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static std::string TickCountToString(const base::TimeTicks& time); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a C-String symbolic name for |event_type|. 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* EventTypeToString(EventType event_type); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a dictionary that maps event type symbolic names to their enum 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // values. Caller takes ownership of the returned Value. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static base::Value* GetEventTypesAsValue(); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a C-String symbolic name for |source_type|. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* SourceTypeToString(SourceType source_type); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a dictionary that maps source type symbolic names to their enum 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // values. Caller takes ownership of the returned Value. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static base::Value* GetSourceTypesAsValue(); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a C-String symbolic name for |event_phase|. 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char* EventPhaseToString(EventPhase event_phase); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if |log_level| indicates the actual bytes transferred should 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be logged. This is only the case when |log_level| is LOG_ALL. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool IsLoggingBytes(LogLevel log_level); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns true if |log_level| indicates that events should be logged. This is 278a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the case when |log_level| is anything other than LOG_NONE. 279a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static bool IsLogging(LogLevel log_level); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a ParametersCallback that encapsulates a single integer. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Warning: |name| must remain valid for the life of the callback. 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(mmenke): Rename this to be consistent with Int64Callback. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ParametersCallback IntegerCallback(const char* name, int value); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a ParametersCallback that encapsulates a single int64. The 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // callback will return the value as a StringValue, since IntegerValues 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // only support 32-bit values. 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Warning: |name| must remain valid for the life of the callback. 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ParametersCallback Int64Callback(const char* name, int64 value); 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a ParametersCallback that encapsulates a single UTF8 string. Takes 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |value| as a pointer to avoid copying, and emphasize it must be valid for 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the life of the callback. |value| may not be NULL. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Warning: |name| and |value| must remain valid for the life of the callback. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ParametersCallback StringCallback(const char* name, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string* value); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as above, but takes in a UTF16 string. 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static ParametersCallback StringCallback(const char* name, 301c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::string16* value); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 304868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Set the lowest allowed log level, regardless of any Observers. 305868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void SetBaseLogLevel(LogLevel log_level); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class BoundNetLog; 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddEntry(EventType type, 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Source& source, 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventPhase phase, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetLog::ParametersCallback* parameters_callback); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Called whenever an observer is added or removed, or has its log level 316868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // changed. Must have acquired |lock_| prior to calling. 317868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) void UpdateLogLevel(); 318868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 319868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // |lock_| protects access to |observers_|. 320868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::Lock lock_; 321868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 322868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Last assigned source ID. Incremented to get the next one. 323868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::subtle::Atomic32 last_id_; 324868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 325868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The lowest allowed log level, regardless of any Observers. 326868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Normally defaults to LOG_NONE, but can be changed with SetBaseLogLevel 327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) LogLevel base_log_level_; 328868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 329868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // The current log level. 330868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::subtle::Atomic32 effective_log_level_; 331868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // |lock_| must be acquired whenever reading or writing to this. 333868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ObserverList<ThreadSafeObserver, true> observers_; 334868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(NetLog); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper that binds a Source to a NetLog, and exposes convenience methods to 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// output log messages without needing to pass in the source. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT BoundNetLog { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundNetLog() : net_log_(NULL) {} 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a log entry to the NetLog for the bound source. 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddEntry(NetLog::EventType type, NetLog::EventPhase phase) const; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddEntry(NetLog::EventType type, 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::EventPhase phase, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetLog::ParametersCallback& get_parameters) const; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Convenience methods that call AddEntry with a fixed "capture phase" 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (begin, end, or none). 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BeginEvent(NetLog::EventType type) const; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void BeginEvent(NetLog::EventType type, 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetLog::ParametersCallback& get_parameters) const; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EndEvent(NetLog::EventType type) const; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EndEvent(NetLog::EventType type, 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetLog::ParametersCallback& get_parameters) const; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddEvent(NetLog::EventType type) const; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddEvent(NetLog::EventType type, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetLog::ParametersCallback& get_parameters) const; 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Just like AddEvent, except |net_error| is a net error code. A parameter 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // called "net_error" with the indicated value will be recorded for the event. 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |net_error| must be negative, and not ERR_IO_PENDING, as it's not a true 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error. 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddEventWithNetErrorCode(NetLog::EventType event_type, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int net_error) const; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Just like EndEvent, except |net_error| is a net error code. If it's 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // negative, a parameter called "net_error" with a value of |net_error| is 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // associated with the event. Otherwise, the end event has no parameters. 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |net_error| must not be ERR_IO_PENDING, as it's not a true error. 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EndEventWithNetErrorCode(NetLog::EventType event_type, 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int net_error) const; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Logs a byte transfer event to the NetLog. Determines whether to log the 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // received bytes or not based on the current logging level. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddByteTransferEvent(NetLog::EventType event_type, 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int byte_count, const char* bytes) const; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::LogLevel GetLogLevel() const; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shortcut for NetLog::IsLoggingBytes(this->GetLogLevel()). 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsLoggingBytes() const; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 388a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Shortcut for NetLog::IsLogging(this->GetLogLevel()). 389a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) bool IsLogging() const; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Helper to create a BoundNetLog given a NetLog and a SourceType. Takes care 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // of creating a unique source ID, and handles the case of NULL net_log. 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static BoundNetLog Make(NetLog* net_log, NetLog::SourceType source_type); 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const NetLog::Source& source() const { return source_; } 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog* net_log() const { return net_log_; } 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BoundNetLog(const NetLog::Source& source, NetLog* net_log) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : source_(source), net_log_(net_log) { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog::Source source_; 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NetLog* net_log_; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_BASE_NET_LOG_H_ 410