go logrus实战应用
简单记录一下logrus实战应用,详细了解可以移步官网,这是直接使用
上代码:
logrus整个项目应用封装
package log
import (
"fmt"
"github.com/sirupsen/logrus"
"go_service/config"
"os"
"path"
"time"
)
var log = logrus.New()
func Debug(fileds logrus.Fields,args ...interface{}) {
setOutPutFile(logrus.DebugLevel,fileds ,args)
logrus.WithFields(fileds).Debug(args)
}
func Info(fileds logrus.Fields,args ...interface{}) {
setOutPutFile(logrus.InfoLevel,fileds ,args)
logrus.WithFields(fileds).Info(args)
}
func Warn(fileds logrus.Fields,args ...interface{}) {
setOutPutFile(logrus.WarnLevel,fileds ,args)
logrus.WithFields(fileds).Warn(args)
}
func Fatal(fileds logrus.Fields,args ...interface{}) {
setOutPutFile(logrus.FatalLevel,fileds ,args)
logrus.WithFields(fileds).Fatal(args)
}
func Error(fileds logrus.Fields,args ...interface{}) {
setOutPutFile(logrus.ErrorLevel,fileds ,args)
log.WithFields(fileds).Error(args)
}
func Panic(fileds logrus.Fields,args ...interface{}) {
setOutPutFile(logrus.PanicLevel,fileds ,args)
logrus.WithFields(fileds).Panic(args)
}
func Trace(fileds logrus.Fields,args ...interface{}) {
setOutPutFile(logrus.TraceLevel,fileds ,args)
logrus.WithFields(fileds).Trace(args)
}
//level logrus.Level
func setOutPutFile(level logrus.Level,fileds logrus.Fields,args ...interface{}) {
if _,err := os.Stat(config.BaseConf.Log.Dir);os.IsNotExist(err){
err = os.MkdirAll(config.BaseConf.Log.Dir,0777)
if err != nil {
panic(fmt.Errorf("create log dir '%s' error:%s",config.BaseConf.Log.Dir,err))
}
}
fileName := path.Join("./"+config.BaseConf.Log.Dir,time.Now().Format("2006-01-02") + ".log")
var err error
files,err := os.OpenFile(fileName,os.O_WRONLY|os.O_APPEND|os.O_SYNC|os.O_CREATE|os.O_RDWR,0766)
if err != nil{
fmt.Print("open log file err",err)
}else{
log.Out = files
}
logrus.SetOutput(files)
logrus.SetLevel(level)
return
}
这里日志文件我是根据自己的需求,每天一个日志文件,可以根据自己的习惯应用去设置日志的生成;
日志问价位置配置
config文件下
config.yaml
log:
dir: /logs/
config.go
package config
import (
"gopkg.in/yaml.v2"
"io/ioutil"
)
var BaseConf Config
type LogConf struct {
Dir string `yaml:"dir"`
}
type Config struct {
Log LogConf `yaml:"log"`
}
func Init() {
confPath := "config/config.yaml"
if yamlFile,err:= ioutil.ReadFile(confPath);err != nil {
panic("read config err:" + err.Error())
}else if err = yaml.Unmarshal(yamlFile,&BaseConf); err != nil{
panic("conf file unmarshal error:"+err.Error())
}
}
这里配置日志文件位置,当然也是可以直接写的,但是在建议配置在一个文件中,然后项目启动是调用
r := gin.Default()
//r.Use(middleware.LoggerToFile())
config.Init()
然后就是项目使用
log.Error(logrus.Fields{"err":err.Error(),"source":pkg.GetPath()},"Model - FindArticle - Count")
这其中pkg.GetPath()是获取当前执行文件的路径以及报错行数
pak方法
package pkg
import (
"runtime"
"strconv"
)
func GetPath() string {
_,path,line,_:= runtime.Caller(1)
response := path +":" + strconv.Itoa(line)
return response
}
后面呈现打印的日志
至于中间件,如果是大型项目多台服务器,使用更好,我这没必要也就没写入,下面直接放中间件代码:
package middleware
import (
"bytes"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
"go_service/log"
"io/ioutil"
"time"
)
func LoggerToFile() gin.HandlerFunc {
return func(ctx *gin.Context) {
//开始时间
start := time.Now()
//请求报文
var resquestBody []byte
if ctx.Request.Body != nil{
var err error
resquestBody,err = ctx.GetRawData()
if err != nil {
log.Warn(logrus.Fields{"err":err.Error()},"get http request")
}
ctx.Request.Body = ioutil.NopCloser(bytes.NewBuffer(resquestBody))
}
//处理请求
ctx.Next()
//结束时间
end := time.Now()
log.Info(map[string]interface{}{
"statsCode":ctx.Writer.Status(),
"cost":float64(end.Sub(start).Nanoseconds()/1e4)/100.0,
"clientlp":ctx.ClientIP(),
"method":ctx.Request.Method,
"url":ctx.Request.RequestURI,
})
}
}
在启动项目时使用
r := gin.Default()
r.Use(middleware.LoggerToFile())
打印日志:
肯定有更好的方法,但是自己没研究出来,就先使用的现在的封装
本文连接:点击
博主个人小博客:嘿嘿
go logrus实战应用的更多相关文章
- SSH实战 · 唯唯乐购项目(上)
前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...
- GitHub实战系列汇总篇
基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...
- MySQL 系列(四)主从复制、备份恢复方案生产环境实战
第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...
- Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现
0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...
- 给缺少Python项目实战经验的人
我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...
- asp.net core 实战之 redis 负载均衡和"高可用"实现
1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...
- Linux实战教学笔记08:Linux 文件的属性(上半部分)
第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...
- Linux实战教学笔记07:Linux系统目录结构介绍
第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...
- Linux实战教学笔记06:Linux系统基础优化
第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...
随机推荐
- String 是一个奇怪的引用类型
开局两张图,内容全靠刷! 马甲哥看到这样的现象,一开始还是有点懵逼. 这个例子,string是纯粹的引用类型,但是在函数传值时类似于值传递: 我之前给前后示例的内存变化图吧: 根因就是大多数高级语言都 ...
- 西门子 S7-200 通过以太网通讯模块连接MCGS 通讯
北京华科远创科技有限研发的远创智控ETH-YC模块,以太网通讯模块型号有MPI-ETH-YC01和PPI-ETH-YC01,适用于西门子S7-200/S7-300/S7-400.SMART S7-20 ...
- Step By Step(Lua-C API简介)
Step By Step(Lua-C API简介) Lua是一种嵌入式脚本语言,即Lua不是可以单独运行的程序,在实际应用中,主要存在两种应用形式.第一种形式是,C/C++作为主程序,调用Lua代码, ...
- SQL Server 将两行或者多行拼接成一行数据
一个朋友,碰到一个问题. 就是查询出来的结果集,需要每隔三行.就将这三行数据以此拼接为一行显示.起初我想着用ROW_NUMBER加CASE WHEN去做,发现结果并非我预期那样. 结果如下: 由于别人 ...
- Tvm一些基本技术
Tvm一些基本技术 一.总体流程: TVM的工作流程:首先,将网络表示成统一的表示形式(Intermediate Representation),并进行一些可重用的图优化:然后,利用不同的后端生成对应 ...
- OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)?
OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)? 图形硬件供应商,需要为显示适配器编,编写用户模式显示驱动程序.用户模式显示驱动程序,是由Microsoft Direct3D运行时加 ...
- Caffe框架GPU与MLU计算结果不一致请问如何调试?
Caffe框架GPU与MLU计算结果不一致请问如何调试? 某一检测模型移植到Cambricon Caffe上时,发现无法检测出结果,于是将GPU和MLU的运行结果输出并保存后进行对比,发现二者计算结果 ...
- PyTorch神经网络集成技术
PyTorch神经网络集成技术 create_python_neuropod 将任意python代码打包为一个neurood包. create_python_neuropod( neuropod_pa ...
- Single Shot Multibox Detection (SSD)实战(上)
Single Shot Multibox Detection (SSD)实战(上) 介绍了边界框.锚框.多尺度对象检测和数据集.现在,我们将利用这些背景知识构建一个目标检测模型:单次多盒检测(SSD) ...
- Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?
阅前提醒 全文较长,建议沉下心来慢慢阅读,最好是打开Idea,点开Spring源码,跟着下文一步一步阅读,更加便于理解.由于笔者水平优先,编写时间仓促,文中难免会出现一些错误或者不准确的地方,恳请各位 ...