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

网站需要做实名认证如何做/自己怎么搭建网站

网站需要做实名认证如何做,自己怎么搭建网站,潍坊网站制作套餐,广州软件制作公司编写一个简单的文件日志 原文地址:煎鱼的迷之传送门 在上一节中,我们解决了APIs可以任意访问的问题,那么我们现在还有一个问题。 就是我们的日志,都是输出到控制台上的,这显然对于一个项目来说是不合理的,因…

编写一个简单的文件日志

原文地址:煎鱼的迷之传送门

在上一节中,我们解决了API's可以任意访问的问题,那么我们现在还有一个问题。

就是我们的日志,都是输出到控制台上的,这显然对于一个项目来说是不合理的,因此我们这一节简单封装log库,使其支持简单的文件日志!

项目地址:https://github.com/EDDYCJY/go...


新建logging

我们在pkg下新建logging目录,新建file.golog.go文件,写入内容:

编写file文件

1、 file.go:

package loggingimport ("os""time""fmt""log"
)var (LogSavePath = "runtime/logs/"LogSaveName = "log"LogFileExt = "log"TimeFormat = "20060102"
)func getLogFilePath() string {return fmt.Sprintf("%s", LogSavePath)
}func getLogFileFullPath() string {prefixPath := getLogFilePath()suffixPath := fmt.Sprintf("%s%s.%s", LogSaveName, time.Now().Format(TimeFormat), LogFileExt)return fmt.Sprintf("%s%s", prefixPath, suffixPath)
}func openLogFile(filePath string) *os.File {_, err := os.Stat(filePath)switch {case os.IsNotExist(err):mkDir()case os.IsPermission(err):log.Fatalf("Permission :%v", err)}handle, err := os.OpenFile(filePath, os.O_APPEND | os.O_CREATE | os.O_WRONLY, 0644)if err != nil {log.Fatalf("Fail to OpenFile :%v", err)}return handle
}func mkDir() {dir, _ := os.Getwd()err := os.MkdirAll(dir + "/" + getLogFilePath(), os.ModePerm)if err != nil {panic(err)}
}
  • os.Stat:返回文件信息结构描述文件。如果出现错误,会返回*PathError
type PathError struct {Op   stringPath stringErr  error
}
  • os.IsNotExist:能够接受ErrNotExistsyscall的一些错误,它会返回一个布尔值,能够得知文件不存在或目录不存在
  • os.IsPermission:能够接受ErrPermissionsyscall的一些错误,它会返回一个布尔值,能够得知权限是否满足
  • os.OpenFile:调用文件,支持传入文件名称、指定的模式调用文件、文件权限,返回的文件的方法可以用于I/O。如果出现错误,则为*PathError
const (// Exactly one of O_RDONLY, O_WRONLY, or O_RDWR must be specified.O_RDONLY int = syscall.O_RDONLY // 以只读模式打开文件O_WRONLY int = syscall.O_WRONLY // 以只写模式打开文件O_RDWR   int = syscall.O_RDWR   // 以读写模式打开文件// The remaining values may be or'ed in to control behavior.O_APPEND int = syscall.O_APPEND // 在写入时将数据追加到文件中O_CREATE int = syscall.O_CREAT  // 如果不存在,则创建一个新文件O_EXCL   int = syscall.O_EXCL   // 使用O_CREATE时,文件必须不存在O_SYNC   int = syscall.O_SYNC   // 同步IOO_TRUNC  int = syscall.O_TRUNC  // 如果可以,打开时
)
  • os.Getwd:返回与当前目录对应的根路径名
  • os.MkdirAll:创建对应的目录以及所需的子目录,若成功则返回nil,否则返回error
  • os.ModePermconst定义ModePerm FileMode = 0777

编写log文件

2、 log.go

package loggingimport ("log""os""runtime""path/filepath""fmt"
)type Level intvar (F *os.FileDefaultPrefix = ""DefaultCallerDepth = 2logger *log.LoggerlogPrefix = ""levelFlags = []string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL"}
)const (DEBUG Level = iotaINFOWARNINGERRORFATAL
)func init() {filePath := getLogFileFullPath()F = openLogFile(filePath)logger = log.New(F, DefaultPrefix, log.LstdFlags)
}func Debug(v ...interface{}) {setPrefix(DEBUG)logger.Println(v)
}func Info(v ...interface{}) {setPrefix(INFO)logger.Println(v)
}func Warn(v ...interface{}) {setPrefix(WARNING)logger.Println(v)
}func Error(v ...interface{}) {setPrefix(ERROR)logger.Println(v)
}func Fatal(v ...interface{}) {setPrefix(FATAL)logger.Fatalln(v)
}func setPrefix(level Level) {_, file, line, ok := runtime.Caller(DefaultCallerDepth)if ok {logPrefix = fmt.Sprintf("[%s][%s:%d]", levelFlags[level], filepath.Base(file), line)} else {logPrefix = fmt.Sprintf("[%s]", levelFlags[level])}logger.SetPrefix(logPrefix)
}
  • log.New:创建一个新的日志记录器。out定义要写入日志数据的IO句柄。prefix定义每个生成的日志行的开头。flag定义了日志记录属性
func New(out io.Writer, prefix string, flag int) *Logger {return &Logger{out: out, prefix: prefix, flag: flag}
}
  • log.LstdFlags:日志记录的格式属性之一,其余的选项如下
const (Ldate         = 1 << iota     // the date in the local time zone: 2009/01/23Ltime                         // the time in the local time zone: 01:23:23Lmicroseconds                 // microsecond resolution: 01:23:23.123123.  assumes Ltime.Llongfile                     // full file name and line number: /a/b/c/d.go:23Lshortfile                    // final file name element and line number: d.go:23. overrides LlongfileLUTC                          // if Ldate or Ltime is set, use UTC rather than the local time zoneLstdFlags     = Ldate | Ltime // initial values for the standard logger
)

