github.com/go-spring/spring-base@v1.1.3/log/log_test.go (about)

     1  /*
     2   * Copyright 2012-2019 the original author or authors.
     3   *
     4   * Licensed under the Apache License, Version 2.0 (the "License");
     5   * you may not use this file except in compliance with the License.
     6   * You may obtain a copy of the License at
     7   *
     8   *      https://www.apache.org/licenses/LICENSE-2.0
     9   *
    10   * Unless required by applicable law or agreed to in writing, software
    11   * distributed under the License is distributed on an "AS IS" BASIS,
    12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13   * See the License for the specific language governing permissions and
    14   * limitations under the License.
    15   */
    16  
    17  package log_test
    18  
    19  import (
    20  	"context"
    21  	"errors"
    22  	"fmt"
    23  	"sync"
    24  	"sync/atomic"
    25  	"testing"
    26  	"time"
    27  
    28  	"github.com/go-spring/spring-base/assert"
    29  	"github.com/go-spring/spring-base/code"
    30  	"github.com/go-spring/spring-base/log"
    31  	"github.com/go-spring/spring-base/util"
    32  )
    33  
    34  func TestAtomicAndMutex(t *testing.T) {
    35  	t.SkipNow()
    36  
    37  	k := int32(0)
    38  	count := 1000000000
    39  
    40  	// 直接读取,10亿次,313.234156ms。
    41  	start := time.Now()
    42  	for i := 0; i < count; i++ {
    43  		j := k
    44  		_ = j
    45  	}
    46  	fmt.Println(time.Since(start))
    47  
    48  	// 原子读取,10亿次,332.547066ms。
    49  	start = time.Now()
    50  	for i := 0; i < count; i++ {
    51  		j := atomic.LoadInt32(&k)
    52  		_ = j
    53  	}
    54  	k = 0
    55  	fmt.Println(time.Since(start))
    56  
    57  	// 原子累加,10亿次,6.251721832s。
    58  	start = time.Now()
    59  	for i := 0; i < count; i++ {
    60  		atomic.AddInt32(&k, 1)
    61  	}
    62  	k = 0
    63  	fmt.Println(time.Since(start))
    64  
    65  	// atomic.Value,10亿次,978.367782ms。
    66  	var v atomic.Value
    67  	v.Store(k)
    68  	start = time.Now()
    69  	for i := 0; i < count; i++ {
    70  		j := v.Load().(int32)
    71  		_ = j
    72  	}
    73  	fmt.Println(time.Since(start))
    74  
    75  	// 使用读锁,10亿次,12.758831296s。
    76  	var mux sync.RWMutex
    77  	start = time.Now()
    78  	for i := 0; i < count; i++ {
    79  		mux.RLock()
    80  		j := k
    81  		_ = j
    82  		mux.RUnlock()
    83  	}
    84  	fmt.Println(time.Since(start))
    85  }
    86  
    87  type Student struct{}
    88  type student struct{}
    89  
    90  func TestGetLogger(t *testing.T) {
    91  
    92  	config := `
    93  		<?xml version="1.0" encoding="UTF-8"?>
    94  		<Configuration>
    95  			<Appenders>
    96  				<Console name="Console"/>
    97  			</Appenders>
    98  			<Loggers>
    99  				<Logger name="spring/spring-base/log_test" level="debug">
   100  					<AppenderRef ref="Console">
   101  						<Filters>
   102  							<LevelFilter level="info"/>
   103  						</Filters>
   104  					</AppenderRef>
   105  				</Logger>
   106  				<Root level="debug">
   107  					<AppenderRef ref="Console"/>
   108  					<LevelFilter level="info"/>
   109  				</Root>
   110  			</Loggers>
   111  		</Configuration>
   112  	`
   113  
   114  	err := log.RefreshBuffer(config, ".xml")
   115  	if err != nil {
   116  		t.Fatal(err)
   117  	}
   118  
   119  	type Class struct{}
   120  	type class struct{}
   121  
   122  	logger := log.GetLogger(util.TypeName(new(Student)))
   123  	assert.Equal(t, logger.Name(), "github.com/go-spring/spring-base/log/log_test.Student")
   124  	logger.Info("1")
   125  
   126  	logger = log.GetLogger(util.TypeName(new(student)))
   127  	assert.Equal(t, logger.Name(), "github.com/go-spring/spring-base/log/log_test.student")
   128  	logger.Info("2")
   129  
   130  	logger = log.GetLogger(util.TypeName(new(Class)))
   131  	assert.Equal(t, logger.Name(), "github.com/go-spring/spring-base/log/log_test.Class")
   132  	logger.Info("3")
   133  
   134  	logger = log.GetLogger(util.TypeName(new(class)))
   135  	assert.Equal(t, logger.Name(), "github.com/go-spring/spring-base/log/log_test.class")
   136  	logger.Info("4")
   137  
   138  	logger = nil
   139  	assert.Equal(t, util.TypeName(logger), "github.com/go-spring/spring-base/log/log.Logger")
   140  }
   141  
   142  func TestLogger(t *testing.T) {
   143  
   144  	config := `
   145  		<?xml version="1.0" encoding="UTF-8"?>
   146  		<Configuration>
   147  			<Appenders>
   148  				<Console name="Console"/>
   149  			</Appenders>
   150  			<Loggers>
   151  				<Root level="trace">
   152  					<AppenderRef ref="Console"/>
   153  				</Root>
   154  			</Loggers>
   155  		</Configuration>
   156  	`
   157  
   158  	err := log.RefreshBuffer(config, ".xml")
   159  	if err != nil {
   160  		t.Fatal(err)
   161  	}
   162  
   163  	logger := log.GetLogger("xxx")
   164  
   165  	msg := func(format string, args ...interface{}) *log.Event {
   166  		return logger.WithSkip(1).Infof(format, args...)
   167  	}("log skip test")
   168  	assert.Equal(t, msg.Level, log.InfoLevel)
   169  	assert.Equal(t, msg.File, code.File())
   170  	assert.Equal(t, msg.Line, code.Line()-3)
   171  	//assert.Equal(t, msg.Msg().Text(), "log skip test")
   172  
   173  	msg = logger.Trace("a", "=", "1")
   174  	assert.Equal(t, msg.Level, log.TraceLevel)
   175  	assert.Equal(t, msg.File, code.File())
   176  	assert.Equal(t, msg.Line, code.Line()-3)
   177  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   178  
   179  	msg = logger.Tracef("a=%d", 1)
   180  	assert.Equal(t, msg.Level, log.TraceLevel)
   181  	assert.Equal(t, msg.File, code.File())
   182  	assert.Equal(t, msg.Line, code.Line()-3)
   183  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   184  
   185  	msg = logger.Trace(log.T(func() []interface{} {
   186  		return []interface{}{"a", "=", "1"}
   187  	}))
   188  	assert.Equal(t, msg.Level, log.TraceLevel)
   189  	assert.Equal(t, msg.File, code.File())
   190  	assert.Equal(t, msg.Line, code.Line()-5)
   191  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   192  
   193  	msg = logger.Tracef("a=%d", log.T(func() []interface{} {
   194  		return []interface{}{1}
   195  	}))
   196  	assert.Equal(t, msg.Level, log.TraceLevel)
   197  	assert.Equal(t, msg.File, code.File())
   198  	assert.Equal(t, msg.Line, code.Line()-5)
   199  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   200  
   201  	msg = logger.Tracew(log.String("a", "1"))
   202  	assert.Equal(t, msg.Level, log.TraceLevel)
   203  	assert.Equal(t, msg.File, code.File())
   204  	assert.Equal(t, msg.Line, code.Line()-3)
   205  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   206  
   207  	msg = logger.Tracew(log.W(func() []log.Field {
   208  		return []log.Field{
   209  			log.String("a", "1"),
   210  		}
   211  	}))
   212  	assert.Equal(t, msg.Level, log.TraceLevel)
   213  	assert.Equal(t, msg.File, code.File())
   214  	assert.Equal(t, msg.Line, code.Line()-7)
   215  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   216  
   217  	msg = logger.Debug("a", "=", "1")
   218  	assert.Equal(t, msg.Level, log.DebugLevel)
   219  	assert.Equal(t, msg.File, code.File())
   220  	assert.Equal(t, msg.Line, code.Line()-3)
   221  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   222  
   223  	msg = logger.Debugf("a=%d", 1)
   224  	assert.Equal(t, msg.Level, log.DebugLevel)
   225  	assert.Equal(t, msg.File, code.File())
   226  	assert.Equal(t, msg.Line, code.Line()-3)
   227  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   228  
   229  	msg = logger.Debug(log.T(func() []interface{} {
   230  		return []interface{}{"a", "=", "1"}
   231  	}))
   232  	assert.Equal(t, msg.Level, log.DebugLevel)
   233  	assert.Equal(t, msg.File, code.File())
   234  	assert.Equal(t, msg.Line, code.Line()-5)
   235  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   236  
   237  	msg = logger.Debugf("a=%d", log.T(func() []interface{} {
   238  		return []interface{}{1}
   239  	}))
   240  	assert.Equal(t, msg.Level, log.DebugLevel)
   241  	assert.Equal(t, msg.File, code.File())
   242  	assert.Equal(t, msg.Line, code.Line()-5)
   243  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   244  
   245  	msg = logger.Info("a", "=", "1")
   246  	assert.Equal(t, msg.Level, log.InfoLevel)
   247  	assert.Equal(t, msg.File, code.File())
   248  	assert.Equal(t, msg.Line, code.Line()-3)
   249  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   250  
   251  	msg = logger.Infof("a=%d", 1)
   252  	assert.Equal(t, msg.Level, log.InfoLevel)
   253  	assert.Equal(t, msg.File, code.File())
   254  	assert.Equal(t, msg.Line, code.Line()-3)
   255  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   256  
   257  	msg = logger.Info(log.T(func() []interface{} {
   258  		return []interface{}{"a", "=", "1"}
   259  	}))
   260  	assert.Equal(t, msg.Level, log.InfoLevel)
   261  	assert.Equal(t, msg.File, code.File())
   262  	assert.Equal(t, msg.Line, code.Line()-5)
   263  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   264  
   265  	msg = logger.Infof("a=%d", log.T(func() []interface{} {
   266  		return []interface{}{1}
   267  	}))
   268  	assert.Equal(t, msg.Level, log.InfoLevel)
   269  	assert.Equal(t, msg.File, code.File())
   270  	assert.Equal(t, msg.Line, code.Line()-5)
   271  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   272  
   273  	msg = logger.Warn("a", "=", "1")
   274  	assert.Equal(t, msg.Level, log.WarnLevel)
   275  	assert.Equal(t, msg.File, code.File())
   276  	assert.Equal(t, msg.Line, code.Line()-3)
   277  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   278  
   279  	msg = logger.Warnf("a=%d", 1)
   280  	assert.Equal(t, msg.Level, log.WarnLevel)
   281  	assert.Equal(t, msg.File, code.File())
   282  	assert.Equal(t, msg.Line, code.Line()-3)
   283  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   284  
   285  	msg = logger.Warn(log.T(func() []interface{} {
   286  		return []interface{}{"a", "=", "1"}
   287  	}))
   288  	assert.Equal(t, msg.Level, log.WarnLevel)
   289  	assert.Equal(t, msg.File, code.File())
   290  	assert.Equal(t, msg.Line, code.Line()-5)
   291  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   292  
   293  	msg = logger.Warnf("a=%d", log.T(func() []interface{} {
   294  		return []interface{}{1}
   295  	}))
   296  	assert.Equal(t, msg.Level, log.WarnLevel)
   297  	assert.Equal(t, msg.File, code.File())
   298  	assert.Equal(t, msg.Line, code.Line()-5)
   299  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   300  
   301  	msg = logger.Error("a", "=", "1")
   302  	assert.Equal(t, msg.Level, log.ErrorLevel)
   303  	assert.Equal(t, msg.File, code.File())
   304  	assert.Equal(t, msg.Line, code.Line()-3)
   305  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   306  
   307  	msg = logger.Errorf("a=%d", 1)
   308  	assert.Equal(t, msg.Level, log.ErrorLevel)
   309  	assert.Equal(t, msg.File, code.File())
   310  	assert.Equal(t, msg.Line, code.Line()-3)
   311  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   312  
   313  	msg = logger.Error(log.T(func() []interface{} {
   314  		return []interface{}{"a", "=", "1"}
   315  	}))
   316  	assert.Equal(t, msg.Level, log.ErrorLevel)
   317  	assert.Equal(t, msg.File, code.File())
   318  	assert.Equal(t, msg.Line, code.Line()-5)
   319  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   320  
   321  	msg = logger.Errorf("a=%d", log.T(func() []interface{} {
   322  		return []interface{}{1}
   323  	}))
   324  	assert.Equal(t, msg.Level, log.ErrorLevel)
   325  	assert.Equal(t, msg.File, code.File())
   326  	assert.Equal(t, msg.Line, code.Line()-5)
   327  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   328  
   329  	msg = logger.Panic(errors.New("error"))
   330  	assert.Equal(t, msg.Level, log.PanicLevel)
   331  	assert.Equal(t, msg.File, code.File())
   332  	assert.Equal(t, msg.Line, code.Line()-3)
   333  	//assert.Equal(t, msg.Msg().Text(), "error")
   334  
   335  	msg = logger.Panicf("error:%d", 404)
   336  	assert.Equal(t, msg.Level, log.PanicLevel)
   337  	assert.Equal(t, msg.File, code.File())
   338  	assert.Equal(t, msg.Line, code.Line()-3)
   339  	//assert.Equal(t, msg.Msg().Text(), "error:404")
   340  
   341  	msg = logger.Fatal("a", "=", "1")
   342  	assert.Equal(t, msg.Level, log.FatalLevel)
   343  	assert.Equal(t, msg.File, code.File())
   344  	assert.Equal(t, msg.Line, code.Line()-3)
   345  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   346  
   347  	msg = logger.Fatalf("a=%d", 1)
   348  	assert.Equal(t, msg.Level, log.FatalLevel)
   349  	assert.Equal(t, msg.File, code.File())
   350  	assert.Equal(t, msg.Line, code.Line()-3)
   351  	//assert.Equal(t, msg.Msg().Text(), "a=1")
   352  }
   353  
   354  func TestEntry(t *testing.T) {
   355  
   356  	config := `
   357  		<?xml version="1.0" encoding="UTF-8"?>
   358  		<Configuration>
   359  			<Appenders>
   360  				<Console name="Console"/>
   361  			</Appenders>
   362  			<Loggers>
   363  				<Root level="trace">
   364  					<AppenderRef ref="Console"/>
   365  				</Root>
   366  			</Loggers>
   367  		</Configuration>
   368  	`
   369  
   370  	err := log.RefreshBuffer(config, ".xml")
   371  	if err != nil {
   372  		t.Fatal(err)
   373  	}
   374  
   375  	ctx := context.WithValue(context.Background(), "trace", "110110")
   376  	logger := log.GetLogger("xxx")
   377  
   378  	const tagIn = "__in"
   379  	ctxLogger := logger.WithContext(ctx)
   380  
   381  	msg := ctxLogger.Trace("Level:", "trace")
   382  	assert.Equal(t, msg.Level, log.TraceLevel)
   383  	assert.Equal(t, msg.File, code.File())
   384  	assert.Equal(t, msg.Line, code.Line()-3)
   385  	assert.Equal(t, msg.Context, ctx)
   386  	//assert.Equal(t, msg.Msg().Text(), "Level:trace")
   387  
   388  	msg = ctxLogger.Tracef("Level:%s", "trace")
   389  	assert.Equal(t, msg.Level, log.TraceLevel)
   390  	assert.Equal(t, msg.File, code.File())
   391  	assert.Equal(t, msg.Line, code.Line()-3)
   392  	assert.Equal(t, msg.Context, ctx)
   393  	//assert.Equal(t, msg.Msg().Text(), "Level:trace")
   394  
   395  	msg = ctxLogger.Debug("Level:", "debug")
   396  	assert.Equal(t, msg.Level, log.DebugLevel)
   397  	assert.Equal(t, msg.File, code.File())
   398  	assert.Equal(t, msg.Line, code.Line()-3)
   399  	assert.Equal(t, msg.Context, ctx)
   400  	//assert.Equal(t, msg.Msg().Text(), "Level:debug")
   401  
   402  	msg = ctxLogger.Debugf("Level:%s", "debug")
   403  	assert.Equal(t, msg.Level, log.DebugLevel)
   404  	assert.Equal(t, msg.File, code.File())
   405  	assert.Equal(t, msg.Line, code.Line()-3)
   406  	assert.Equal(t, msg.Context, ctx)
   407  	//assert.Equal(t, msg.Msg().Text(), "Level:debug")
   408  
   409  	msg = ctxLogger.Info("Level:", "info")
   410  	assert.Equal(t, msg.Level, log.InfoLevel)
   411  	assert.Equal(t, msg.File, code.File())
   412  	assert.Equal(t, msg.Line, code.Line()-3)
   413  	assert.Equal(t, msg.Context, ctx)
   414  	//assert.Equal(t, msg.Msg().Text(), "Level:info")
   415  
   416  	msg = ctxLogger.Infof("Level:%s", "info")
   417  	assert.Equal(t, msg.Level, log.InfoLevel)
   418  	assert.Equal(t, msg.File, code.File())
   419  	assert.Equal(t, msg.Line, code.Line()-3)
   420  	assert.Equal(t, msg.Context, ctx)
   421  	//assert.Equal(t, msg.Msg().Text(), "Level:info")
   422  
   423  	msg = ctxLogger.Warn("Level:", "warn")
   424  	assert.Equal(t, msg.Level, log.WarnLevel)
   425  	assert.Equal(t, msg.File, code.File())
   426  	assert.Equal(t, msg.Line, code.Line()-3)
   427  	assert.Equal(t, msg.Context, ctx)
   428  	//assert.Equal(t, msg.Msg().Text(), "Level:warn")
   429  
   430  	msg = ctxLogger.Warnf("Level:%s", "warn")
   431  	assert.Equal(t, msg.Level, log.WarnLevel)
   432  	assert.Equal(t, msg.File, code.File())
   433  	assert.Equal(t, msg.Line, code.Line()-3)
   434  	assert.Equal(t, msg.Context, ctx)
   435  	//assert.Equal(t, msg.Msg().Text(), "Level:warn")
   436  
   437  	msg = ctxLogger.Error("Level:", "error")
   438  	assert.Equal(t, msg.Level, log.ErrorLevel)
   439  	assert.Equal(t, msg.File, code.File())
   440  	assert.Equal(t, msg.Line, code.Line()-3)
   441  	assert.Equal(t, msg.Context, ctx)
   442  	//assert.Equal(t, msg.Msg().Text(), "Level:error")
   443  
   444  	msg = ctxLogger.Errorf("Level:%s", "error")
   445  	assert.Equal(t, msg.Level, log.ErrorLevel)
   446  	assert.Equal(t, msg.File, code.File())
   447  	assert.Equal(t, msg.Line, code.Line()-3)
   448  	assert.Equal(t, msg.Context, ctx)
   449  	//assert.Equal(t, msg.Msg().Text(), "Level:error")
   450  
   451  	msg = ctxLogger.Panic("Level:", "panic")
   452  	assert.Equal(t, msg.Level, log.PanicLevel)
   453  	assert.Equal(t, msg.File, code.File())
   454  	assert.Equal(t, msg.Line, code.Line()-3)
   455  	assert.Equal(t, msg.Context, ctx)
   456  	//assert.Equal(t, msg.Msg().Text(), "Level:panic")
   457  
   458  	msg = ctxLogger.Panicf("Level:%s", "panic")
   459  	assert.Equal(t, msg.Level, log.PanicLevel)
   460  	assert.Equal(t, msg.File, code.File())
   461  	assert.Equal(t, msg.Line, code.Line()-3)
   462  	assert.Equal(t, msg.Context, ctx)
   463  	//assert.Equal(t, msg.Msg().Text(), "Level:panic")
   464  
   465  	msg = ctxLogger.Fatal("Level:", "fatal")
   466  	assert.Equal(t, msg.Level, log.FatalLevel)
   467  	assert.Equal(t, msg.File, code.File())
   468  	assert.Equal(t, msg.Line, code.Line()-3)
   469  	assert.Equal(t, msg.Context, ctx)
   470  	//assert.Equal(t, msg.Msg().Text(), "Level:fatal")
   471  
   472  	msg = ctxLogger.Fatalf("Level:%s", "fatal")
   473  	assert.Equal(t, msg.Level, log.FatalLevel)
   474  	assert.Equal(t, msg.File, code.File())
   475  	assert.Equal(t, msg.Line, code.Line()-3)
   476  	assert.Equal(t, msg.Context, ctx)
   477  	//assert.Equal(t, msg.Msg().Text(), "Level:fatal")
   478  
   479  	msg = ctxLogger.Trace(log.T(func() []interface{} {
   480  		return []interface{}{"Level:", "trace"}
   481  	}))
   482  	assert.Equal(t, msg.Level, log.TraceLevel)
   483  	assert.Equal(t, msg.File, code.File())
   484  	assert.Equal(t, msg.Line, code.Line()-5)
   485  	assert.Equal(t, msg.Context, ctx)
   486  	//assert.Equal(t, msg.Msg().Text(), "Level:trace")
   487  
   488  	msg = ctxLogger.Tracef("Level:%s", log.T(func() []interface{} {
   489  		return []interface{}{"trace"}
   490  	}))
   491  	assert.Equal(t, msg.Level, log.TraceLevel)
   492  	assert.Equal(t, msg.File, code.File())
   493  	assert.Equal(t, msg.Line, code.Line()-5)
   494  	assert.Equal(t, msg.Context, ctx)
   495  	//assert.Equal(t, msg.Msg().Text(), "Level:trace")
   496  
   497  	msg = ctxLogger.Debug(log.T(func() []interface{} {
   498  		return []interface{}{"Level:", "debug"}
   499  	}))
   500  	assert.Equal(t, msg.Level, log.DebugLevel)
   501  	assert.Equal(t, msg.File, code.File())
   502  	assert.Equal(t, msg.Line, code.Line()-5)
   503  	assert.Equal(t, msg.Context, ctx)
   504  	//assert.Equal(t, msg.Msg().Text(), "Level:debug")
   505  
   506  	msg = ctxLogger.Debugf("Level:%s", log.T(func() []interface{} {
   507  		return []interface{}{"debug"}
   508  	}))
   509  	assert.Equal(t, msg.Level, log.DebugLevel)
   510  	assert.Equal(t, msg.File, code.File())
   511  	assert.Equal(t, msg.Line, code.Line()-5)
   512  	assert.Equal(t, msg.Context, ctx)
   513  	//assert.Equal(t, msg.Msg().Text(), "Level:debug")
   514  
   515  	msg = ctxLogger.Info(log.T(func() []interface{} {
   516  		return []interface{}{"Level:", "info"}
   517  	}))
   518  	assert.Equal(t, msg.Level, log.InfoLevel)
   519  	assert.Equal(t, msg.File, code.File())
   520  	assert.Equal(t, msg.Line, code.Line()-5)
   521  	assert.Equal(t, msg.Context, ctx)
   522  	//assert.Equal(t, msg.Msg().Text(), "Level:info")
   523  
   524  	msg = ctxLogger.Infof("Level:%s", log.T(func() []interface{} {
   525  		return []interface{}{"info"}
   526  	}))
   527  	assert.Equal(t, msg.Level, log.InfoLevel)
   528  	assert.Equal(t, msg.File, code.File())
   529  	assert.Equal(t, msg.Line, code.Line()-5)
   530  	assert.Equal(t, msg.Context, ctx)
   531  	//assert.Equal(t, msg.Msg().Text(), "Level:info")
   532  
   533  	msg = ctxLogger.Warn(log.T(func() []interface{} {
   534  		return []interface{}{"Level:", "warn"}
   535  	}))
   536  	assert.Equal(t, msg.Level, log.WarnLevel)
   537  	assert.Equal(t, msg.File, code.File())
   538  	assert.Equal(t, msg.Line, code.Line()-5)
   539  	assert.Equal(t, msg.Context, ctx)
   540  	//assert.Equal(t, msg.Msg().Text(), "Level:warn")
   541  
   542  	msg = ctxLogger.Warnf("Level:%s", log.T(func() []interface{} {
   543  		return []interface{}{"warn"}
   544  	}))
   545  	assert.Equal(t, msg.Level, log.WarnLevel)
   546  	assert.Equal(t, msg.File, code.File())
   547  	assert.Equal(t, msg.Line, code.Line()-5)
   548  	assert.Equal(t, msg.Context, ctx)
   549  	//assert.Equal(t, msg.Msg().Text(), "Level:warn")
   550  
   551  	msg = ctxLogger.Error(log.T(func() []interface{} {
   552  		return []interface{}{"Level:", "error"}
   553  	}))
   554  	assert.Equal(t, msg.Level, log.ErrorLevel)
   555  	assert.Equal(t, msg.File, code.File())
   556  	assert.Equal(t, msg.Line, code.Line()-5)
   557  	assert.Equal(t, msg.Context, ctx)
   558  	//assert.Equal(t, msg.Msg().Text(), "Level:error")
   559  
   560  	msg = ctxLogger.Errorf("Level:%s", log.T(func() []interface{} {
   561  		return []interface{}{"error"}
   562  	}))
   563  	assert.Equal(t, msg.Level, log.ErrorLevel)
   564  	assert.Equal(t, msg.File, code.File())
   565  	assert.Equal(t, msg.Line, code.Line()-5)
   566  	assert.Equal(t, msg.Context, ctx)
   567  	//assert.Equal(t, msg.Msg().Text(), "Level:error")
   568  
   569  	ctxLogger = ctxLogger.WithTag(tagIn)
   570  
   571  	msg = ctxLogger.Trace("Level:", "trace")
   572  	assert.Equal(t, msg.Level, log.TraceLevel)
   573  	assert.Equal(t, msg.File, code.File())
   574  	assert.Equal(t, msg.Line, code.Line()-3)
   575  	assert.Equal(t, msg.Tag, tagIn)
   576  	assert.Equal(t, msg.Context, ctx)
   577  	//assert.Equal(t, msg.Msg().Text(), "Level:trace")
   578  
   579  	msg = ctxLogger.Tracef("Level:%s", "trace")
   580  	assert.Equal(t, msg.Level, log.TraceLevel)
   581  	assert.Equal(t, msg.File, code.File())
   582  	assert.Equal(t, msg.Line, code.Line()-3)
   583  	assert.Equal(t, msg.Tag, tagIn)
   584  	assert.Equal(t, msg.Context, ctx)
   585  	//assert.Equal(t, msg.Msg().Text(), "Level:trace")
   586  
   587  	msg = ctxLogger.Debug("Level:", "debug")
   588  	assert.Equal(t, msg.Level, log.DebugLevel)
   589  	assert.Equal(t, msg.File, code.File())
   590  	assert.Equal(t, msg.Line, code.Line()-3)
   591  	assert.Equal(t, msg.Tag, tagIn)
   592  	assert.Equal(t, msg.Context, ctx)
   593  	//assert.Equal(t, msg.Msg().Text(), "Level:debug")
   594  
   595  	msg = ctxLogger.Debugf("Level:%s", "debug")
   596  	assert.Equal(t, msg.Level, log.DebugLevel)
   597  	assert.Equal(t, msg.File, code.File())
   598  	assert.Equal(t, msg.Line, code.Line()-3)
   599  	assert.Equal(t, msg.Tag, tagIn)
   600  	assert.Equal(t, msg.Context, ctx)
   601  	//assert.Equal(t, msg.Msg().Text(), "Level:debug")
   602  
   603  	msg = ctxLogger.Info("Level:", "info")
   604  	assert.Equal(t, msg.Level, log.InfoLevel)
   605  	assert.Equal(t, msg.File, code.File())
   606  	assert.Equal(t, msg.Line, code.Line()-3)
   607  	assert.Equal(t, msg.Tag, tagIn)
   608  	assert.Equal(t, msg.Context, ctx)
   609  	//assert.Equal(t, msg.Msg().Text(), "Level:info")
   610  
   611  	msg = ctxLogger.Infof("Level:%s", "info")
   612  	assert.Equal(t, msg.Level, log.InfoLevel)
   613  	assert.Equal(t, msg.File, code.File())
   614  	assert.Equal(t, msg.Line, code.Line()-3)
   615  	assert.Equal(t, msg.Tag, tagIn)
   616  	assert.Equal(t, msg.Context, ctx)
   617  	//assert.Equal(t, msg.Msg().Text(), "Level:info")
   618  
   619  	msg = ctxLogger.Warn("Level:", "warn")
   620  	assert.Equal(t, msg.Level, log.WarnLevel)
   621  	assert.Equal(t, msg.File, code.File())
   622  	assert.Equal(t, msg.Line, code.Line()-3)
   623  	assert.Equal(t, msg.Tag, tagIn)
   624  	assert.Equal(t, msg.Context, ctx)
   625  	//assert.Equal(t, msg.Msg().Text(), "Level:warn")
   626  
   627  	msg = ctxLogger.Warnf("Level:%s", "warn")
   628  	assert.Equal(t, msg.Level, log.WarnLevel)
   629  	assert.Equal(t, msg.File, code.File())
   630  	assert.Equal(t, msg.Line, code.Line()-3)
   631  	assert.Equal(t, msg.Tag, tagIn)
   632  	assert.Equal(t, msg.Context, ctx)
   633  	//assert.Equal(t, msg.Msg().Text(), "Level:warn")
   634  
   635  	msg = ctxLogger.Error("Level:", "error")
   636  	assert.Equal(t, msg.Level, log.ErrorLevel)
   637  	assert.Equal(t, msg.File, code.File())
   638  	assert.Equal(t, msg.Line, code.Line()-3)
   639  	assert.Equal(t, msg.Tag, tagIn)
   640  	assert.Equal(t, msg.Context, ctx)
   641  	//assert.Equal(t, msg.Msg().Text(), "Level:error")
   642  
   643  	msg = ctxLogger.Errorf("Level:%s", "error")
   644  	assert.Equal(t, msg.Level, log.ErrorLevel)
   645  	assert.Equal(t, msg.File, code.File())
   646  	assert.Equal(t, msg.Line, code.Line()-3)
   647  	assert.Equal(t, msg.Tag, tagIn)
   648  	assert.Equal(t, msg.Context, ctx)
   649  	//assert.Equal(t, msg.Msg().Text(), "Level:error")
   650  
   651  	msg = ctxLogger.Panic("Level:", "panic")
   652  	assert.Equal(t, msg.Level, log.PanicLevel)
   653  	assert.Equal(t, msg.File, code.File())
   654  	assert.Equal(t, msg.Line, code.Line()-3)
   655  	assert.Equal(t, msg.Tag, tagIn)
   656  	assert.Equal(t, msg.Context, ctx)
   657  	//assert.Equal(t, msg.Msg().Text(), "Level:panic")
   658  
   659  	msg = ctxLogger.Panicf("Level:%s", "panic")
   660  	assert.Equal(t, msg.Level, log.PanicLevel)
   661  	assert.Equal(t, msg.File, code.File())
   662  	assert.Equal(t, msg.Line, code.Line()-3)
   663  	assert.Equal(t, msg.Tag, tagIn)
   664  	assert.Equal(t, msg.Context, ctx)
   665  	//assert.Equal(t, msg.Msg().Text(), "Level:panic")
   666  
   667  	msg = ctxLogger.Fatal("Level:", "fatal")
   668  	assert.Equal(t, msg.Level, log.FatalLevel)
   669  	assert.Equal(t, msg.File, code.File())
   670  	assert.Equal(t, msg.Line, code.Line()-3)
   671  	assert.Equal(t, msg.Tag, tagIn)
   672  	assert.Equal(t, msg.Context, ctx)
   673  	//assert.Equal(t, msg.Msg().Text(), "Level:fatal")
   674  
   675  	msg = ctxLogger.Fatalf("Level:%s", "fatal")
   676  	assert.Equal(t, msg.Level, log.FatalLevel)
   677  	assert.Equal(t, msg.File, code.File())
   678  	assert.Equal(t, msg.Line, code.Line()-3)
   679  	assert.Equal(t, msg.Tag, tagIn)
   680  	assert.Equal(t, msg.Context, ctx)
   681  	//assert.Equal(t, msg.Msg().Text(), "Level:fatal")
   682  
   683  	tagLogger := logger.WithTag(tagIn)
   684  
   685  	msg = tagLogger.WithContext(ctx).Trace("Level:", "trace")
   686  	assert.Equal(t, msg.Level, log.TraceLevel)
   687  	assert.Equal(t, msg.File, code.File())
   688  	assert.Equal(t, msg.Line, code.Line()-3)
   689  	assert.Equal(t, msg.Tag, tagIn)
   690  	assert.Equal(t, msg.Context, ctx)
   691  	//assert.Equal(t, msg.Msg().Text(), "Level:trace")
   692  
   693  	msg = tagLogger.WithContext(ctx).Tracef("Level:%s", "trace")
   694  	assert.Equal(t, msg.Level, log.TraceLevel)
   695  	assert.Equal(t, msg.File, code.File())
   696  	assert.Equal(t, msg.Line, code.Line()-3)
   697  	assert.Equal(t, msg.Tag, tagIn)
   698  	assert.Equal(t, msg.Context, ctx)
   699  	//assert.Equal(t, msg.Msg().Text(), "Level:trace")
   700  
   701  	msg = tagLogger.WithContext(ctx).Debug("Level:", "debug")
   702  	assert.Equal(t, msg.Level, log.DebugLevel)
   703  	assert.Equal(t, msg.File, code.File())
   704  	assert.Equal(t, msg.Line, code.Line()-3)
   705  	assert.Equal(t, msg.Tag, tagIn)
   706  	assert.Equal(t, msg.Context, ctx)
   707  	//assert.Equal(t, msg.Msg().Text(), "Level:debug")
   708  
   709  	msg = tagLogger.WithContext(ctx).Debugf("Level:%s", "debug")
   710  	assert.Equal(t, msg.Level, log.DebugLevel)
   711  	assert.Equal(t, msg.File, code.File())
   712  	assert.Equal(t, msg.Line, code.Line()-3)
   713  	assert.Equal(t, msg.Tag, tagIn)
   714  	assert.Equal(t, msg.Context, ctx)
   715  	//assert.Equal(t, msg.Msg().Text(), "Level:debug")
   716  
   717  	msg = tagLogger.WithContext(ctx).Info("Level:", "info")
   718  	assert.Equal(t, msg.Level, log.InfoLevel)
   719  	assert.Equal(t, msg.File, code.File())
   720  	assert.Equal(t, msg.Line, code.Line()-3)
   721  	assert.Equal(t, msg.Tag, tagIn)
   722  	assert.Equal(t, msg.Context, ctx)
   723  	//assert.Equal(t, msg.Msg().Text(), "Level:info")
   724  
   725  	msg = tagLogger.WithContext(ctx).Infof("Level:%s", "info")
   726  	assert.Equal(t, msg.Level, log.InfoLevel)
   727  	assert.Equal(t, msg.File, code.File())
   728  	assert.Equal(t, msg.Line, code.Line()-3)
   729  	assert.Equal(t, msg.Tag, tagIn)
   730  	assert.Equal(t, msg.Context, ctx)
   731  	//assert.Equal(t, msg.Msg().Text(), "Level:info")
   732  
   733  	msg = tagLogger.WithContext(ctx).Warn("Level:", "warn")
   734  	assert.Equal(t, msg.Level, log.WarnLevel)
   735  	assert.Equal(t, msg.File, code.File())
   736  	assert.Equal(t, msg.Line, code.Line()-3)
   737  	assert.Equal(t, msg.Tag, tagIn)
   738  	assert.Equal(t, msg.Context, ctx)
   739  	//assert.Equal(t, msg.Msg().Text(), "Level:warn")
   740  
   741  	msg = tagLogger.WithContext(ctx).Warnf("Level:%s", "warn")
   742  	assert.Equal(t, msg.Level, log.WarnLevel)
   743  	assert.Equal(t, msg.File, code.File())
   744  	assert.Equal(t, msg.Line, code.Line()-3)
   745  	assert.Equal(t, msg.Tag, tagIn)
   746  	assert.Equal(t, msg.Context, ctx)
   747  	//assert.Equal(t, msg.Msg().Text(), "Level:warn")
   748  
   749  	msg = tagLogger.WithContext(ctx).Error("Level:", "error")
   750  	assert.Equal(t, msg.Level, log.ErrorLevel)
   751  	assert.Equal(t, msg.File, code.File())
   752  	assert.Equal(t, msg.Line, code.Line()-3)
   753  	assert.Equal(t, msg.Tag, tagIn)
   754  	assert.Equal(t, msg.Context, ctx)
   755  	//assert.Equal(t, msg.Msg().Text(), "Level:error")
   756  
   757  	msg = tagLogger.WithContext(ctx).Errorf("Level:%s", "error")
   758  	assert.Equal(t, msg.Level, log.ErrorLevel)
   759  	assert.Equal(t, msg.File, code.File())
   760  	assert.Equal(t, msg.Line, code.Line()-3)
   761  	assert.Equal(t, msg.Tag, tagIn)
   762  	assert.Equal(t, msg.Context, ctx)
   763  	//assert.Equal(t, msg.Msg().Text(), "Level:error")
   764  
   765  	msg = tagLogger.WithContext(ctx).Panic("Level:", "panic")
   766  	assert.Equal(t, msg.Level, log.PanicLevel)
   767  	assert.Equal(t, msg.File, code.File())
   768  	assert.Equal(t, msg.Line, code.Line()-3)
   769  	assert.Equal(t, msg.Tag, tagIn)
   770  	assert.Equal(t, msg.Context, ctx)
   771  	//assert.Equal(t, msg.Msg().Text(), "Level:panic")
   772  
   773  	msg = tagLogger.WithContext(ctx).Panicf("Level:%s", "panic")
   774  	assert.Equal(t, msg.Level, log.PanicLevel)
   775  	assert.Equal(t, msg.File, code.File())
   776  	assert.Equal(t, msg.Line, code.Line()-3)
   777  	assert.Equal(t, msg.Tag, tagIn)
   778  	assert.Equal(t, msg.Context, ctx)
   779  	//assert.Equal(t, msg.Msg().Text(), "Level:panic")
   780  
   781  	msg = tagLogger.WithContext(ctx).Fatal("Level:", "fatal")
   782  	assert.Equal(t, msg.Level, log.FatalLevel)
   783  	assert.Equal(t, msg.File, code.File())
   784  	assert.Equal(t, msg.Line, code.Line()-3)
   785  	assert.Equal(t, msg.Tag, tagIn)
   786  	assert.Equal(t, msg.Context, ctx)
   787  	//assert.Equal(t, msg.Msg().Text(), "Level:fatal")
   788  
   789  	msg = tagLogger.WithContext(ctx).Fatalf("Level:%s", "fatal")
   790  	assert.Equal(t, msg.Level, log.FatalLevel)
   791  	assert.Equal(t, msg.File, code.File())
   792  	assert.Equal(t, msg.Line, code.Line()-3)
   793  	assert.Equal(t, msg.Tag, tagIn)
   794  	assert.Equal(t, msg.Context, ctx)
   795  	//assert.Equal(t, msg.Msg().Text(), "Level:fatal")
   796  }