func (s *SkynetDaemon) LogLevel(requestInfo *skynet.RequestInfo, in daemon.LogLevelRequest, out *daemon.LogLevelResponse) (err error) { log.SetLogLevel(log.LevelFromString(in.Level)) out.Ok = true out.Level = in.Level return }
func init() { flagset := flag.NewFlagSet("config", flag.ContinueOnError) flagset.StringVar(&configFile, "config", "", "Config File") flagset.StringVar(&uuid, "uuid", "", "uuid") args, _ := SplitFlagsetFromArgs(flagset, os.Args[1:]) flagset.Parse(args) // Ensure we have a UUID if uuid == "" { uuid = NewUUID() } if configFile == "" { for _, f := range defaultConfigFiles { if _, err := os.Stat(f); err == nil { configFile = f break } } } if configFile == "" { log.Println(log.ERROR, "Failed to find config file") conf = config.NewDefault() return } if _, err := os.Stat(configFile); os.IsNotExist(err) { log.Println(log.ERROR, "Config file does not exist", err) conf = config.NewDefault() return } var err error if conf, err = config.ReadDefault(configFile); err != nil { conf = config.NewDefault() log.Fatal(err) } // Set default log level from config, this can be overriden at the service level when the service is created if l, err := conf.RawStringDefault("log.level"); err == nil { log.SetLogLevel(log.LevelFromString(l)) } // Set default log level from config, this can be overriden at the service level when the service is created if lh, err := conf.RawStringDefault("log.sysloghost"); err == nil { log.SetSyslogHost(lh) } // Set syslog port if i, err := conf.Int("DEFAULT", "log.syslogport"); err == nil { log.SetSyslogPort(i) } // Set GOMAXPROCS if i, err := conf.Int("DEFAULT", "runtime.gomaxprocs"); err == nil { runtime.GOMAXPROCS(i) } }
// Wraps your custom service in Skynet func CreateService(sd ServiceDelegate, si *skynet.ServiceInfo) (s *Service) { s = &Service{ Delegate: sd, ServiceInfo: si, methods: make(map[string]reflect.Value), connectionChan: make(chan *net.TCPConn), registeredChan: make(chan bool), shutdownChan: make(chan bool), ClientInfo: make(map[string]ClientInfo), shuttingDown: false, } // Override LogLevel for Service if l, err := config.String(s.Name, s.Version, "log.level"); err != nil { log.SetLogLevel(log.LevelFromString(l)) } // I hope I can just rip all this out /* logWriter := log.NewMultiWriter() if logStdout, err := config.Bool(s.Name, s.Version, "service.log.stdout"); err == nil { if logStdout { logWriter.AddWriter(os.Stdout) } } else { // Stdout is enabled by default logWriter.AddWriter(os.Stdout) } if logFile, err := config.String(s.Name, s.Version, "service.log.file"); err == nil { f, err := os.OpenFile(logFile, os.O_WRONLY|os.O_APPEND|os.O_CREATE, 0660) if err != nil { log.Println(log.PANIC,"Failed to open log file: ", logFile, err) } logWriter.AddWriter(f) } log.SetOutput(logWriter) */ // the main rpc server s.RPCServ = rpc.NewServer() rpcForwarder := NewServiceRPC(s) s.RPCServ.RegisterName(si.Name, rpcForwarder) // Daemon doesn't accept commands over pipe if si.Name != "SkynetDaemon" { // Listen for admin requests go s.serveAdminRequests() } return }
func (s *Service) serveAdminRequests() { rId := os.Stderr.Fd() + 2 wId := os.Stderr.Fd() + 3 pipeReader := os.NewFile(uintptr(rId), "") pipeWriter := os.NewFile(uintptr(wId), "") s.pipe = daemon.NewPipe(pipeReader, pipeWriter) b := make([]byte, daemon.MAX_PIPE_BYTES) for { n, err := s.pipe.Read(b) if err != nil { if err != io.EOF { log.Printf(log.ERROR, "Error reading from admin pipe "+err.Error()) } else { // We received EOF, ensure we shutdown (if daemon died we could be orphaned) s.Shutdown() } return } cmd := string(b[:n]) log.Println(log.TRACE, "Received "+cmd+" from daemon") switch cmd { case "SHUTDOWN": s.Shutdown() s.pipe.Write([]byte("ACK")) break case "REGISTER": s.Register() s.pipe.Write([]byte("ACK")) case "UNREGISTER": s.Unregister() s.pipe.Write([]byte("ACK")) case "LOG DEBUG", "LOG TRACE", "LOG INFO", "LOG WARN", "LOG ERROR", "LOG FATAL", "LOG PANIC": parts := strings.Split(cmd, " ") log.SetLogLevel(log.LevelFromString(parts[1])) log.Println(log.INFO, "Setting log level to "+parts[1]) s.pipe.Write([]byte("ACK")) } } }