syslog.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  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.Config["syslog-tag"]
  26. if tag == "" {
  27. tag = ctx.ContainerID[:12]
  28. }
  29. proto, address, err := parseAddress(ctx.Config["syslog-address"])
  30. if err != nil {
  31. return nil, err
  32. }
  33. log, err := syslog.Dial(
  34. proto,
  35. address,
  36. syslog.LOG_DAEMON,
  37. path.Base(os.Args[0])+"/"+tag,
  38. )
  39. if err != nil {
  40. return nil, err
  41. }
  42. return &Syslog{
  43. writer: log,
  44. }, nil
  45. }
  46. func (s *Syslog) Log(msg *logger.Message) error {
  47. if msg.Source == "stderr" {
  48. return s.writer.Err(string(msg.Line))
  49. }
  50. return s.writer.Info(string(msg.Line))
  51. }
  52. func (s *Syslog) Close() error {
  53. return s.writer.Close()
  54. }
  55. func (s *Syslog) Name() string {
  56. return name
  57. }
  58. func (s *Syslog) GetReader() (io.Reader, error) {
  59. return nil, logger.ReadLogsNotSupported
  60. }
  61. func parseAddress(address string) (string, string, error) {
  62. if urlutil.IsTransportURL(address) {
  63. url, err := url.Parse(address)
  64. if err != nil {
  65. return "", "", err
  66. }
  67. // unix socket validation
  68. if url.Scheme == "unix" {
  69. if _, err := os.Stat(url.Path); err != nil {
  70. return "", "", err
  71. }
  72. return url.Scheme, url.Path, nil
  73. }
  74. // here we process tcp|udp
  75. host := url.Host
  76. if _, _, err := net.SplitHostPort(host); err != nil {
  77. if !strings.Contains(err.Error(), "missing port in address") {
  78. return "", "", err
  79. }
  80. host = host + ":514"
  81. }
  82. return url.Scheme, host, nil
  83. }
  84. return "", "", nil
  85. }