github.com/circular-dark/docker@v1.7.0/daemon/logger/syslog/syslog.go (about)

     1  // +build linux
     2  
     3  package syslog
     4  
     5  import (
     6  	"io"
     7  	"log/syslog"
     8  	"net"
     9  	"net/url"
    10  	"os"
    11  	"path"
    12  	"strings"
    13  
    14  	"github.com/Sirupsen/logrus"
    15  	"github.com/docker/docker/daemon/logger"
    16  	"github.com/docker/docker/pkg/urlutil"
    17  )
    18  
    19  const name = "syslog"
    20  
    21  type Syslog struct {
    22  	writer *syslog.Writer
    23  }
    24  
    25  func init() {
    26  	if err := logger.RegisterLogDriver(name, New); err != nil {
    27  		logrus.Fatal(err)
    28  	}
    29  }
    30  
    31  func New(ctx logger.Context) (logger.Logger, error) {
    32  	tag := ctx.ContainerID[:12]
    33  
    34  	proto, address, err := parseAddress(ctx.Config["syslog-address"])
    35  	if err != nil {
    36  		return nil, err
    37  	}
    38  
    39  	log, err := syslog.Dial(
    40  		proto,
    41  		address,
    42  		syslog.LOG_DAEMON,
    43  		path.Base(os.Args[0])+"/"+tag,
    44  	)
    45  	if err != nil {
    46  		return nil, err
    47  	}
    48  
    49  	return &Syslog{
    50  		writer: log,
    51  	}, nil
    52  }
    53  
    54  func (s *Syslog) Log(msg *logger.Message) error {
    55  	if msg.Source == "stderr" {
    56  		return s.writer.Err(string(msg.Line))
    57  	}
    58  	return s.writer.Info(string(msg.Line))
    59  }
    60  
    61  func (s *Syslog) Close() error {
    62  	return s.writer.Close()
    63  }
    64  
    65  func (s *Syslog) Name() string {
    66  	return name
    67  }
    68  
    69  func (s *Syslog) GetReader() (io.Reader, error) {
    70  	return nil, logger.ReadLogsNotSupported
    71  }
    72  
    73  func parseAddress(address string) (string, string, error) {
    74  	if urlutil.IsTransportURL(address) {
    75  		url, err := url.Parse(address)
    76  		if err != nil {
    77  			return "", "", err
    78  		}
    79  
    80  		// unix socket validation
    81  		if url.Scheme == "unix" {
    82  			if _, err := os.Stat(url.Path); err != nil {
    83  				return "", "", err
    84  			}
    85  			return url.Scheme, url.Path, nil
    86  		}
    87  
    88  		// here we process tcp|udp
    89  		host := url.Host
    90  		if _, _, err := net.SplitHostPort(host); err != nil {
    91  			if !strings.Contains(err.Error(), "missing port in address") {
    92  				return "", "", err
    93  			}
    94  			host = host + ":514"
    95  		}
    96  
    97  		return url.Scheme, host, nil
    98  	}
    99  
   100  	return "", "", nil
   101  }