|
1 | 1 | package services |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "bufio" |
4 | 5 | "crawlab/constants" |
5 | 6 | "crawlab/database" |
6 | 7 | "crawlab/entity" |
@@ -160,15 +161,70 @@ func SetEnv(cmd *exec.Cmd, envs []model.Env, task model.Task, spider model.Spide |
160 | 161 | return cmd |
161 | 162 | } |
162 | 163 |
|
163 | | -func SetLogConfig(cmd *exec.Cmd, path string) error { |
164 | | - fLog, err := os.Create(path) |
| 164 | +func SetLogConfig(cmd *exec.Cmd, t model.Task) error { |
| 165 | + //fLog, err := os.Create(path) |
| 166 | + //if err != nil { |
| 167 | + // log.Errorf("create task log file error: %s", path) |
| 168 | + // debug.PrintStack() |
| 169 | + // return err |
| 170 | + //} |
| 171 | + //cmd.Stdout = fLog |
| 172 | + //cmd.Stderr = fLog |
| 173 | + |
| 174 | + // get stdout reader |
| 175 | + stdout, err := cmd.StdoutPipe() |
| 176 | + readerStdout := bufio.NewReader(stdout) |
165 | 177 | if err != nil { |
166 | | - log.Errorf("create task log file error: %s", path) |
| 178 | + log.Errorf("get stdout error: %s", err.Error()) |
167 | 179 | debug.PrintStack() |
168 | 180 | return err |
169 | 181 | } |
170 | | - cmd.Stdout = fLog |
171 | | - cmd.Stderr = fLog |
| 182 | + |
| 183 | + // get stderr reader |
| 184 | + stderr, err := cmd.StderrPipe() |
| 185 | + readerStderr := bufio.NewReader(stderr) |
| 186 | + if err != nil { |
| 187 | + log.Errorf("get stdout error: %s", err.Error()) |
| 188 | + debug.PrintStack() |
| 189 | + return err |
| 190 | + } |
| 191 | + |
| 192 | + // read stdout |
| 193 | + go func() { |
| 194 | + for { |
| 195 | + line, err := readerStdout.ReadString('\n') |
| 196 | + if err != nil { |
| 197 | + break |
| 198 | + } |
| 199 | + line = strings.Replace(line, "\n", "", -1) |
| 200 | + _ = model.AddLogItem(model.LogItem{ |
| 201 | + Id: bson.NewObjectId(), |
| 202 | + Message: line, |
| 203 | + TaskId: t.Id, |
| 204 | + IsError: false, |
| 205 | + Ts: time.Now(), |
| 206 | + }) |
| 207 | + } |
| 208 | + }() |
| 209 | + |
| 210 | + // read stderr |
| 211 | + go func() { |
| 212 | + for { |
| 213 | + line, err := readerStderr.ReadString('\n') |
| 214 | + line = strings.Replace(line, "\n", "", -1) |
| 215 | + if err != nil { |
| 216 | + break |
| 217 | + } |
| 218 | + _ = model.AddLogItem(model.LogItem{ |
| 219 | + Id: bson.NewObjectId(), |
| 220 | + Message: line, |
| 221 | + TaskId: t.Id, |
| 222 | + IsError: true, |
| 223 | + Ts: time.Now(), |
| 224 | + }) |
| 225 | + } |
| 226 | + }() |
| 227 | + |
172 | 228 | return nil |
173 | 229 | } |
174 | 230 |
|
@@ -260,7 +316,7 @@ func ExecuteShellCmd(cmdStr string, cwd string, t model.Task, s model.Spider) (e |
260 | 316 | cmd.Dir = cwd |
261 | 317 |
|
262 | 318 | // 日志配置 |
263 | | - if err := SetLogConfig(cmd, t.LogPath); err != nil { |
| 319 | + if err := SetLogConfig(cmd, t); err != nil { |
264 | 320 | return err |
265 | 321 | } |
266 | 322 |
|
@@ -566,54 +622,60 @@ func SpiderFileCheck(t model.Task, spider model.Spider) error { |
566 | 622 | return nil |
567 | 623 | } |
568 | 624 |
|
569 | | -func GetTaskLog(id string) (logStr string, err error) { |
| 625 | +func GetTaskLog(id string) (logItems []model.LogItem, err error) { |
570 | 626 | task, err := model.GetTask(id) |
571 | | - |
572 | 627 | if err != nil { |
573 | 628 | return |
574 | 629 | } |
575 | 630 |
|
576 | | - if IsMasterNode(task.NodeId.Hex()) { |
577 | | - if !utils.Exists(task.LogPath) { |
578 | | - fileDir, err := MakeLogDir(task) |
579 | | - |
580 | | - if err != nil { |
581 | | - log.Errorf(err.Error()) |
582 | | - } |
583 | | - |
584 | | - fileP := GetLogFilePaths(fileDir, task) |
585 | | - |
586 | | - // 获取日志文件路径 |
587 | | - fLog, err := os.Create(fileP) |
588 | | - defer fLog.Close() |
589 | | - if err != nil { |
590 | | - log.Errorf("create task log file error: %s", fileP) |
591 | | - debug.PrintStack() |
592 | | - } |
593 | | - task.LogPath = fileP |
594 | | - if err := task.Save(); err != nil { |
595 | | - log.Errorf(err.Error()) |
596 | | - debug.PrintStack() |
597 | | - } |
598 | | - |
599 | | - } |
600 | | - // 若为主节点,获取本机日志 |
601 | | - logBytes, err := model.GetLocalLog(task.LogPath) |
602 | | - if err != nil { |
603 | | - log.Errorf(err.Error()) |
604 | | - logStr = err.Error() |
605 | | - } else { |
606 | | - logStr = utils.BytesToString(logBytes) |
607 | | - } |
608 | | - return logStr, err |
609 | | - } |
610 | | - // 若不为主节点,获取远端日志 |
611 | | - logStr, err = GetRemoteLog(task) |
| 631 | + logItems, err = task.GetLogItems() |
612 | 632 | if err != nil { |
613 | | - log.Errorf(err.Error()) |
614 | | - |
615 | | - } |
616 | | - return logStr, err |
| 633 | + return logItems, err |
| 634 | + } |
| 635 | + |
| 636 | + return logItems, nil |
| 637 | + |
| 638 | + //if IsMasterNode(task.NodeId.Hex()) { |
| 639 | + // if !utils.Exists(task.LogPath) { |
| 640 | + // fileDir, err := MakeLogDir(task) |
| 641 | + // |
| 642 | + // if err != nil { |
| 643 | + // log.Errorf(err.Error()) |
| 644 | + // } |
| 645 | + // |
| 646 | + // fileP := GetLogFilePaths(fileDir, task) |
| 647 | + // |
| 648 | + // // 获取日志文件路径 |
| 649 | + // fLog, err := os.Create(fileP) |
| 650 | + // defer fLog.Close() |
| 651 | + // if err != nil { |
| 652 | + // log.Errorf("create task log file error: %s", fileP) |
| 653 | + // debug.PrintStack() |
| 654 | + // } |
| 655 | + // task.LogPath = fileP |
| 656 | + // if err := task.Save(); err != nil { |
| 657 | + // log.Errorf(err.Error()) |
| 658 | + // debug.PrintStack() |
| 659 | + // } |
| 660 | + // |
| 661 | + // } |
| 662 | + // // 若为主节点,获取本机日志 |
| 663 | + // logBytes, err := model.GetLocalLog(task.LogPath) |
| 664 | + // if err != nil { |
| 665 | + // log.Errorf(err.Error()) |
| 666 | + // logStr = err.Error() |
| 667 | + // } else { |
| 668 | + // logStr = utils.BytesToString(logBytes) |
| 669 | + // } |
| 670 | + // return logStr, err |
| 671 | + //} |
| 672 | + //// 若不为主节点,获取远端日志 |
| 673 | + //logStr, err = GetRemoteLog(task) |
| 674 | + //if err != nil { |
| 675 | + // log.Errorf(err.Error()) |
| 676 | + // |
| 677 | + //} |
| 678 | + //return logStr, err |
617 | 679 | } |
618 | 680 |
|
619 | 681 | func CancelTask(id string) (err error) { |
|
0 commit comments