syslog.go 1.7 KB

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