github.com/greenboxal/deis@v1.12.1/logger/main.go (about)

     1  package main
     2  
     3  import (
     4  	"flag"
     5  	"log"
     6  	"os"
     7  	"os/signal"
     8  	"strconv"
     9  	"syscall"
    10  	"time"
    11  
    12  	"github.com/deis/deis/logger/configurer"
    13  	"github.com/deis/deis/logger/publisher"
    14  	"github.com/deis/deis/logger/storage"
    15  	"github.com/deis/deis/logger/syslogish"
    16  	"github.com/deis/deis/logger/weblog"
    17  )
    18  
    19  var (
    20  	// TODO: When semver permits us to do so, many of these flags should probably be phased out in
    21  	// favor of just using environment variables.  Fewer avenues of configuring this component means
    22  	// less confusion.
    23  	logAddr       = flag.String("log-addr", "0.0.0.0", "bind address for the logger")
    24  	logHost       = flag.String("log-host", getopt("HOST", "127.0.0.1"), "address of the host running logger")
    25  	logPort       = flag.Int("log-port", 514, "bind port for the logger")
    26  	enablePublish = flag.Bool("enable-publish", false, "enable publishing to service discovery")
    27  	webAddr       = flag.String("web-addr", "0.0.0.0", "bind address for the web service")
    28  	webPort       = flag.Int("web-port", 8088, "bind port for the web service")
    29  	// Support legacy flag names even though the variable names have been changed for improved
    30  	// clarity
    31  	etcdHost        = flag.String("publish-host", getopt("HOST", "127.0.0.1"), "service discovery hostname")
    32  	etcdPort        = flag.String("publish-port", getopt("ETCD_PORT", "4001"), "service discovery port")
    33  	etcdPath        = flag.String("publish-path", getopt("ETCD_PATH", "/deis/logs"), "path to publish host/port information")
    34  	configInterval  = flag.Int("config-interval", 10, "config interval in seconds")
    35  	publishInterval = flag.Int("publish-interval", 10, "publish interval in seconds")
    36  	publishTTL      int
    37  )
    38  
    39  func init() {
    40  	flag.StringVar(&storage.LogRoot, "log-root", "/data/logs", "log path to store logs")
    41  	// Support a legacy behavior that that allows default drain uri to be specified using a drain-uri
    42  	// flag.
    43  	flag.StringVar(&configurer.DefaultDrainURI, "drain-uri", "", "default drainURI, once set in etcd, this has no effect.")
    44  	flag.Parse()
    45  	// Set the default value for this AFTER the proper value of *publishInterval has been
    46  	// established, since publishTTL should be twice the publishInterval by default.
    47  	flag.IntVar(&publishTTL, "publish-ttl", *publishInterval*2, "publish TTL in seconds")
    48  	// Now reparse flags in case the default publishTTL is overriden by a flag.
    49  	flag.Parse()
    50  }
    51  
    52  func main() {
    53  	syslogishServer, err := syslogish.NewServer(*logAddr, *logPort)
    54  	if err != nil {
    55  		log.Fatal("Error creating syslogish server", err)
    56  	}
    57  	weblogServer, err := weblog.NewServer(*webAddr, *webPort, syslogishServer)
    58  	if err != nil {
    59  		log.Fatal("Error creating weblog server", err)
    60  	}
    61  	etcdPortNum, err := strconv.Atoi(*etcdPort)
    62  	if err != nil {
    63  		log.Fatalf("Invalid port specified for etcd server.  '%s' is not an integer.", *etcdPort)
    64  	}
    65  	configurer, err := configurer.NewConfigurer(*etcdHost, etcdPortNum, *etcdPath, *configInterval,
    66  		syslogishServer)
    67  	if err != nil {
    68  		log.Fatal("Error creating configurer", err)
    69  	}
    70  
    71  	configurer.Start()
    72  
    73  	// Give configurer time to run once so we know syslogishServer is ready to rock
    74  	time.Sleep(time.Duration(*configInterval+1) * time.Second)
    75  
    76  	syslogishServer.Listen()
    77  	weblogServer.Listen()
    78  
    79  	if *enablePublish {
    80  		publisher, err := publisher.NewPublisher(*etcdHost, etcdPortNum, *etcdPath, *publishInterval,
    81  			publishTTL, *logHost, *logPort)
    82  		if err != nil {
    83  			log.Fatal("Error creating publisher", err)
    84  		}
    85  		publisher.Start()
    86  	}
    87  
    88  	log.Println("deis-logger running")
    89  
    90  	// No cleanup is needed upon termination.  The signal to reopen log files (after hypothetical
    91  	// logroation, for instance), if applicable, is the only signal we'll care about.  Our main loop
    92  	// will just wait for that signal.
    93  	reopen := make(chan os.Signal, 1)
    94  	signal.Notify(reopen, syscall.SIGUSR1)
    95  
    96  	for {
    97  		<-reopen
    98  		if err := syslogishServer.ReopenLogs(); err != nil {
    99  			log.Fatal("Error reopening logs", err)
   100  		}
   101  	}
   102  }
   103  
   104  func getopt(name, dfault string) string {
   105  	value := os.Getenv(name)
   106  	if value == "" {
   107  		value = dfault
   108  	}
   109  	return value
   110  }