वैकल्पिक लॉगर स्ट्रक्चर बनाने की बजाय अपनी सभी तीन आवश्यकताओं को पूरा करने का सबसे अच्छा तरीका, यदि आप बेस-स्तरीय लॉग का उपयोग करके संतुष्ट थे। लॉग, लॉगर के आउटपुट को अपने स्वयं के io.Writer उदाहरण में सेट करने के बजाय है ।
तो मूल रूप से क्या मैं यहाँ क्या करने जा रहा हूँ मेरे अपने io.Writer एक उदाहरण मैं कहाँ बनाने दिखाने है:
import (
"os"
"sync"
"time"
)
type RotateWriter struct {
lock sync.Mutex
filename string // should be set to the actual filename
fp *os.File
}
// Make a new RotateWriter. Return nil if error occurs during setup.
func New(filename string) *RotateWriter {
w := &RotateWriter{filename: filename}
err := w.Rotate()
if err != nil {
return nil
}
return w
}
// Write satisfies the io.Writer interface.
func (w *RotateWriter) Write(output []byte) (int, error) {
w.lock.Lock()
defer w.lock.Unlock()
return w.fp.Write(output)
}
// Perform the actual act of rotating and reopening file.
func (w *RotateWriter) Rotate() (err error) {
w.lock.Lock()
defer w.lock.Unlock()
// Close existing file if open
if w.fp != nil {
err = w.fp.Close()
w.fp = nil
if err != nil {
return
}
}
// Rename dest file if it already exists
_, err = os.Stat(w.filename)
if err == nil {
err = os.Rename(w.filename, w.filename+"."+time.Now().Format(time.RFC3339))
if err != nil {
return
}
}
// Create a file.
w.fp, err = os.Create(w.filename)
return
}
फिर आप एक RotateWriter बना सकते हैं और log.SetOutput
का उपयोग इस लेखक स्थापित करने के लिए (अन्य पैकेजों अगर मानक लॉगर इंस्टेंस का उपयोग कर रहे हैं) या वैकल्पिक रूप से पास करने के लिए log.New
का उपयोग करके अपने स्वयं के उदाहरण बनाएं।
मैंने रोटेट को कॉल करने की स्थिति को हल नहीं किया है, मैं इसे तय करने के लिए आपको छोड़ दूंगा। समय के आधार पर इसे ट्रिगर करने के लिए काफी सरल होगा, या कुछ मात्रा में लिखने या बाइट्स की कुछ मात्रा के बाद वैकल्पिक रूप से ऐसा करना होगा।
क्या आप स्पष्ट कर सकते हैं कि घूर्णन थोड़ा और क्या है? क्या यह प्रोग्राम शुरू हो रहा है, या जब फाइलें एक विशिष्ट आकार तक पहुंचती हैं, आदि? – klobucar
पोस्टरिटी के लिए: मैं अत्यधिक lumberjack (https://github.com/natefinch/lumberjack) की सिफारिश करता हूं - जो मानक लाइब्रेरी के 'लॉग' पैकेज में 'log.SetOutput' के माध्यम से हुक करता है और लॉग रोटेशन, अधिकतम आकार और बैकअप बनाए रखता है। – elithrar