简单记录一下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. golang快速入门(六)特有程序结构

    提示:本系列文章适合对Go有持续冲动的读者 阅前须知:在程序结构这章,更多会关注golang中特有结构,与其他语言如C.python中相似结构(命名.声明.赋值.作用域等)不再赘述. 一.golang ...

  2. 程序员与年龄:四十岁普通开发、三十五岁首席架构、三十岁基层Leader

    最近,有一个词儿特别热门--躺平.有没有人跟你说过:"躺平说起来容易,做起来更容易." 和躺平相对的是另外一个词--内卷,群聊的时候,已经很多次看过草卷起来了.jpg表情包.某些节 ...

  3. 【RMAN】使用RMAN备份将数据库不完全恢复到指定时间点

    RMAN作为Oracle强大的备份恢复工具,可以协助我们恢复数据库到指定时间点,这便是Oracle不完全恢复的一种体现,通过这种方法可以找回我们曾经丢失的数据.这里以找回误TRUNCATE表数据为例给 ...

  4. Python+Selenium - windows安全中心的弹窗(账号登录)

    当出现如下图所示的 Windows安全中心弹窗,需要输入用户名和密码时 如何用Python+selenium跳过这个登录. 步骤: 1.在注册表中三个位置各添加两个东西:iexplore.exe 和 ...

  5. Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构)

    Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构) 介绍 对实时视频流的需求给视频服务提供商带来了严峻挑战,必须在管理基础设施和互联网带宽运营成本,还要为客户提供高质量体验.鉴于视频 ...

  6. GVS智能照明再下一城,前方到站贵阳地铁2号线!

    近期,"新基建"又频频刷屏,也为城轨交通建设快速发展提供了广阔的想象空间. 在新基建的导向作用下,越来越多城市加入地铁阵营.如果说普铁和高铁作为城市的发展窗口,那么地铁则是城市交通 ...

  7. 10分钟用JS实现微信 "炸屎"大作战

    大家好,我是秋风,近日,微信又发布了新功能(更新到微信8.0.6).最火热的非"炸屎"功能莫属了,各种群里纷纷玩起了炸屎的功能. 不知道大家是否经历过那样一个时候,小时候(我是说很 ...

  8. mybatis入门案例——IDEA版

    环境:IDEA2017,jdk1.8.0,maven3.5.2 步骤: 1.创建一个普通Maven工程,删掉src目录,再创建一个maveb的model命名为mybatis-01 2.配置 pom.x ...

  9. 【C++】sprintf 与sprintf_s

    (转自: http://blog.sina.com.cn/s/blog_4ded4a890100j2nz.html) 将过去的工程用VS2005打开的时候.你有可能会遇到一大堆的警告:warning ...

  10. Oracle11g RAC详解

    升级变化:          Oracle10g,高版本都是由低版本升级得到的.要装10.2.0.4,必须先安装database10.2.0.1,然后给这个ORACLE_HOME打补丁p6180189 ...