Skip to content

Commit 11748e9

Browse files
added an editorconfig file
1 parent a2fb11a commit 11748e9

File tree

5 files changed

+86
-81
lines changed

5 files changed

+86
-81
lines changed

Diff for: .editorconfig

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# top-most EditorConfig file
2+
root = true
3+
4+
# Matches multiple files with brace expansion notation
5+
[*.{js,py,html,css,go,ts,tsx,jsx,dart}]
6+
indent_style = space
7+
indent_size = 2

Diff for: jlog/lib/lib.go

+59-71
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@ import (
2121
"time"
2222
)
2323

24-
func WriteToStderr(args ...interface{}) {
24+
func writeToStderr(args ...interface{}) {
25+
safeStderr.Lock()
2526
if _, err := fmt.Fprintln(os.Stderr, args...); err != nil {
2627
fmt.Println("adcca45f-8d7b-4d4a-8fd2-7683b7b375b5", "could not write to stderr:", err)
2728
}
29+
safeStderr.Unlock()
2830
}
2931

3032
var safeStdout = writer.NewSafeWriter(os.Stdout)
@@ -43,6 +45,7 @@ type Logger struct {
4345
LockUuid string
4446
EnvPrefix string
4547
LogLevel shared.LogLevel
48+
File *os.File
4649
}
4750

4851
type LoggerParams struct {
@@ -56,10 +59,17 @@ type LoggerParams struct {
5659
LockUuid string
5760
EnvPrefix string
5861
LogLevel shared.LogLevel
62+
File *os.File
5963
}
6064

6165
func NewLogger(p LoggerParams) *Logger {
6266

67+
file := p.File
68+
69+
if file == nil {
70+
file = os.Stdout
71+
}
72+
6373
hostName := p.HostName
6474

6575
if hostName == "" {
@@ -87,7 +97,7 @@ func NewLogger(p LoggerParams) *Logger {
8797

8898
if os.Getenv("jlog_log_json") == "yes" {
8999
if p.ForceJSON {
90-
WriteToStderr("forceJSON:true was used, but the 'jlog_log_json' env var was set to 'yes'.")
100+
writeToStderr("forceJSON:true was used, but the 'jlog_log_json' env var was set to 'yes'.")
91101
}
92102
isLoggingJson = true
93103
}
@@ -128,6 +138,7 @@ func NewLogger(p LoggerParams) *Logger {
128138
LockUuid: p.LockUuid,
129139
EnvPrefix: p.EnvPrefix,
130140
LogLevel: p.LogLevel,
141+
File: file,
131142
}
132143
}
133144

@@ -276,8 +287,23 @@ func (l *Logger) Create(m *map[string]interface{}) *Logger {
276287
return l.Child(m)
277288
}
278289

279-
func (l *Logger) writePretty(level shared.LogLevel, m *MetaFields, args *[]interface{}) {
290+
func (l *Logger) writeToFile(level shared.LogLevel, m *MetaFields, args *[]interface{}) {
291+
b := l.getPrettyString(level, m, args)
292+
l.File.WriteString(b.String())
293+
// _, err := io.Copy(l.File, b.) // TODO: copy to file, instead of buffering b.String()
294+
}
295+
296+
type StrangBuilda struct {
297+
strings.Builder
298+
}
299+
300+
func (s StrangBuilda) Read(b []byte) (int, error) {
301+
return 0, nil
302+
}
303+
304+
func (l *Logger) getPrettyString(level shared.LogLevel, m *MetaFields, args *[]interface{}) *strings.Builder {
280305

306+
var b strings.Builder
281307
date := time.Now().UTC().String()[11:25] // only first 25 chars
282308
stylizedLevel := "<undefined>"
283309

@@ -304,59 +330,13 @@ func (l *Logger) writePretty(level shared.LogLevel, m *MetaFields, args *[]inter
304330
break
305331
}
306332

307-
buf := []string{
308-
aurora.Gray(9, date).String(), " ",
309-
stylizedLevel, " ",
310-
aurora.Gray(12, "app:").String() + aurora.Italic(l.AppName).String(), " ",
311-
}
312-
313-
shared.M1.Lock()
314-
peekItem, err := lockStack.Peek()
315-
316-
if err != nil && peekItem != nil {
317-
panic("library error.")
318-
}
319-
320-
var doUnlock = false
321-
if peekItem != nil {
322-
323-
if peekItem.Id != l.LockUuid {
324-
//fmt.Println(fmt.Sprintf("%+v", lockStack))
325-
doUnlock = true
326-
shared.M1.Unlock()
327-
lockStack.Print("789")
328-
fmt.Println("here 1", peekItem.Id)
329-
peekItem.Lck.Lock()
330-
fmt.Println("here 2")
331-
defer func() {
332-
peekItem.Lck.Unlock()
333-
}()
334-
}
335-
//if peekItem.Id == l.LockUuid {
336-
// defer func() {
337-
// peekItem.Lck.Unlock()
338-
// lockStack.Pop()
339-
// }()
340-
//} else {
341-
// peekItem.Lck.Lock()
342-
// defer func() {
343-
// peekItem.Lck.Unlock()
344-
// }()
345-
//}
346-
}
347-
348-
if !doUnlock {
349-
shared.M1.Unlock()
350-
}
351-
352-
defer shared.M1.Unlock()
353-
shared.M1.Lock()
354-
355-
for _, v := range buf {
356-
if _, err := safeStdout.WriteString(v); err != nil {
357-
fmt.Println(err)
358-
}
359-
}
333+
b.WriteString(aurora.Gray(9, date).String())
334+
b.WriteString(" ")
335+
b.WriteString(stylizedLevel)
336+
b.WriteString(" ")
337+
b.WriteString(aurora.Gray(12, "app:").String())
338+
b.WriteString(aurora.Italic(l.AppName).String())
339+
b.WriteString(" [ ")
360340

361341
size := 0
362342

@@ -390,36 +370,38 @@ func (l *Logger) writePretty(level shared.LogLevel, m *MetaFields, args *[]inter
390370
size = size + len(s)
391371
}
392372

393-
if _, err := safeStdout.WriteString(s); err != nil {
394-
WriteToStderr("771c710b-aba2-46ef-9126-c26d3dfe7925", err)
373+
if _, err := b.WriteString(s); err != nil {
374+
writeToStderr("771c710b-aba2-46ef-9126-c26d3dfe7925", err)
395375
}
396376

397377
if !primitive && (level == shared.TRACE || level == shared.DEBUG) {
398378

399-
if _, err := safeStdout.WriteString("\n"); err != nil {
400-
WriteToStderr("18614292-658f-42a5-81e7-593e941ea857", err)
379+
if _, err := b.WriteString("\n"); err != nil {
380+
writeToStderr("18614292-658f-42a5-81e7-593e941ea857", err)
401381
}
402382

403-
if _, err := safeStdout.WriteString(fmt.Sprintf("sprintf: %+v", v)); err != nil {
404-
WriteToStderr("2a795ef2-65bb-4a03-9808-b072e4497d73", err)
383+
if _, err := b.WriteString(fmt.Sprintf("info as sprintf: %+v", v)); err != nil {
384+
writeToStderr("2a795ef2-65bb-4a03-9808-b072e4497d73", err)
405385
}
406386

407-
safeStdout.Write([]byte("json:"))
387+
b.Write([]byte("json:"))
408388
if x, err := json.Marshal(v); err == nil {
409-
if _, err := safeStdout.Write(x); err != nil {
410-
WriteToStderr("err:56831878-8d63-45f4-905b-d1b3bbac2152:", err)
389+
if _, err := b.Write(x); err != nil {
390+
writeToStderr("err:56831878-8d63-45f4-905b-d1b3bbac2152:", err)
411391
}
412392
} else {
413-
WriteToStderr("err:70bf10e0-6e69-4a3b-bf64-08f6d20c4580:", err)
393+
writeToStderr("err:70bf10e0-6e69-4a3b-bf64-08f6d20c4580:", err)
414394
}
415395

416396
}
417397

418398
}
419399

420-
if _, err := safeStdout.WriteString("\n"); err != nil {
421-
WriteToStderr("f834d14a-9735-4fd6-9389-f79144044746", err)
400+
if _, err := b.WriteString(" ] \n"); err != nil {
401+
writeToStderr("f834d14a-9735-4fd6-9389-f79144044746", err)
422402
}
403+
404+
return &b
423405
}
424406

425407
func (l *Logger) writeJSON(level shared.LogLevel, mf *MetaFields, args *[]interface{}) {
@@ -429,7 +411,11 @@ func (l *Logger) writeJSON(level shared.LogLevel, mf *MetaFields, args *[]interf
429411
var strLevel = shared.LevelToString[level]
430412
var pid = shared.PID
431413

432-
go func() {
414+
if mf == nil {
415+
mf = NewMetaFields(&MF{})
416+
}
417+
418+
shared.StdioPool.Run(func(g *sync.WaitGroup) {
433419

434420
// TODO: maybe manually generating JSON is better? prob not worth it
435421
buf, err := json.Marshal([8]interface{}{"@bunion:v1", l.AppName, strLevel, pid, l.HostName, date, mf.m, args})
@@ -456,6 +442,7 @@ func (l *Logger) writeJSON(level shared.LogLevel, mf *MetaFields, args *[]interf
456442

457443
if err != nil {
458444
fmt.Println(errors.New("Json-Logging: could not marshal the slice: " + err.Error()))
445+
g.Done()
459446
return
460447
}
461448
}
@@ -464,16 +451,17 @@ func (l *Logger) writeJSON(level shared.LogLevel, mf *MetaFields, args *[]interf
464451
safeStdout.Write(buf)
465452
safeStdout.Write([]byte("\n"))
466453
shared.M1.Unlock()
454+
g.Done()
467455

468-
}()
456+
})
469457

470458
}
471459

472460
func (l *Logger) writeSwitch(level shared.LogLevel, m *MetaFields, args *[]interface{}) {
473461
if l.IsLoggingJSON {
474462
l.writeJSON(level, m, args)
475463
} else {
476-
l.writePretty(level, m, args)
464+
l.getPrettyString(level, m, args)
477465
}
478466
}
479467

Diff for: jlog/mult/mult.go

+8-3
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,11 @@ func (l *MultLogger) writeJSON(level shared.LogLevel, mf *MetaFields, args *[]in
527527
var strLevel = shared.LevelToString[level]
528528
var pid = shared.PID
529529

530-
go func() {
530+
if mf == nil {
531+
mf = NewMetaFields(&MF{})
532+
}
533+
534+
shared.StdioPool.Run(func(g *sync.WaitGroup) {
531535

532536
// TODO - see if manually created JSON is faster
533537
buf, err := json.Marshal([8]interface{}{"@bunion:v1", l.AppName, strLevel, pid, l.HostName, date, mf.m, args})
@@ -583,17 +587,18 @@ func (l *MultLogger) writeJSON(level shared.LogLevel, mf *MetaFields, args *[]in
583587
}
584588

585589
v.lock.Lock()
586-
defer v.lock.Unlock()
590+
587591
if _, err := v.File.Write(buf); err != nil {
588592
l.writeToStderr("1944431c-d90f-4e41-975f-206da000d85d", err)
589593
}
590594
if _, err := v.File.Write([]byte("\n")); err != nil {
591595
l.writeToStderr("ea20aee7-862d-4596-8639-52073c835757", err)
592596
}
597+
593598
v.lock.Unlock()
594599

595600
}
596-
}()
601+
})
597602

598603
}
599604

Diff for: jlog/pool/pool.go

+9-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package pool
22

33
import (
4-
"fmt"
54
"sync"
65
)
76

87
type ChanMessage struct {
98
f func(*sync.WaitGroup)
109
wg *sync.WaitGroup
1110
}
11+
1212
type Worker struct {
1313
c chan *ChanMessage
1414
mtx sync.Mutex
@@ -39,8 +39,8 @@ func (p *Pool) createWorkers() {
3939
w.mtx.Lock()
4040
w.isBusy = true
4141
p.Count++
42-
fmt.Println("pool count:", p.Count, p.Size)
4342
m.f(m.wg)
43+
m.wg.Wait()
4444
p.Count--
4545
w.isBusy = false
4646
w.mtx.Unlock()
@@ -72,18 +72,18 @@ func (p *Pool) Run(z func(*sync.WaitGroup)) {
7272
var wg = &sync.WaitGroup{}
7373
wg.Add(1)
7474

75-
var m = &ChanMessage{
76-
f: z,
77-
wg: wg,
78-
}
79-
8075
if p.Count >= p.Size {
8176
p.mtx.Unlock()
8277
// queue is full, so just create a new goroutine here
8378
go z(wg)
8479
return
8580
}
8681

82+
var m = &ChanMessage{
83+
f: z,
84+
wg: wg,
85+
}
86+
8787
for _, v := range p.workers {
8888
if !v.isBusy {
8989
v.mtx.Lock()
@@ -98,11 +98,13 @@ func (p *Pool) Run(z func(*sync.WaitGroup)) {
9898
// couldn't find a non-busy one, so just round robin to next
9999
p.RoundRobinCounter = (p.RoundRobinCounter + 1) % p.Size
100100
var v = p.workers[p.RoundRobinCounter]
101+
101102
p.mtx.Unlock()
102103

103104
v.mtx.Lock()
104105
v.isBusy = true
105106
v.mtx.Unlock()
107+
106108
v.c <- m
107109

108110
}

Diff for: jlog/shared/shared.go

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package shared
22

33
import (
44
"fmt"
5+
"github.com/oresoftware/json-logging/jlog/pool"
56
"golang.org/x/crypto/ssh/terminal"
67
"os"
78
"reflect"
@@ -59,3 +60,5 @@ func IsNonPrimitive(kind reflect.Kind) bool {
5960
kind == reflect.Chan ||
6061
kind == reflect.Interface
6162
}
63+
64+
var StdioPool = pool.CreatePool(30)

0 commit comments

Comments
 (0)