forked from boyska/circolog
Compare commits
9 commits
7dc3b5a7bb
...
da813a3fd5
Author | SHA1 | Date | |
---|---|---|---|
da813a3fd5 | |||
d3799d19f9 | |||
b9c94870fa | |||
2e1ab137ea | |||
02b41aa661 | |||
c5eee0ea22 | |||
aef8a277e5 | |||
2280e2963a | |||
00cb135913 |
6 changed files with 109 additions and 6 deletions
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
[submodule "vendor/gopkg.in/mcuadros/go-syslog.v2"]
|
||||||
|
path = vendor/gopkg.in/mcuadros/go-syslog.v2
|
||||||
|
url = https://github.com/boyska/go-syslog
|
|
@ -57,11 +57,14 @@ func main() {
|
||||||
addr := flag.String("addr", "localhost:9080", "http service address")
|
addr := flag.String("addr", "localhost:9080", "http service address")
|
||||||
querySocket := flag.String("socket", "", "Path to a unix domain socket for the HTTP server")
|
querySocket := flag.String("socket", "", "Path to a unix domain socket for the HTTP server")
|
||||||
backlogLimit := flag.Int("n", -1, "Limit the backlog length, defaults to no limit (-1)")
|
backlogLimit := flag.Int("n", -1, "Limit the backlog length, defaults to no limit (-1)")
|
||||||
|
var format formatter.Format
|
||||||
|
format = formatter.FormatSyslog
|
||||||
|
flag.Var(&format, "fmt", "Output format [syslog|json]")
|
||||||
var filter filtering.ExprValue
|
var filter filtering.ExprValue
|
||||||
flag.Var(&filter, "where", "sql-like query to filter logs")
|
flag.Var(&filter, "where", "sql-like query to filter logs")
|
||||||
// TODO: change to color-mode=auto/no/always
|
// TODO: change to color-mode=auto/no/always
|
||||||
hasColor := BoolAuto_AUTO
|
hasColor := BoolAuto_AUTO
|
||||||
flag.Var(&hasColor, "color", "dis/enable colors")
|
flag.Var(&hasColor, "color", "dis/enable colors; yes/no/auto")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if hasColor == BoolAuto_NO || (!isatty.IsTerminal(os.Stdout.Fd()) && hasColor != BoolAuto_YES) {
|
if hasColor == BoolAuto_NO || (!isatty.IsTerminal(os.Stdout.Fd()) && hasColor != BoolAuto_YES) {
|
||||||
|
@ -120,10 +123,12 @@ func main() {
|
||||||
if !filter.Validate(parsed) {
|
if !filter.Validate(parsed) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if err := formatter.WriteFormatted(os.Stdout, formatter.FormatSyslog, parsed); err != nil {
|
if err := formatter.WriteFormatted(os.Stdout, format, parsed); err != nil {
|
||||||
log.Println("error printing", err)
|
log.Println("error printing", err)
|
||||||
}
|
}
|
||||||
fmt.Println()
|
if format == formatter.FormatSyslog { // oops
|
||||||
|
fmt.Println()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
|
58
data/data_test.go
Normal file
58
data/data_test.go
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
package data
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"gopkg.in/mcuadros/go-syslog.v2/format"
|
||||||
|
)
|
||||||
|
|
||||||
|
var timeNow = time.Now()
|
||||||
|
|
||||||
|
var returnValues = map[string]interface{}{
|
||||||
|
"prog": "test_app",
|
||||||
|
"client": "test_client",
|
||||||
|
"host": "my_machine",
|
||||||
|
"msg": "test message",
|
||||||
|
"sev": 3,
|
||||||
|
"time": timeNow,
|
||||||
|
}
|
||||||
|
|
||||||
|
var msgRFC5424 = format.LogParts{
|
||||||
|
"version": 1,
|
||||||
|
"app_name": returnValues["prog"],
|
||||||
|
"client": returnValues["client"],
|
||||||
|
"hostname": returnValues["host"],
|
||||||
|
"proc_id": "spam_process",
|
||||||
|
"message": returnValues["msg"],
|
||||||
|
"facility": "hell",
|
||||||
|
"timestamp": returnValues["time"],
|
||||||
|
"severity": returnValues["sev"],
|
||||||
|
}
|
||||||
|
|
||||||
|
var msgRFC3164 = format.LogParts{
|
||||||
|
"tag": returnValues["prog"],
|
||||||
|
"client": returnValues["client"],
|
||||||
|
"hostname": returnValues["host"],
|
||||||
|
"content": returnValues["msg"],
|
||||||
|
"severity": returnValues["sev"],
|
||||||
|
"timestamp": returnValues["time"],
|
||||||
|
"proc_id": "spam_process",
|
||||||
|
}
|
||||||
|
|
||||||
|
var testMessages = []format.LogParts{
|
||||||
|
msgRFC5424,
|
||||||
|
msgRFC3164,
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestLogEntryToMessage(t *testing.T) {
|
||||||
|
for _, msg := range testMessages {
|
||||||
|
parsedMsg := LogEntryToMessage(msg)
|
||||||
|
|
||||||
|
for key, value := range returnValues {
|
||||||
|
if data, ok := parsedMsg[key]; !ok || data != value {
|
||||||
|
t.Errorf("Missing/wrong key: %s\nmsg: %s\nparsed msg: %s\n", key, value, data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -27,6 +27,41 @@ endless, we tried to document some common setups.
|
||||||
|
|
||||||
#### Use Case: circologd receiving messages from syslog-ng
|
#### Use Case: circologd receiving messages from syslog-ng
|
||||||
|
|
||||||
|
Put this in `/etc/syslog-ng/conf.d/circolog.conf`
|
||||||
|
|
||||||
|
```
|
||||||
|
destination d_circolog {
|
||||||
|
unix-dgram("/run/circolog/syslog.sock"
|
||||||
|
flags(syslog-protocol)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
log { source(s_src); destination(d_circolog); };
|
||||||
|
```
|
||||||
|
|
||||||
|
This doesn't tell syslog-ng not to log to disk.
|
||||||
|
|
||||||
|
Change `/etc/syslog-ng.conf` according to your need.
|
||||||
|
|
||||||
|
#### Use Case: circologd receiving messages from rsyslog
|
||||||
|
|
||||||
|
rsyslogd can easily be configured to send every message to circolog:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ModLoad omuxsock
|
||||||
|
$OMUxSockSocket /tmp/circolog.sock
|
||||||
|
*.* :omuxsock:
|
||||||
|
```
|
||||||
|
|
||||||
|
If you want to force messages of level `debug` and `info` not to be logged to disk, you can put this snippet
|
||||||
|
at the **top** of the rules
|
||||||
|
|
||||||
|
```
|
||||||
|
$ModLoad omuxsock
|
||||||
|
$OMUxSockSocket /tmp/circolog.sock
|
||||||
|
*.* :omuxsock:
|
||||||
|
*.=debug;*.=info stop
|
||||||
|
```
|
||||||
|
|
||||||
#### Use Case: circologd receiving messages from journald
|
#### Use Case: circologd receiving messages from journald
|
||||||
|
|
||||||
[TODO: il codice va ancora scritto: bisogna bindare /run/systemd/journal/syslog
|
[TODO: il codice va ancora scritto: bisogna bindare /run/systemd/journal/syslog
|
||||||
|
|
|
@ -3,11 +3,12 @@ package circolog
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"git.lattuga.net/boyska/circolog/data"
|
||||||
"gopkg.in/mcuadros/go-syslog.v2/format"
|
"gopkg.in/mcuadros/go-syslog.v2/format"
|
||||||
)
|
)
|
||||||
|
|
||||||
func msg(s string) format.LogParts {
|
func msg(s string) format.LogParts {
|
||||||
return format.LogParts{"text": s}
|
return format.LogParts{"content": s}
|
||||||
}
|
}
|
||||||
|
|
||||||
func hubCount(h Hub) int {
|
func hubCount(h Hub) int {
|
||||||
|
@ -19,10 +20,10 @@ var DefaultClient ClientOptions = ClientOptions{Nofollow: true, BacklogLength: -
|
||||||
func hubToArrayOpt(h Hub, opt ClientOptions) []string {
|
func hubToArrayOpt(h Hub, opt ClientOptions) []string {
|
||||||
r := make([]string, 0)
|
r := make([]string, 0)
|
||||||
cl := Client{Options: opt}
|
cl := Client{Options: opt}
|
||||||
cl.Messages = make(chan format.LogParts)
|
cl.Messages = make(chan data.Message)
|
||||||
h.Register <- cl
|
h.Register <- cl
|
||||||
for m := range cl.Messages {
|
for m := range cl.Messages {
|
||||||
r = append(r, m["text"].(string))
|
r = append(r, m["msg"].(string))
|
||||||
}
|
}
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
1
vendor/gopkg.in/mcuadros/go-syslog.v2
generated
vendored
Submodule
1
vendor/gopkg.in/mcuadros/go-syslog.v2
generated
vendored
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit a127d826d6c27489d377b3c080bd256d8f8093a6
|
Loading…
Reference in a new issue