john's tech blog

hope is coming


  • 首页

  • 标签

  • 归档

go日志库zap的设计之Option(1)

发表于 2023-03-06 | 更新于 2023-03-07

zap日志库的Option可以用来增强日志记录器,我们看看它的设计:

1
2
3
4
type Option interface {

apply(*logger)
}

Option被设计成了内部接口:只有包内部才能定义接口实现,它有一个接受一个日志记录器参数的apply方法。
zap的设计者在接口包内又利用了go的方法类型来实现了这个接口:

1
2
3
4
5
type optionFunc func(*Logger)

func (f optionFunc) apply(log *Logger) {

f(log)
}

zap包装或者替换Core的Option就利用了这个optionFunc:

1
2
3
4
5
6
7
func WrapCore(f func(zapcore.Core) zapcore.Core) Option {

return optionFunc(func(log *Logger) {
//
log.core = f(log.core)
})
}

此方法体现了Go语言方法的精妙之处,传入的方法参数通过闭包让外部在合适的时候再调用。
我们来看下WrapCore的使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
nop := zap.WrapCore(func(zapcore.Core) zapcore.Core {

return zapcore.NewNopCore()
})

logger := zap.NewExample()
defer logger.Sync()

logger.Info("working")
//没有任何操作,不会输出日志
logger.WithOptions(nop).Info("no-op")
//不会影响原来的日志输出
logger.Info("original logger still works")

最终只输出了如下两条日志:
{“level”:”info”,”msg”:”working”}
{“level”:”info”,”msg”:”original logger still works”}

也就是说logger可以加上WrapCore这个Option替换了原来的日志输出策略。

makefile基础用法

发表于 2022-10-10

创建一个Makef文件,内容如下:

1
2
3
4
5
test:
# 这是测试

test1:
# 这是测试1

执行make -f Makef test1,输出# 这是测试1

jedis基础使用之定义jedis实例

发表于 2022-10-09
  1. jedis可以使用无参构造函数实例化:
1
2
3
4
try (Jedis j = new Jedis()) {
j.auth("foobared");
j.dbSize();
}

使用try语法说明jedis类实现了java的Closeable接口

  1. jedis也可以使用HostAndPort对象和JedisClientConfig配置对象实例化:
1
2
3
try (Jedis jedis = new Jedis(hnp, DefaultJedisClientConfig.builder().password("foobared")
.build())) {
}

日志框架设计之SpringBoot日志模块的设计

发表于 2022-09-15 | 更新于 2022-09-17

Spring Boot日志模块的设计

首先我们需要关注LoggingApplicationListener这个应用监听器,它的官方说明如下:

An ApplicationListener that configures the LoggingSystem. If the environment contains a logging.config property it will be used to bootstrap the logging system, otherwise a default configuration is used. Regardless, logging levels will be customized if the environment contains logging.level.* entries and logging groups can be defined with logging.group.

日志框架设计之日志级别

发表于 2022-09-05

日志级别概述

在平时的软件开发过程中,我们通常会使用某一种日志框架来记录我们的系统日志,比如使用Java语言开发的时候,我们通常会使用Logback,Log4j2等,而使用Go语言开发的时候可能会使用到Go自带的日志Api或者Zap框架等。那么这些框架是如何设计与实现的呢?从本篇开始我们就来逐一探讨这些框架的设计与实现。

本篇先来谈下日志框架中普遍会采用的一个设计要点:Level,也就是日志的级别。系统运行到某一行打印日志的代码时会根据当前配置的日志级别来决定是否输出这行日志消息。日志级别通常都会有如下几个级别来分别对应软件生命周期的各个阶段:

  1. 调试级别,代码中通常会使用Debug这个词,这个级别可以帮助开发人员在开发过程中需要调试时打印出有帮助的信息。
  2. 信息级别,代码中通常会使用Info这个词,这个级别的日志一般用于软件运行过程中非开发人员也能够看到的正常的信息。
12…47

John

232 日志
43 标签
GitHub Twitter
欢迎关注我的公众号:沉迷Spring
© 2023 johnwonder
由 Hexo 强力驱动 v3.2.0
|
主题 – NexT.Pisces v7.1.1
|
0%