当前位置: 首页 > news >正文

哪个网站可以找做软件兼职的常见的网络推广方法

哪个网站可以找做软件兼职的,常见的网络推广方法,安监局网站做应急预案备案,会员卡管理系统哪里买一、Kratos 日志设计理念 kratos 日志库相关的官方文档#xff1a;日志 | Kratos Kratos的日志库主要有如下特性#xff1a; Logger用于对接各种日志库或日志平台#xff0c;可以用现成的或者自己实现Helper是在您的项目代码中实际需要调用的#xff0c;用于在业务代码里…一、Kratos 日志设计理念 kratos 日志库相关的官方文档日志 | Kratos Kratos的日志库主要有如下特性 Logger用于对接各种日志库或日志平台可以用现成的或者自己实现Helper是在您的项目代码中实际需要调用的用于在业务代码里打日志Filter用于对输出日志进行过滤或魔改通常用于日志脱敏Valuer用于绑定一些全局的固定值或动态值比如时间戳、traceID或者实例id之类的东西到输出日志中 Logger统一了日志的接入方式Helper接口统一的日志库的调用方式。 二、Kratos 使用标准内置日志库的方法 1、打印日志到控制台的步骤  ①导入kratos日志包 import github.com/go-kratos/kratos/v2/log//若导入失败则需先获取包 go get github.com/go-kratos/kratos/v2/log ②使用 kratos 内置标准输出创建日志对象  logger : log.NewStdLogger(os.Stdout) ③用 Log 方法打印日志需要传入日志级别  logger.Log(log.LevelInfo, msg, logger.Log 打印的日志) ④为了简化写日志时需传入的参数kratos 用 Helper 对 Logger 进行了包装建议用新建 helper 对象写日志方法如下 //对 logger 进行包装简化写日志时需传入的参数 h : log.NewHelper(logger)//写入信息级别的日志 h.Info(使用 kratos 内置标准输出记录的日志)//写入错误级别的日志 h.Errorf(用户名【%s】不存在, 张三) ⑤可通过 log.With() 方法绑定全局字段到 Vauler用来打印全局信息到日志中 //通过 log.With 方法绑定全局字段到 Vauler用来打印全局信息到日志中 logger log.With(logger,ts, log.DefaultTimestamp,caller, log.DefaultCaller,trace_id, tracing.TraceID(),span_id, tracing.SpanID(), ) h log.NewHelper(logger) h.Info(绑定了全局信息到日志中) ⑥用 log.NewFilter() 方法对日志输出进行过滤 // 日志过滤显示特定级别的日志或对敏感信息脱敏 h log.NewHelper(log.NewFilter(logger,// 按等级过滤//log.FilterLevel(log.LevelError),// 按key遮蔽log.FilterKey(username),// 按value遮蔽log.FilterValue(hello),), ) h.Warn(warn log) h.Infow(password, 123456) //日志中 kratos 会变为 *** h.Infow(username, kratos) //日志中 hello 会变为 *** h.Info(hello) 效果演示 完整代码 package mainimport (osgithub.com/go-kratos/kratos/v2github.com/go-kratos/kratos/v2/loggithub.com/go-kratos/kratos/v2/middleware/tracinggithub.com/go-kratos/kratos/v2/transport/http )func main() {//使用 kratos 内置标准输出创建日志对象logger : log.NewStdLogger(os.Stdout)// 用 Log 方法打印日志需要传入日志级别不建议使用这种方式而建议使用 helper 打印日志logger.Log(log.LevelInfo, msg, logger.Log 打印的日志)//对 logger 进行包装简化写日志时需传入的参数h : log.NewHelper(logger)//写入信息级别的日志h.Info(使用 kratos 内置标准输出记录的日志)//写入错误级别的日志h.Errorf(用户名【%s】不存在, 张三)// 通过 log.With 方法绑定全局字段到 Vauler用来打印全局信息到日志中logger log.With(logger,ts, log.DefaultTimestamp,caller, log.DefaultCaller,trace_id, tracing.TraceID(),span_id, tracing.SpanID(),)h log.NewHelper(logger)h.Info(绑定了全局信息到日志中)// 日志过滤显示特定级别的日志或对敏感信息脱敏h log.NewHelper(log.NewFilter(logger,// 按等级过滤//log.FilterLevel(log.LevelError),// 按key遮蔽log.FilterKey(username),// 按value遮蔽log.FilterValue(hello),),)h.Warn(warn log)h.Infow(password, 123456)//日志中 kratos 会变为 ***h.Infow(username, kratos)//日志中 hello 会变为 ***h.Info(hello)//创建 kratos http server 及 apphttpSrv : http.NewServer(http.Address(:8080),)app : kratos.New(kratos.Name(测试log),kratos.Server(httpSrv,),)if err : app.Run(); err ! nil {log.Fatal(err)} }2、将日志写入到本地文件的方法 ① 通过 os.OpenFile 新建文件获取到 os.File 对象 f, err : os.OpenFile(../test.log, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666) if err ! nil {return } ② 通过 log.NewStdLogger(w io.Writer) 新建 logger 时传入上述 os.File 对象 f //输出到控制台传入os.Stdout输出到文件则传文件指针 logger : log.NewStdLogger(f) 注意os.File 实现了  io.Writer 接口的 Write(p []byte) (n int, err error) 方法所以能将 f 作为输入参数传入 log.NewStdLogger() 函数 ③用 log.NewHelper 包装 logger并打印日志 h1 : log.NewHelper(logger1) h1.Info(输出到日志文件中的日志信息) 效果演示 代码实现 package mainimport (osgithub.com/go-kratos/kratos/v2github.com/go-kratos/kratos/v2/loggithub.com/go-kratos/kratos/v2/transport/http )func main() {// 通过 log.NewStdLogger(w io.Writer) 中的 io.Writer 设置日志输出方式// 将日志输出到 test.log 文件f, err : os.OpenFile(../test.log, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)if err ! nil {return}logger1 : log.NewStdLogger(f)h1 : log.NewHelper(logger1)h1.Info(输出到日志文件中的日志信息)//创建 kratos http server 及 apphttpSrv : http.NewServer(http.Address(:8080),)app : kratos.New(kratos.Name(测试log),kratos.Server(httpSrv,),)if err : app.Run(); err ! nil {log.Fatal(err)} }三、 zap 日志库的使用方法 1、zap简介 Zap 是 uber 用 go 语言实现的超快、结构化、分级的日志记录库性能极高比其他结构化日志记录包快4-10倍。日志记录结构化以JSON等格式输出。 有关详细介绍见zap package - go.uber.org/zap - Go Packages 2、使用方法 ①安装 zap 包 go get -u go.uber.org/zap ②导入 zap 包 import go.uber.org/zap ③用 NewProduction 等方法创建 zap 日志对象 // 创建 zap 日志对象 zaplogger, _ : zap.NewProduction() defer logger.Sync() ④调用 Info、Error 等方法打印日志 //使用 zap 写日志 zaplogger.Info(failed to fetch URL,zap.String(url, http://dddd.com),zap.Int(attempt, 3),zap.Duration(backoff, time.Second), ) 效果演示 完整代码 package mainimport (timekzap github.com/go-kratos/kratos/contrib/log/zap/v2github.com/go-kratos/kratos/v2github.com/go-kratos/kratos/v2/loggithub.com/go-kratos/kratos/v2/transport/httpgo.uber.org/zap )func main() {// 创建 zap 日志对象并打印日志zaplogger, _ : zap.NewProduction()defer zaplogger.Sync()//使用 zap 写日志zaplogger.Info(failed to fetch URL,zap.String(url, http://dddd.com),zap.Int(attempt, 3),zap.Duration(backoff, time.Second))httpSrv : http.NewServer(http.Address(:8080),)app : kratos.New(kratos.Name(测试log),kratos.Server(httpSrv,),)if err : app.Run(); err ! nil {log.Fatal(err)} }⑤如果需要将日志输出到文件则使用如下方法 package mainimport (oskzap github.com/go-kratos/kratos/contrib/log/zap/v2github.com/go-kratos/kratos/v2github.com/go-kratos/kratos/v2/loggithub.com/go-kratos/kratos/v2/transport/httpgo.uber.org/zapgo.uber.org/zap/zapcore )func main() {// 配置Encoderencoder : zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())// 配置 WriteSyncer将日志写入文件f, err : os.OpenFile(zaptest.log, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)if err ! nil {panic(err)}defer f.Close()writeSyncer : zapcore.AddSync(f)// 设置LogLevellevel : zap.NewAtomicLevelAt(zapcore.InfoLevel)// 创建Corecore : zapcore.NewCore(encoder, writeSyncer, level)// 构建Loggerzaplogger : zap.New(core)logger : kzap.NewLogger(zaplogger)// 将 zap 日志对象适配到 kratos 的日志库以便直接使用 kratos 的日志方法h : log.NewHelper(logger)h.Info(msg, kratos适配的zap, 写入日志到文件)httpSrv : http.NewServer(http.Address(:8080),)app : kratos.New(kratos.Name(测试log),kratos.Server(httpSrv,),)if err : app.Run(); err ! nil {log.Fatal(err)} }效果演示 四、Kratos 适配 zap 日志库的方法 kratos 在 contrib/log  实现好了一些插件用于适配目前常用的日志库。 std 标准输出Kratos内置fluent 输出到fluentdzap 适配了uber的zap日志库aliyun 输出到阿里云日志 使用方法 ①安装 kratos 的 zap 适配包 go get github.com/go-kratos/kratos/contrib/log/zap/v2 ②导入 zap 适配包 import (kzap github.com/go-kratos/kratos/contrib/log/zap/v2 ) ③创建 zap 日志对象 // 创建 zap 日志对象并打印日志 zaplogger, _ : zap.NewProduction() defer zaplogger.Sync() ④调用函数 NewLogger(zlog *zap.Logger) 将创建的 zap 日志对象适配到 kratos 的日志操作对象 // 将 zap 日志对象适配到 kratos 的日志库以便直接使用 kratos 的日志方法 logger : kzap.NewLogger(zaplogger) ⑤调用函数 log.NewHelper 将 logger 进行包装简化日志写入操作 h : log.NewHelper(logger) h.Info(kratos适配的zap日志库) 效果演示 代码实现 package mainimport (kzap github.com/go-kratos/kratos/contrib/log/zap/v2github.com/go-kratos/kratos/v2github.com/go-kratos/kratos/v2/loggithub.com/go-kratos/kratos/v2/transport/httpgo.uber.org/zap )func main() {// 创建 zap 日志对象并打印日志zaplogger, _ : zap.NewProduction()defer zaplogger.Sync()// 将 zap 日志对象适配到 kratos 的日志库以便直接使用 kratos 的日志方法logger : kzap.NewLogger(zaplogger)h : log.NewHelper(logger)h.Info(kratos适配的zap日志库)httpSrv : http.NewServer(http.Address(:8080),)app : kratos.New(kratos.Name(测试log),kratos.Server(httpSrv,),)if err : app.Run(); err ! nil {log.Fatal(err)} } 五、Kratos 适配第三方日志库的实现原理 kratos 底层日志接口 Logger可用于快速适配各种日志库到框架中来仅需要实现一个最简单的Log方法。 // Logger is a logger interface. type Logger interface {Log(level Level, keyvals ...interface{}) error } 以适配 uber 的 zap 日志库为例kratos 在 contrib/log/zap/zap.go 中定义了新的日志结构体 Logger并实现了方法 Log(level log.Level, keyvals ...interface{}) error。其源码如下 package zapimport (fmtgo.uber.org/zapgithub.com/go-kratos/kratos/v2/log )var _ log.Logger (*Logger)(nil)type Logger struct {log *zap.LoggermsgKey string }type Option func(*Logger)// WithMessageKey with message key. func WithMessageKey(key string) Option {return func(l *Logger) {l.msgKey key} }func NewLogger(zlog *zap.Logger) *Logger {return Logger{log: zlog,msgKey: log.DefaultMessageKey,} }func (l *Logger) Log(level log.Level, keyvals ...interface{}) error {var (msg keylen len(keyvals))if keylen 0 || keylen%2 ! 0 {l.log.Warn(fmt.Sprint(Keyvalues must appear in pairs: , keyvals))return nil}data : make([]zap.Field, 0, (keylen/2)1)for i : 0; i keylen; i 2 {if keyvals[i].(string) l.msgKey {msg, _ keyvals[i1].(string)continue}data append(data, zap.Any(fmt.Sprint(keyvals[i]), keyvals[i1]))}switch level {case log.LevelDebug:l.log.Debug(msg, data...)case log.LevelInfo:l.log.Info(msg, data...)case log.LevelWarn:l.log.Warn(msg, data...)case log.LevelError:l.log.Error(msg, data...)case log.LevelFatal:l.log.Fatal(msg, data...)}return nil }func (l *Logger) Sync() error {return l.log.Sync() }func (l *Logger) Close() error {return l.Sync() }
http://www.hkea.cn/news/14586155/

