// +build linux

package syslog

import (
	"fmt"
	"io"
	"log/syslog"
	"os"
	"path"

	"github.com/Sirupsen/logrus"
	"github.com/docker/docker/daemon/logger"
)

const name = "syslog"

type Syslog struct {
	writer *syslog.Writer
}

func init() {
	if err := logger.RegisterLogDriver(name, New); err != nil {
		logrus.Fatal(err)
	}
}

func New(ctx logger.Context) (logger.Logger, error) {
	tag := ctx.ContainerID[:12]
	log, err := syslog.New(syslog.LOG_DAEMON, fmt.Sprintf("%s/%s", path.Base(os.Args[0]), tag))
	if err != nil {
		return nil, err
	}

	return &Syslog{
		writer: log,
	}, nil
}

func (s *Syslog) Log(msg *logger.Message) error {
	if msg.Source == "stderr" {
		return s.writer.Err(string(msg.Line))
	}
	return s.writer.Info(string(msg.Line))
}

func (s *Syslog) Close() error {
	return s.writer.Close()
}

func (s *Syslog) Name() string {
	return name
}

func (s *Syslog) GetReader() (io.Reader, error) {
	return nil, logger.ReadLogsNotSupported
}
