简单记录一下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实战应用的更多相关文章

  1. SSH实战 · 唯唯乐购项目(上)

    前台需求分析 一:用户模块 注册 前台JS校验 使用AJAX完成对用户名(邮箱)的异步校验 后台Struts2校验 验证码 发送激活邮件 将用户信息存入到数据库 激活 点击激活邮件中的链接完成激活 根 ...

  2. GitHub实战系列汇总篇

    基础: 1.GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9 http://www.cnblogs.com/dunitian/p/5034624.html 2.GitHub实战系 ...

  3. MySQL 系列(四)主从复制、备份恢复方案生产环境实战

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  4. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  5. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  6. asp.net core 实战之 redis 负载均衡和"高可用"实现

    1.概述 分布式系统缓存已经变得不可或缺,本文主要阐述如何实现redis主从复制集群的负载均衡,以及 redis的"高可用"实现, 呵呵双引号的"高可用"并不是 ...

  7. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...

  8. Linux实战教学笔记07:Linux系统目录结构介绍

    第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...

  9. Linux实战教学笔记06:Linux系统基础优化

    第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...

随机推荐

  1. Centos 7常见问题——SMBus Host Controller not enabled!

    在使用虚拟机Centos7操作系统偶尔会遇到,重启开机过程中出现如下图情况,无法正常开机 出现这种情况的可能原因就是你在虚拟机中添加了网卡或硬盘,还有给内存添加了容量之类就会导致开机有这种报错 解决方 ...

  2. ubuntu 14.04安装mysql-python

    网上看到的是想安装mysql-python都得安装mysql本身,可是我就不想安装这个数据库,而是用于连接到别的服务器上的mysql,所以下面就是安装过程: 1. 直接运行: pip install ...

  3. JavaSE-QuickStart

    老话常说:基础不牢地动山摇,于是我在b站上看杨中科老师的课程脑补一下,便记录这岁月的点滴 1.什么是编程 ? 编程:编写能够控制计算机来执行特定任务的代码. 2.什么是编程语言 ? 编程语言:是指程序 ...

  4. Python+Selenium - Alert弹框

    上面三种弹窗可以在浏览器的控制台做出效果,如下图 上面三种弹窗可以用alert方法处理 示例: #出现弹窗的操作xxxx# 切换al = driver.switch_to.alert# print(a ...

  5. 解决maven依赖冲突问题

    解决maven依赖冲突问题 1.idea 安装maven helper插件 2.打开pom.xml文件 底部多出一个Dependency Analyzer选项 点开这个选项 找到冲突,点击右键,选择E ...

  6. zk客户端及锁的使用

    1.生成zk客户端对象 private CuratorFramework buildClient() { logger.info("zookeeper registry center ini ...

  7. 重型车辆盲区行为检查Behaviours – Heavy Vehicle Blind Spots

    重型车辆盲区行为检查Behaviours – Heavy Vehicle Blind Spots VISIBILITY AROUND HEAVY VEHICLES A blind spot is an ...

  8. MAML-Tracker: 目标跟踪分析:CVPR 2020(Oral)

    MAML-Tracker: 目标跟踪分析:CVPR 2020(Oral) Tracking by Instance Detection: A Meta-Learning Approach 论文链接:h ...

  9. 使用Runtime执行推理(C++)

    使用Runtime执行推理(C++) 概述 通过MindSpore Lite模型转换后,需在Runtime中完成模型的推理执行流程.本教程介绍如何使用C++接口编写推理代码. Runtime总体使用流 ...

  10. python2向python3移植问题

    问题: payload = "A"*140 # padding ropchain = p32(puts_plt) ropchain += p32(entry_point) ropc ...