Docker daemon写日志关键代码

下面的代码解释了docker里面日志如何最终写到文件里的,代码的版本是1.9.1

// Start starts the containers process and monitors it according to the restart policy

func (m *containerMonitor) Start() error {

    var (

        err error

        exitStatus execdriver.ExitStatus

        // this variable indicates where we in execution flow:

        // before Run or after

        afterRun bool

    )

……………

    for {

        m.container.RestartCount++

        if err := m.container.startLogging(); err != nil {

            m.resetContainer(false)

            return err

        }

}}

   

   

   

func (container *Container) startLogging() error {

    cfg := container.getLogConfig()

    if cfg.Type == "none" {

        return nil // do not start logging routines

    }

    l, err := container.getLogger()

    if err != nil {

        return derr.ErrorCodeInitLogger.WithArgs(err)

    }

    copier := logger.NewCopier(container.ID, map[string]io.Reader{"stdout": container.StdoutPipe(), "stderr": container.StderrPipe()}, l)

    container.logCopier = copier

    copier.Run()

    container.logDriver = l

    // set LogPath field only for json-file logdriver

    if jl, ok := l.(*jsonfilelog.JSONFileLogger); ok {

        container.LogPath = jl.LogPath()

    }

    return nil

}

   

   

   

// Run starts logs copying

func (c *Copier) Run() {

    for src, w := range c.srcs {

        c.copyJobs.Add(1)

        go c.copySrc(src, w)

    }

}

   

   

func (c *Copier) copySrc(name string, src io.Reader) {

    defer c.copyJobs.Done()

    reader := bufio.NewReader(src)

    for {

        line, err := reader.ReadBytes('\n')

        line = bytes.TrimSuffix(line, []byte{'\n'})

        // ReadBytes can return full or partial output even when it failed.

        // e.g. it can return a full entry and EOF.

        if err == nil || len(line) > 0 {

            if logErr := c.dst.Log(&Message{ContainerID: c.cid, Line: line, Source: name, Timestamp: time.Now().UTC()}); logErr != nil {

                logrus.Errorf("Failed to log msg %q for logger %s: %s", line, c.dst.Name(), logErr)

            }

        }

        if err != nil {

            if err != io.EOF {

                logrus.Errorf("Error scanning log stream: %s", err)

            }

            return

        }

    }

}

   

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值