| // Copyright © 2016 Steve Francia <spf@spf13.com>. |
| // |
| // Use of this source code is governed by an MIT-style |
| // license that can be found in the LICENSE file. |
| |
| package jwalterweatherman |
| |
| import ( |
| "sync/atomic" |
| ) |
| |
| type logCounter struct { |
| counter uint64 |
| } |
| |
| func (c *logCounter) incr() { |
| atomic.AddUint64(&c.counter, 1) |
| } |
| |
| func (c *logCounter) resetCounter() { |
| atomic.StoreUint64(&c.counter, 0) |
| } |
| |
| func (c *logCounter) getCount() uint64 { |
| return atomic.LoadUint64(&c.counter) |
| } |
| |
| func (c *logCounter) Write(p []byte) (n int, err error) { |
| c.incr() |
| return len(p), nil |
| } |
| |
| // LogCountForLevel returns the number of log invocations for a given threshold. |
| func (n *Notepad) LogCountForLevel(l Threshold) uint64 { |
| return n.logCounters[l].getCount() |
| } |
| |
| // LogCountForLevelsGreaterThanorEqualTo returns the number of log invocations |
| // greater than or equal to a given threshold. |
| func (n *Notepad) LogCountForLevelsGreaterThanorEqualTo(threshold Threshold) uint64 { |
| var cnt uint64 |
| |
| for i := int(threshold); i < len(n.logCounters); i++ { |
| cnt += n.LogCountForLevel(Threshold(i)) |
| } |
| |
| return cnt |
| } |
| |
| // ResetLogCounters resets the invocation counters for all levels. |
| func (n *Notepad) ResetLogCounters() { |
| for _, np := range n.logCounters { |
| np.resetCounter() |
| } |
| } |