// Copyright (c) quickfixengine.org All rights reserved. // // This file may be distributed under the terms of the quickfixengine.org // license as defined by quickfixengine.org and appearing in the file // LICENSE included in the packaging of this file. // // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING // THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A // PARTICULAR PURPOSE. // // See http://www.quickfixengine.org/LICENSE for licensing information. // // Contact ask@quickfixengine.org if any conditions of this licensing // are not clear to you. package file import ( "fmt" "log" "os" "path" "quantex.com/qfixdpl/quickfix" "quantex.com/qfixdpl/quickfix/config" ) type fileLog struct { eventLogger *log.Logger messageLogger *log.Logger } func (l fileLog) OnIncoming(msg []byte) { l.messageLogger.Print(string(msg)) } func (l fileLog) OnOutgoing(msg []byte) { l.messageLogger.Print(string(msg)) } func (l fileLog) OnEvent(msg string) { l.eventLogger.Print(msg) } func (l fileLog) OnEventf(format string, v ...interface{}) { l.eventLogger.Printf(format, v...) } type fileLogFactory struct { globalLogPath string sessionLogPaths map[quickfix.SessionID]string } // NewLogFactory creates an instance of LogFactory that writes messages and events to file. // The location of global and session log files is configured via FileLogPath. func NewLogFactory(settings *quickfix.Settings) (quickfix.LogFactory, error) { logFactory := fileLogFactory{} var err error if logFactory.globalLogPath, err = settings.GlobalSettings().Setting(config.FileLogPath); err != nil { return logFactory, err } logFactory.sessionLogPaths = make(map[quickfix.SessionID]string) for sid, sessionSettings := range settings.SessionSettings() { logPath, err := sessionSettings.Setting(config.FileLogPath) if err != nil { return logFactory, err } logFactory.sessionLogPaths[sid] = logPath } return logFactory, nil } func newFileLog(prefix string, logPath string) (fileLog, error) { l := fileLog{} eventLogName := path.Join(logPath, prefix+".event.current.log") messageLogName := path.Join(logPath, prefix+".messages.current.log") if err := os.MkdirAll(logPath, os.ModePerm); err != nil { return l, err } fileFlags := os.O_RDWR | os.O_CREATE | os.O_APPEND eventFile, err := os.OpenFile(eventLogName, fileFlags, os.ModePerm) if err != nil { return l, err } messageFile, err := os.OpenFile(messageLogName, fileFlags, os.ModePerm) if err != nil { return l, err } logFlag := log.Ldate | log.Ltime | log.Lmicroseconds | log.LUTC l.eventLogger = log.New(eventFile, "", logFlag) l.messageLogger = log.New(messageFile, "", logFlag) return l, nil } func (f fileLogFactory) Create() (quickfix.Log, error) { return newFileLog("GLOBAL", f.globalLogPath) } func (f fileLogFactory) CreateSessionLog(sessionID quickfix.SessionID) (quickfix.Log, error) { logPath, ok := f.sessionLogPaths[sessionID] if !ok { return nil, fmt.Errorf("logger not defined for %v", sessionID) } prefix := sessionIDFilenamePrefix(sessionID) return newFileLog(prefix, logPath) }