code: func (l *Logger) Start() error {
  	// initialize mutex on start
  	l.fileMu = new(sync.RWMutex)
  
  	var err error
  
  selectwriter:
  	switch l.Output {
  	case "", "stderr":
  		l.writer = os.Stderr
  
  	case "stdout":
  		l.writer = os.Stdout
  
  	case "syslog":
  		l.writer, err = gsyslog.NewLogger(gsyslog.LOG_ERR, "LOCAL0", "caddy")
  		if err != nil {
  			return err
  		}
  	default:
  
  		if address := parseSyslogAddress(l.Output); address != nil {
  			l.writer, err = gsyslog.DialLogger(address.network, address.address, gsyslog.LOG_ERR, "LOCAL0", "caddy")
  
  			if err != nil {
  				return err
  			}
  
  			break selectwriter
  		}
  
  		var file *os.File
  
  		file, err = os.OpenFile(l.Output, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0644)
  		if err != nil {
  			return err
  		}
  
  		if l.Roller != nil {
  			file.Close()
  			l.Roller.Filename = l.Output
  			l.writer = l.Roller.GetLogWriter()
  		} else {
  			l.writer = file
  		}
  	}
  
  	l.Logger = log.New(l.writer, "", 0)
  
  	return nil
  
  }
docs: // Start initializes logger opening files or local/remote syslog connections