...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package buffer
20
21 import (
22 "bytes"
23 "os"
24 "sync"
25 "time"
26
27 "k8s.io/klog/v2/internal/severity"
28 )
29
30 var (
31
32 Pid = os.Getpid()
33
34
35 Time *time.Time
36 )
37
38
39
40 type Buffer struct {
41 bytes.Buffer
42 Tmp [64]byte
43 }
44
45 var buffers = sync.Pool{
46 New: func() interface{} {
47 return new(Buffer)
48 },
49 }
50
51
52 func GetBuffer() *Buffer {
53 b := buffers.Get().(*Buffer)
54 b.Reset()
55 return b
56 }
57
58
59 func PutBuffer(b *Buffer) {
60 if b.Len() >= 256 {
61
62
63
64
65
66
67
68 return
69 }
70
71 buffers.Put(b)
72 }
73
74
75
76 const digits = "0123456789"
77
78
79 func (buf *Buffer) twoDigits(i, d int) {
80 buf.Tmp[i+1] = digits[d%10]
81 d /= 10
82 buf.Tmp[i] = digits[d%10]
83 }
84
85
86
87
88 func (buf *Buffer) nDigits(n, i, d int, pad byte) {
89 j := n - 1
90 for ; j >= 0 && d > 0; j-- {
91 buf.Tmp[i+j] = digits[d%10]
92 d /= 10
93 }
94 for ; j >= 0; j-- {
95 buf.Tmp[i+j] = pad
96 }
97 }
98
99
100 func (buf *Buffer) someDigits(i, d int) int {
101
102
103 j := len(buf.Tmp)
104 for {
105 j--
106 buf.Tmp[j] = digits[d%10]
107 d /= 10
108 if d == 0 {
109 break
110 }
111 }
112 return copy(buf.Tmp[i:], buf.Tmp[j:])
113 }
114
115
116
117 func (buf *Buffer) FormatHeader(s severity.Severity, file string, line int, now time.Time) {
118 if line < 0 {
119 line = 0
120 }
121 if s > severity.FatalLog {
122 s = severity.InfoLog
123 }
124
125
126
127 if Time != nil {
128 now = *Time
129 }
130 _, month, day := now.Date()
131 hour, minute, second := now.Clock()
132
133 buf.Tmp[0] = severity.Char[s]
134 buf.twoDigits(1, int(month))
135 buf.twoDigits(3, day)
136 buf.Tmp[5] = ' '
137 buf.twoDigits(6, hour)
138 buf.Tmp[8] = ':'
139 buf.twoDigits(9, minute)
140 buf.Tmp[11] = ':'
141 buf.twoDigits(12, second)
142 buf.Tmp[14] = '.'
143 buf.nDigits(6, 15, now.Nanosecond()/1000, '0')
144 buf.Tmp[21] = ' '
145 buf.nDigits(7, 22, Pid, ' ')
146 buf.Tmp[29] = ' '
147 buf.Write(buf.Tmp[:30])
148 buf.WriteString(file)
149 buf.Tmp[0] = ':'
150 n := buf.someDigits(1, line)
151 buf.Tmp[n+1] = ']'
152 buf.Tmp[n+2] = ' '
153 buf.Write(buf.Tmp[:n+3])
154 }
155
156
157
158 func (buf *Buffer) SprintHeader(s severity.Severity, now time.Time) string {
159 if s > severity.FatalLog {
160 s = severity.InfoLog
161 }
162
163
164
165 if Time != nil {
166 now = *Time
167 }
168 _, month, day := now.Date()
169 hour, minute, second := now.Clock()
170
171 buf.Tmp[0] = severity.Char[s]
172 buf.twoDigits(1, int(month))
173 buf.twoDigits(3, day)
174 buf.Tmp[5] = ' '
175 buf.twoDigits(6, hour)
176 buf.Tmp[8] = ':'
177 buf.twoDigits(9, minute)
178 buf.Tmp[11] = ':'
179 buf.twoDigits(12, second)
180 buf.Tmp[14] = '.'
181 buf.nDigits(6, 15, now.Nanosecond()/1000, '0')
182 buf.Tmp[21] = ']'
183 return string(buf.Tmp[:22])
184 }
185
View as plain text