From c7736b7de585dfbc45d4ccffd5fb23652b40aa62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arkadiusz=20Rychli=C5=84ski?= Date: Tue, 14 Mar 2023 12:12:16 +0100 Subject: [PATCH] Initial version --- .gitignore | 1 + README.md | 39 +++++++++++++++++++++++++++++++- flsend.go | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ go.mod | 9 ++++++++ go.sum | 36 ++++++++++++++++++++++++++++++ 5 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 .gitignore create mode 100644 flsend.go create mode 100644 go.mod create mode 100644 go.sum diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7bebf08 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/flsend diff --git a/README.md b/README.md index 959eea8..a5d5bad 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,40 @@ # flsend -Simple tool to send message to fluent \ No newline at end of file +Simple tool to send message to fluent + +## Building + + +```sh +go install go.ar76.eu/arek/flsend@latest +``` + +## Usage + +Parameters: + +``` +Usage of flsend: + -host string + Fluentd address (default "localhost") + -port int + Fluentd port (default 24224) + -prefix string + Tag preffix (application name) (default "flsend") + -tag string + Message tag (required) +``` + +Message is read from the standard input and send to fluentd with tag composed of{prefix}.{tag}. + +Eg. + +```sh +echo '{"msg": "Message description"}' | flsend -host 10.10.10.10 -tag test +``` + +saves the message in fluentd as + +``` +2023-03-14T16:10:54+00:00 flsend.test {"msg":"Message description"} +``` diff --git a/flsend.go b/flsend.go new file mode 100644 index 0000000..c34463a --- /dev/null +++ b/flsend.go @@ -0,0 +1,65 @@ +package main + +import ( + "encoding/json" + "flag" + "fmt" + "io" + "os" + "time" + + "github.com/fluent/fluent-logger-golang/fluent" +) + +var ( + fluentHost string + fluentPort int + tagPrefix string + tag string + msg string +) + +func main() { + flag.StringVar(&fluentHost, "host", "localhost", "Fluentd address") + flag.IntVar(&fluentPort, "port", 24224, "Fluentd port") + flag.StringVar(&tagPrefix, "prefix", "flsend", "Tag preffix (application name)") + flag.StringVar(&tag, "tag", "", "Message tag (required)") + + flag.Parse() + if tag == "" { + fmt.Fprintf(os.Stderr, "Error: the --tag flag is required\n\n"); + flag.PrintDefaults() + os.Exit(1) + } + + cfg := fluent.Config{ + SubSecondPrecision: true, + FluentHost: fluentHost, + FluentPort: fluentPort, + TagPrefix: tagPrefix, + RequestAck: true, + } + + msg := make(map[string]any) + + bytes, err := io.ReadAll(os.Stdin) + if err != nil { + panic(err) + } + err = json.Unmarshal(bytes, &msg) + if err != nil { + panic(err) + } + + logger, err := fluent.New(cfg) + if err != nil { + panic(err) + } + defer logger.Close() + + err = logger.PostWithTime(tag, time.Now(), msg) + if err != nil { + panic(err) + } + +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..c5b095f --- /dev/null +++ b/go.mod @@ -0,0 +1,9 @@ +module go.ar76.eu/arek/flsend + +go 1.20 + +require ( + github.com/fluent/fluent-logger-golang v1.9.0 // indirect + github.com/philhofer/fwd v1.1.2 // indirect + github.com/tinylib/msgp v1.1.8 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..bb4434f --- /dev/null +++ b/go.sum @@ -0,0 +1,36 @@ +github.com/fluent/fluent-logger-golang v1.9.0 h1:zUdY44CHX2oIUc7VTNZc+4m+ORuO/mldQDA7czhWXEg= +github.com/fluent/fluent-logger-golang v1.9.0/go.mod h1:2/HCT/jTy78yGyeNGQLGQsjF3zzzAuy6Xlk6FCMV5eU= +github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= +github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= +github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= +github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=