119 lines
3.1 KiB
Go
119 lines
3.1 KiB
Go
// 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)
|
|
}
|