From 9c753d6d320c8744b089a4aba422d66f141d89a9 Mon Sep 17 00:00:00 2001 From: Attilio Greco Date: Wed, 22 May 2024 15:18:16 +0200 Subject: [PATCH 1/2] update deprecated function --- flog_test.go | 2 +- main.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/flog_test.go b/flog_test.go index dd860ca..07753b9 100644 --- a/flog_test.go +++ b/flog_test.go @@ -11,7 +11,7 @@ import ( ) func ExampleNewLog() { - rand.Seed(11) + rand.New(rand.NewSource(11)) monkey.Patch(time.Now, func() time.Time { return stopped }) defer monkey.Unpatch(time.Now) diff --git a/main.go b/main.go index 164e399..ded7a68 100644 --- a/main.go +++ b/main.go @@ -8,7 +8,7 @@ import ( ) func main() { - rand.Seed(time.Now().UnixNano()) + rand.NewSource(time.Now().UnixNano()) opts := ParseOptions() if err := Run(opts); err != nil { cfmt.Warningln(err.Error()) From c85f175cb7897543656f9bd9e4d066b7e3d7e0d5 Mon Sep 17 00:00:00 2001 From: Attilio Greco Date: Wed, 22 May 2024 15:18:44 +0200 Subject: [PATCH 2/2] add syslog writer --- flog.go | 37 +++++++++++++++++++++++++++---------- option.go | 17 +++++++++++++++-- 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/flog.go b/flog.go index 896026b..95ad7a3 100644 --- a/flog.go +++ b/flog.go @@ -4,6 +4,8 @@ import ( "compress/gzip" "fmt" "io" + "log/syslog" + "net/url" "os" "path/filepath" "strconv" @@ -29,8 +31,8 @@ func Generate(option *Option) error { interval = option.Sleep } - logFileName := option.Output - writer, err := NewWriter(option.Type, logFileName) + outPut := option.Output + writer, err := NewWriter(option.Type, outPut) if err != nil { return err } @@ -53,10 +55,10 @@ func Generate(option *Option) error { if (option.Type != "stdout") && (option.SplitBy > 0) && (line > option.SplitBy*splitCount) { _ = writer.Close() - fmt.Println(logFileName, "is created.") + fmt.Println(outPut, "is created.") - logFileName = NewSplitFileName(option.Output, splitCount) - writer, _ = NewWriter(option.Type, logFileName) + outPut = NewSplitFileName(option.Output, splitCount) + writer, _ = NewWriter(option.Type, outPut) splitCount++ } @@ -73,10 +75,10 @@ func Generate(option *Option) error { bytes += len(log) if (option.Type != "stdout") && (option.SplitBy > 0) && (bytes > option.SplitBy*splitCount+1) { _ = writer.Close() - fmt.Println(logFileName, "is created.") + fmt.Println(outPut, "is created.") - logFileName = NewSplitFileName(option.Output, splitCount) - writer, _ = NewWriter(option.Type, logFileName) + outPut = NewSplitFileName(option.Output, splitCount) + writer, _ = NewWriter(option.Type, outPut) splitCount++ } @@ -86,23 +88,38 @@ func Generate(option *Option) error { if option.Type != "stdout" { _ = writer.Close() - fmt.Println(logFileName, "is created.") + fmt.Println(outPut, "is created.") } return nil } // NewWriter returns a closeable writer corresponding to given log type -func NewWriter(logType string, logFileName string) (io.WriteCloser, error) { +func NewWriter(logType string, outPut string) (io.WriteCloser, error) { switch logType { case "stdout": return os.Stdout, nil + case "syslog": + connectionString := outPut + conn, err := url.Parse(connectionString) + if err != nil { + return nil, err + } + + sysLog, err := syslog.Dial(conn.Scheme, conn.Host, syslog.LOG_WARNING|syslog.LOG_DAEMON, "demotag") + if err != nil { + return nil, err + } + + return sysLog, nil case "log": + logFileName := outPut logFile, err := os.Create(logFileName) if err != nil { return nil, err } return logFile, nil case "gz": + logFileName := outPut logFile, err := os.Create(logFileName) if err != nil { return nil, err diff --git a/option.go b/option.go index 9b92b21..7e48897 100644 --- a/option.go +++ b/option.go @@ -3,6 +3,7 @@ package main import ( "errors" "fmt" + "net/url" "os" "strconv" "strings" @@ -46,7 +47,7 @@ Options: ` var validFormats = []string{"apache_common", "apache_combined", "apache_error", "rfc3164", "rfc5424", "common_log", "json"} -var validTypes = []string{"stdout", "log", "gz"} +var validTypes = []string{"stdout", "syslog", "log", "gz"} // Option defines log generator options type Option struct { @@ -173,7 +174,7 @@ func ParseOptions() *Option { help := pflag.BoolP("help", "h", false, "Show this help message") version := pflag.BoolP("version", "v", false, "Show version") format := pflag.StringP("format", "f", opts.Format, "Log format") - output := pflag.StringP("output", "o", opts.Output, "Path-like output filename") + output := pflag.StringP("output", "o", opts.Output, "Path-like output filename or IP address (for syslog)") logType := pflag.StringP("type", "t", opts.Type, "Log output type") number := pflag.IntP("number", "n", opts.Number, "Number of lines to generate") bytes := pflag.IntP("bytes", "b", opts.Bytes, "Size of logs to generate. (in bytes)") @@ -214,6 +215,18 @@ func ParseOptions() *Option { if opts.SplitBy, err = ParseSplitBy(*splitBy); err != nil { errorExit(err) } + + if opts.Type == "syslog" { + connectionString := *output + conn, err := url.Parse(connectionString) + if err != nil { + errorExit(err) + } + if (conn.Scheme == "" || conn.Host == "") || conn.Port() == "" { + errorExit(errors.New("invalid syslog address format. Please use the format: protocol://host:port (e.g. udp://localhost:514)")) + } + } + opts.Output = *output opts.Overwrite = *overwrite opts.Forever = *forever