当前目录结构:

gin-blog/
├── conf
│   └── app.ini
├── main.go
├── middleware
│   └── jwt
│       └── jwt.go
├── models
│   ├── article.go
│   ├── auth.go
│   ├── models.go
│   └── tag.go
├── pkg
│   ├── e
│   │   ├── code.go
│   │   └── msg.go
│   ├── logging
│   │   ├── file.go
│   │   └── log.go
│   ├── setting
│   │   └── setting.go
│   └── util
│       ├── jwt.go
│       └── pagination.go
├── routers
│   ├── api
│   │   ├── auth.go
│   │   └── v1
│   │       ├── article.go
│   │       └── tag.go
│   └── router.go
├── runtime

我们自定义的logging包,已经基本完成了,接下来让它接入到我们的项目之中吧!

我们打开先前包含log包的代码,

  1. 打开routers目录下的article.gotag.goauth.go
  2. log包的引用删除,修改引用我们自己的日志包为gin-blog/pkg/logging
  3. 将原本的log.Println(...)改为log.Info(...)

例如auth.go文件的修改内容:

package apiimport ("net/http""github.com/gin-gonic/gin""github.com/astaxie/beego/validation""gin-blog/pkg/e""gin-blog/pkg/util""gin-blog/models""gin-blog/pkg/logging"
)
...
func GetAuth(c *gin.Context) {...code := e.INVALID_PARAMSif ok {...} else {for _, err := range valid.Errors {logging.Info(err.Key, err.Message)}}c.JSON(http.StatusOK, gin.H{"code" : code,"msg" : e.GetMsg(code),"data" : data,})
}

验证功能

修改文件后,重启服务,我们来试试吧!

获取到API的Token后,我们故意传错误URL参数给接口,如:http://127.0.0.1:8000/api/v1/articles?tag_id=0&state=9999999&token=eyJhbG..

然后我们到$GOPATH/gin-blog/runtime/logs查看日志:

$ tail -f log20180216.log 
[INFO][article.go:79]2018/02/16 18:33:12 [state 状态只允许0或1]
[INFO][article.go:79]2018/02/16 18:33:42 [state 状态只允许0或1]
[INFO][article.go:79]2018/02/16 18:33:42 [tag_id 标签ID必须大于0]
[INFO][article.go:79]2018/02/16 18:38:39 [state 状态只允许0或1]
[INFO][article.go:79]2018/02/16 18:38:39 [tag_id 标签ID必须大于0]

日志结构一切正常,我们的记录模式都为Info,因此前缀是对的,并且我们是入参有问题,也把错误记录下来了,这样排错就很方便了!

至此,本节就完成了,这只是一个简单的扩展,实际上我们线上项目要使用的文件日志,是更复杂一些,开动你的大脑 举一反三吧!

参考

本系列示例代码

  • go-gin-example

本系列目录

  • 连载一 Golang介绍与环境安装
  • 连载二 搭建Blog API's(一)
  • 连载三 搭建Blog API's(二)
  • 连载四 搭建Blog API's(三)
  • 连载五 使用JWT进行身份校验
  • 连载六 编写一个简单的文件日志
  • 连载七 Golang优雅重启HTTP服务
  • 连载八 为它加上Swagger
  • 连载九 将Golang应用部署到Docker
  • 连载十 定制 GORM Callbacks
  • 连载十一 Cron定时任务
  • 连载十二 优化配置结构及实现图片上传
  • 连载十三 优化你的应用结构和实现Redis缓存
  • 连载十四 实现导出、导入 Excel
  • 连载十五 生成二维码、合并海报
  • 连载十六 在图片上绘制文字
  • 连载十七 用 Nginx 部署 Go 应用
  • 番外 Golang交叉编译
  • 番外 请入门 Makefile
http://www.jmfq.cn/news/4952701.html

相关文章:

  • 做可转债好的网站/网站app开发公司
  • 卖汽车配件怎么做网站/关键词怎么找出来
  • 简约网站首页/安徽网站建设优化推广
  • 学校网站建设栏目有哪些/营销型企业网站建设步骤
  • 网络促销分类 网站促销/今天热点新闻
  • 自己做发卡网站/沈阳网络seo公司
  • 厦门建网站哪家好/目前最靠谱的推广平台
  • 网站建设中企动力优/浏览器下载安装2023版本
  • h5商城网站开发/广告服务平台
  • 排版设计招聘/seo和sem
  • dedecms如何做音乐网站/优化大师免安装版
  • 南城微信网站建设/活动软文模板
  • 上海网站建设公司电话/宁德市教育局官网
  • 重庆市建设工程施工安全管理网站/百度写作助手
  • 石家庄网站建设推广公司报价/学做网站需要学什么
  • 一些做的好的网站/网站权重怎么看
  • 创建一个网站网站空间费用/百度搜索引擎排行榜
  • 做g3云推广需要网站/百度快速优化软件
  • 广告平台投放广告/seo外包公司多少钱
  • 免费域名空间网站/seo外链工具
  • 网站颜色编号/如何推广自己的网站
  • 自己做网站需要主机吗/最新最好的磁力搜索
  • wordpress电影源码/seo策划
  • 做网站和做网页有啥区别/百度应用商店app
  • 眉山网站制作/山西seo
  • 网站建设 考题/廊坊网站设计
  • 网页设计教程详细步骤/北京网站sem、seo
  • 泰州企业模板建站/企业培训权威机构
  • 网站设计者/成都网站制作
  • 移动服务器建设的电影网站/深圳seo排名哪家好