相关文章:

  • 江门网站推广设计网站建设制作经验足
  • 怎么切图做网站义乌微硕网络科技有限公司
  • 左侧导航网站青海省安建设管理部门网站
  • 清远建设网站制作软件开发外包公司好不好
  • 浦东网站建设价格旅游社做的最好的网站
  • 三明市住房和城乡建设局网站奖券世界推广网站
  • ip地址进入网站怎么做的网站商城服务体系建设方案
  • 网站优化需要什么软件北滘网站建设公司
  • 健身餐的网站怎么做高清品牌网站设计建设
  • 有没有找项目的网站手机怎么建立网站
  • 网站建设及推广培训WordPress众筹模板
  • 网站建设ASP心得体会wordpress 4.1 搜索框
  • 信阳网站开发安卓app下载官方正式版
  • 邢台做移动网站公司打开搜索引擎
  • 杭州做网站公司平台建设包括哪些方面
  • 宝安住房和建设局网站官网建站公司怎么接单
  • 网站域名重定向怎么做杭州高端设计网站建设
  • 建设银行手机官方网站下载网站对应不同域名
  • 做问卷的网站生成二维码毕业设计代做网站唯一
  • 林芝企业网站建设公司今天头条新闻
  • 网站数据库一般多大企业网网站
  • dw做的网站后台是什么天津电子商务网站建设
  • 网站建设吸引客户的宁夏网站制作哪家好
  • 做音乐网站之前的准备茶文化网站网页设计
  • 淮安做网站的有多少钱wordpress橱窗插件
  • 郑州专门做网站的公司有哪些南宁网站建设升上去
  • 江岸区建设局网站珠宝网站开发目的
  • 余江网站建设wordpress 去掉emoji
  • 网站管理与维护的优势aspx网站开发教程
  • 环球国际网站建设外贸营销员