| Index: runtime/vm/service.cc | 
| diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc | 
| index e68727a3c41829a1889e847403d243797df540be..de3f48d391d19764e521a7bacc6b9e1edca8588a 100644 | 
| --- a/runtime/vm/service.cc | 
| +++ b/runtime/vm/service.cc | 
| @@ -87,7 +87,7 @@ StreamInfo Service::debug_stream("Debug"); | 
| StreamInfo Service::gc_stream("GC"); | 
| StreamInfo Service::echo_stream("_Echo"); | 
| StreamInfo Service::graph_stream("_Graph"); | 
| - | 
| +StreamInfo Service::logging_stream("_Logging"); | 
|  | 
| static StreamInfo* streams_[] = { | 
| &Service::isolate_stream, | 
| @@ -95,6 +95,7 @@ static StreamInfo* streams_[] = { | 
| &Service::gc_stream, | 
| &Service::echo_stream, | 
| &Service::graph_stream, | 
| +  &Service::logging_stream, | 
| }; | 
|  | 
|  | 
| @@ -683,6 +684,16 @@ void Service::HandleEvent(ServiceEvent* event) { | 
| jsobj.AddProperty("event", event); | 
| jsobj.AddProperty("streamId", stream_id); | 
| } | 
| +  PostEvent(stream_id, event->KindAsCString(), &js); | 
| +} | 
| + | 
| + | 
| +void Service::PostEvent(const char* stream_id, | 
| +                        const char* kind, | 
| +                        JSONStream* event) { | 
| +  ASSERT(stream_id != NULL); | 
| +  ASSERT(kind != NULL); | 
| +  ASSERT(event != NULL); | 
|  | 
| // Message is of the format [<stream id>, <json string>]. | 
| // | 
| @@ -702,13 +713,12 @@ void Service::HandleEvent(ServiceEvent* event) { | 
|  | 
| Dart_CObject json_cobj; | 
| json_cobj.type = Dart_CObject_kString; | 
| -  json_cobj.value.as_string = const_cast<char*>(js.ToCString()); | 
| +  json_cobj.value.as_string = const_cast<char*>(event->ToCString()); | 
| list_values[1] = &json_cobj; | 
|  | 
| if (FLAG_trace_service) { | 
| OS::Print( | 
| -        "vm-service: Pushing event of type %s to stream %s\n", | 
| -        event->KindAsCString(), stream_id); | 
| +        "vm-service: Pushing event of type %s to stream %s\n", kind, stream_id); | 
| } | 
|  | 
| Dart_PostCObject(ServiceIsolate::Port(), &list_cobj); | 
| @@ -2512,6 +2522,30 @@ void Service::SendEmbedderEvent(Isolate* isolate, | 
| } | 
|  | 
|  | 
| +void Service::SendLogEvent(Isolate* isolate, | 
| +                           int64_t sequence_number, | 
| +                           int64_t timestamp, | 
| +                           intptr_t level, | 
| +                           const String& name, | 
| +                           const String& message, | 
| +                           const Instance& zone, | 
| +                           const Object& error, | 
| +                           const Instance& stack_trace) { | 
| +  ServiceEvent::LogRecord log_record; | 
| +  log_record.sequence_number = sequence_number; | 
| +  log_record.timestamp = timestamp; | 
| +  log_record.level = level; | 
| +  log_record.name = &name; | 
| +  log_record.message = &message; | 
| +  log_record.zone = &zone; | 
| +  log_record.error = &error; | 
| +  log_record.stack_trace = &stack_trace; | 
| +  ServiceEvent event(isolate, ServiceEvent::kLogging); | 
| +  event.set_log_record(log_record); | 
| +  Service::HandleEvent(&event); | 
| +} | 
| + | 
| + | 
| class ContainsAddressVisitor : public FindObjectVisitor { | 
| public: | 
| ContainsAddressVisitor(Isolate* isolate, uword addr) | 
|  |