func (sw LogsStreamWriter) Write(b []byte) (int, error) { lines := common.RemoveEmptyLines(string(b)) if err := sw.server.Send(&v1alpha.GetLogsResponse{Lines: lines}); err != nil { return 0, err } return len(b), nil }
func (s *v1AlphaAPIServer) constrainedGetLogs(request *v1alpha.GetLogsRequest, server v1alpha.PublicAPI_GetLogsServer) error { pod, err := pkgPod.PodFromUUIDString(getDataDir(), request.PodId) if err != nil { return err } defer pod.Close() path, err := pod.JournalLogPath() if _, err := os.Stat(path); os.IsNotExist(err) { return fmt.Errorf("logging unsupported for pod %q", request.PodId) } jconf := sdjournal.JournalReaderConfig{ Path: path, } if request.AppName != "" { jconf.Matches = []sdjournal.Match{ { Field: sdjournal.SD_JOURNAL_FIELD_SYSLOG_IDENTIFIER, Value: request.AppName, }, } } if request.SinceTime != 0 { t := time.Unix(request.SinceTime, 0) jconf.Since = -time.Since(t) } if request.Lines != 0 { jconf.NumFromTail = uint64(request.Lines) } jr, err := sdjournal.NewJournalReader(jconf) if err != nil { return err } defer jr.Close() if request.Follow { return jr.Follow(nil, LogsStreamWriter{server: server}) } data, err := ioutil.ReadAll(jr) if err != nil { return err } return server.Send(&v1alpha.GetLogsResponse{Lines: common.RemoveEmptyLines(string(data))}) }
func (s *v1AlphaAPIServer) constrainedGetLogs(request *v1alpha.GetLogsRequest, server v1alpha.PublicAPI_GetLogsServer) error { uuid, err := types.NewUUID(request.PodId) if err != nil { return err } pod, err := getPod(uuid) if err != nil { return err } defer pod.Close() stage1Path := "stage1/rootfs" if pod.usesOverlay() { stage1TreeStoreID, err := pod.getStage1TreeStoreID() if err != nil { return err } stage1Path = fmt.Sprintf("/overlay/%s/upper/", stage1TreeStoreID) } path := filepath.Join(getDataDir(), "/pods/run/", request.PodId, stage1Path, "/var/log/journal/") if _, err := os.Stat(path); os.IsNotExist(err) { return fmt.Errorf("%s: logging unsupported", uuid.String()) } jconf := sdjournal.JournalReaderConfig{ Path: path, } if request.AppName != "" { jconf.Matches = []sdjournal.Match{ { Field: sdjournal.SD_JOURNAL_FIELD_SYSLOG_IDENTIFIER, Value: request.AppName, }, } } if request.SinceTime != 0 { t := time.Unix(request.SinceTime, 0) jconf.Since = -time.Since(t) } if request.Lines != 0 { jconf.NumFromTail = uint64(request.Lines) } jr, err := sdjournal.NewJournalReader(jconf) if err != nil { return err } defer jr.Close() if request.Follow { return jr.Follow(nil, LogsStreamWriter{server: server}) } data, err := ioutil.ReadAll(jr) if err != nil { return err } return server.Send(&v1alpha.GetLogsResponse{Lines: common.RemoveEmptyLines(string(data))}) }