瀏覽代碼

logger: Make safer to avoid file write races

tags/v0.7.0
Daniel Oaks 7 年之前
父節點
當前提交
a8e13b062b
共有 1 個檔案被更改,包括 5 行新增0 行删除
  1. 5
    0
      irc/logger/logger.go

+ 5
- 0
irc/logger/logger.go 查看文件

@@ -53,6 +53,7 @@ var (
53 53
 type Manager struct {
54 54
 	loggers         []singleLogger
55 55
 	stderrWriteLock sync.Mutex
56
+	fileWriteLock   sync.Mutex
56 57
 	DumpingRawInOut bool
57 58
 }
58 59
 
@@ -93,6 +94,7 @@ func NewManager(config ...Config) (*Manager, error) {
93 94
 			Types:           typeMap,
94 95
 			ExcludedTypes:   excludedTypeMap,
95 96
 			stderrWriteLock: &logger.stderrWriteLock,
97
+			fileWriteLock:   &logger.fileWriteLock,
96 98
 		}
97 99
 		if typeMap["userinput"] || typeMap["useroutput"] || (typeMap["*"] && !(excludedTypeMap["userinput"] && excludedTypeMap["useroutput"])) {
98 100
 			logger.DumpingRawInOut = true
@@ -164,6 +166,7 @@ type fileMethod struct {
164 166
 // singleLogger represents a single logger instance.
165 167
 type singleLogger struct {
166 168
 	stderrWriteLock *sync.Mutex
169
+	fileWriteLock   *sync.Mutex
167 170
 	MethodSTDERR    bool
168 171
 	MethodFile      fileMethod
169 172
 	Level           Level
@@ -229,6 +232,8 @@ func (logger *singleLogger) Log(level Level, logType string, messageParts ...str
229 232
 		logger.stderrWriteLock.Unlock()
230 233
 	}
231 234
 	if logger.MethodFile.Enabled {
235
+		logger.fileWriteLock.Lock()
232 236
 		logger.MethodFile.Writer.WriteString(fullStringRaw + "\n")
237
+		logger.fileWriteLock.Unlock()
233 238
 	}
234 239
 }

Loading…
取消
儲存