nikepan / clickhouse-bulk

Collects many small inserts to ClickHouse and send in big inserts
Apache License 2.0
468 stars 87 forks source link

Make option to choose place for logs storing #32

Open lessfantasy opened 3 years ago

lessfantasy commented 3 years ago

Now all logs store in syslog, that is not very useful. Please, make option to choose place for logs storing (file, syslog, work without logging) and make possible to set up log level (for ex. I don't want to store logs like ' clickhouse-bulk[40680]: 2020/08/17 13:58:01 INFO: send 0 rows to ...')

ljluestc commented 4 months ago

package main

import (
    "flag"
    "log"
    "os"
    "log/syslog"
)

// Define flags for log output and level
var (
    logOutput = flag.String("log-output", "syslog", "Log output destination (file, syslog, none)")
    logFile   = flag.String("log-file", "clickhouse-bulk.log", "Log file path (if log-output is file)")
    logLevel  = flag.String("log-level", "info", "Log level (debug, info, warn, error)")
)

func main() {
    flag.Parse()

    // Setup logger based on the output destination
    switch *logOutput {
    case "file":
        file, err := os.OpenFile(*logFile, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
        if err != nil {
            log.Fatalf("Error opening log file: %v", err)
        }
        log.SetOutput(file)
    case "syslog":
        syslogWriter, err := syslog.New(syslog.LOG_NOTICE|syslog.LOG_DAEMON, "clickhouse-bulk")
        if err != nil {
            log.Fatalf("Error setting up syslog: %v", err)
        }
        log.SetOutput(syslogWriter)
    case "none":
        log.SetOutput(os.DevNull)
    default:
        log.Fatalf("Unsupported log output: %s", *logOutput)
    }

    // Example of setting up a simple log level check before logging
    // This is a basic implementation; for more complex scenarios consider using a logging library
    debugLog("This is a debug message")
    infoLog("This is an info message")
}

func debugLog(message string) {
    if *logLevel == "debug" {
        log.Println("DEBUG:", message)
    }
}

func infoLog(message string) {
    if *logLevel == "debug" || *logLevel == "info" {
        log.Println("INFO:", message)
    }
}