diff --git a/log.go b/log.go
index fb07a36..109b46b 100644
--- a/log.go
+++ b/log.go
@@ -19,7 +19,7 @@ const (
 )
 
 var global *Logger
-var Factory WrapperFactoryFunc = NewLogrusWrapper(logrus.StandardLogger())
+var Factory = NewLogrusWrapper(logrus.StandardLogger())
 
 func init() {
 	global = New()
@@ -27,12 +27,11 @@ func init() {
 }
 
 type Logger struct {
-	registeredFields      []Field
-	registeredFieldsMutex sync.RWMutex
-	excludeRules          []ExcludeRule
-	excludeRulesMutex     sync.RWMutex
-	factory               WrapperFactoryFunc
-	callerFrameToSkip     int
+	registeredFields  []Field
+	excludeRules      []ExcludeRule
+	factory           WrapperFactoryFunc
+	callerFrameToSkip int
+	mutex             sync.RWMutex
 }
 
 func New() *Logger {
@@ -46,16 +45,22 @@ func NewWithFactory(factory WrapperFactoryFunc) *Logger {
 }
 
 func (l *Logger) GetFramesToSkip() int {
+	l.mutex.RLock()
+	defer l.mutex.RUnlock()
+
 	return l.callerFrameToSkip
 }
 
 func (l *Logger) SetFramesToSkip(s int) {
+	l.mutex.Lock()
+	defer l.mutex.Unlock()
+
 	l.callerFrameToSkip = s
 }
 
 func (l *Logger) RegisterField(fields ...Field) {
-	l.registeredFieldsMutex.Lock()
-	defer l.registeredFieldsMutex.Unlock()
+	l.mutex.Lock()
+	defer l.mutex.Unlock()
 
 	for _, f := range fields {
 		var exist bool
@@ -76,8 +81,8 @@ func (l *Logger) RegisterField(fields ...Field) {
 }
 
 func (l *Logger) UnregisterField(fields ...Field) {
-	l.registeredFieldsMutex.Lock()
-	defer l.registeredFieldsMutex.Unlock()
+	l.mutex.Lock()
+	defer l.mutex.Unlock()
 
 loop:
 	for _, f := range fields {
@@ -95,16 +100,18 @@ loop:
 }
 
 func (l *Logger) GetRegisteredFields() []Field {
-	l.registeredFieldsMutex.RLock()
-	defer l.registeredFieldsMutex.RUnlock()
+	l.mutex.RLock()
+	defer l.mutex.RUnlock()
+
 	fields := make([]Field, len(l.registeredFields))
 	copy(fields, l.registeredFields)
 	return fields
 }
 
 func (l *Logger) GetExcludeRules() []ExcludeRule {
-	l.excludeRulesMutex.RLock()
-	defer l.excludeRulesMutex.RUnlock()
+	l.mutex.RLock()
+	defer l.mutex.RUnlock()
+
 	excludeRules := make([]ExcludeRule, len(l.excludeRules))
 	copy(excludeRules, l.excludeRules)
 	return excludeRules
@@ -115,8 +122,9 @@ func (l *Logger) RegisterDefaultFields() {
 }
 
 func (l *Logger) Skip(field Field, value interface{}) {
-	l.excludeRulesMutex.Lock()
-	defer l.excludeRulesMutex.Unlock()
+	l.mutex.Lock()
+	defer l.mutex.Unlock()
+
 	for i := range l.excludeRules {
 		if l.excludeRules[i].Field == field {
 			l.excludeRules[i].Value = value
@@ -126,6 +134,13 @@ func (l *Logger) Skip(field Field, value interface{}) {
 	l.excludeRules = append(l.excludeRules, ExcludeRule{field, value})
 }
 
+func (l *Logger) SetFactory(factory WrapperFactoryFunc) {
+	l.mutex.Lock()
+	defer l.mutex.Unlock()
+
+	l.factory = factory
+}
+
 func (l *Logger) Debug(ctx context.Context, format string, args ...interface{}) {
 	l.call(ctx, LevelDebug, format, args...)
 }
@@ -152,12 +167,17 @@ func (l *Logger) Panic(ctx context.Context, format string, args ...interface{})
 
 func (l *Logger) call(ctx context.Context, level Level, format string, args ...interface{}) {
 	var entry Wrapper
+
+	l.mutex.RLock()
+
 	if l.factory == nil {
 		entry = Factory()
 	} else {
 		entry = l.factory()
 	}
 
+	l.mutex.RUnlock()
+
 	if level < entry.GetLevel() {
 		return
 	}
@@ -266,6 +286,10 @@ func Skip(field Field, value interface{}) {
 	global.Skip(field, value)
 }
 
+func SetFactory(factory WrapperFactoryFunc) {
+	global.SetFactory(factory)
+}
+
 func Debug(ctx context.Context, format string, args ...interface{}) {
 	global.Debug(ctx, format, args...)
 }