veyron/services/mgmt/node: Hook up the logreader

This change hooks up the logreader implementation to the node manager
apps objects.

Change-Id: I8ccca706a34b02fea32e31ca5a3ca1696fbca15f
diff --git a/services/mgmt/node/impl/dispatcher.go b/services/mgmt/node/impl/dispatcher.go
index ffc2cf6..655e758 100644
--- a/services/mgmt/node/impl/dispatcher.go
+++ b/services/mgmt/node/impl/dispatcher.go
@@ -15,10 +15,12 @@
 	vflag "veyron.io/veyron/veyron/security/flag"
 	"veyron.io/veyron/veyron/security/serialization"
 	"veyron.io/veyron/veyron/services/mgmt/lib/toplevelglob"
+	logsimpl "veyron.io/veyron/veyron/services/mgmt/logreader/impl"
 	inode "veyron.io/veyron/veyron/services/mgmt/node"
 	"veyron.io/veyron/veyron/services/mgmt/node/config"
 
 	"veyron.io/veyron/veyron2/ipc"
+	"veyron.io/veyron/veyron2/naming"
 	"veyron.io/veyron/veyron2/rt"
 	"veyron.io/veyron/veyron2/security"
 	"veyron.io/veyron/veyron2/services/mgmt/node"
@@ -245,6 +247,15 @@
 		})
 		return ipc.ReflectInvoker(receiver), d.auth, nil
 	case appsSuffix:
+		if method != "Glob" && len(components) >= 5 && components[4] == "logs" {
+			appInstanceDir, err := instanceDir(d.config.Root, components[1:4])
+			if err != nil {
+				return nil, nil, err
+			}
+			logsDir := filepath.Join(appInstanceDir, "logs")
+			suffix := naming.Join(components[5:]...)
+			return logsimpl.NewLogFileInvoker(logsDir, suffix), d.auth, nil
+		}
 		receiver := node.NewServerApplication(&appInvoker{
 			callback: d.internal.callback,
 			config:   d.config,