使用Lumberjack+zap进行日志切割归档操作

使用Lumberjack+zap进行日志切割归档

为了添加日志切割归档功能,我们将使用第三方库Lumberjack来实现。

安装

执行下面的命令安装Lumberjack

go get -u github.com/natefinch/lumberjack

zap logger中加入Lumberjack

要在zap中加入Lumberjack支持,我们需要修改WriteSyncer代码。我们将按照下面的代码修改getLogWriter()函数:

func getLogWriter() zapcore.WriteSyncer {
 lumberJackLogger := &lumberjack.Logger{
 Filename: "./test.log",
 MaxSize: 10,
 MaxBackups: 5,
 MaxAge:  30,
 Compress: false,
 }
 return zapcore.AddSync(&lumberJackLogger)
}

Lumberjack Logger采用以下属性作为输入:

Filename: 日志文件的位置

MaxSize:在进行切割之前,日志文件的最大大小(以MB为单位)

MaxBackups:保留旧文件的最大个数

MaxAges:保留旧文件的最大天数

Compress:是否压缩/归档旧文件

测试所有功能

package main
import (
 "net/http"
 "go.uber.org/zap"
 "go.uber.org/zap/zapcore"
 lumberjack "gopkg.in/natefinch/lumberjack.v2"
)
var sugarLogger *zap.SugaredLogger
func main() {
 InitLogger()
 defer sugarLogger.Sync()
 for i:=0; i < 10000;i++ {
 simpleHttpGet("www.baidu.com")
 simpleHttpGet("http://www.baidu.com")
 }
}
func InitLogger() {
 writeSyncer := getLogWriter()
 encoder := getEncoder()
 core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)
 logger := zap.New(core, zap.AddCaller())
 sugarLogger = logger.Sugar()
}
func getEncoder() zapcore.Encoder {
 encoderConfig := zap.NewProductionEncoderConfig()
 encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
 encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
 return zapcore.NewConsoleEncoder(encoderConfig)
}
func getLogWriter() zapcore.WriteSyncer {
 lumberJackLogger := &lumberjack.Logger{
 Filename: "/aseit-data/gocode/src/gitlab.aseit.cn/AI_PRODUCT/psd_be_zhang/test/test.log", // ⽇志⽂件路径
 MaxSize: 1,  // 1M=1024KB=1024000byte
 MaxBackups: 5,  // 最多保留5个备份
 MaxAge:  30,  // days
 Compress: false, // 是否压缩 disabled by default
 }
 return zapcore.AddSync(lumberJackLogger)
}
func simpleHttpGet(url string) {
 sugarLogger.Debugf("Trying to hit GET request for %s", url)
 resp, err := http.Get(url)
 if err != nil {
 sugarLogger.Errorf("Error fetching URL %s : Error = %s", url, err)
 } else {
 sugarLogger.Infof("Success! statusCode = %s for URL %s", resp.Status, url)
 resp.Body.Close()
 }
}

同时,可以在main函数中循环记录日志,测试日志文件是否会自动切割和归档(日志文件每1MB会切割并且在当前目录下最多保存5个备份)。

补充:golang zap日志的使用

zap是一个高性能日志库,github链接【传送门】,下面简单介绍一下zap的使用。

1.下载zap包

因为zap是uber开源的,zap内使用的包是在go.uber.org/zap,如果直接go get这个包,可能会提示get不下来。可以go get github.com/uber-go/zap,然后再把zap目录复制到src/go.uber.org下(可能还会需要go.uber.org/atomic和go.uber.org/multierr,均可参考该方法get下来)

2.zap简单封装示例。

package logger

import (
 "go.uber.org/zap"
 "go.uber.org/zap/zapcore"
 "gopkg.in/natefinch/lumberjack.v2"
)

// error logger
var errorLogger *zap.SugaredLogger

var levelMap = map[string]zapcore.Level{
 "debug": zapcore.DebugLevel,
 "info": zapcore.InfoLevel,
 "warn": zapcore.WarnLevel,
 "error": zapcore.ErrorLevel,
 "dpanic": zapcore.DPanicLevel,
 "panic": zapcore.PanicLevel,
 "fatal": zapcore.FatalLevel,
}

func getLoggerLevel(lvl string) zapcore.Level {
 if level, ok := levelMap[lvl]; ok {
 return level
 }
 return zapcore.InfoLevel
}

func init() {
 fileName := "zap.log"
 level := getLoggerLevel("debug")
 syncWriter := zapcore.AddSync(&lumberjack.Logger{
 Filename: fileName,
 MaxSize: 1 << 30, //1G
 LocalTime: true,
 Compress: true,
 })
 encoder := zap.NewProductionEncoderConfig()
 encoder.EncodeTime = zapcore.ISO8601TimeEncoder
 core := zapcore.NewCore(zapcore.NewJSONEncoder(encoder), syncWriter, zap.NewAtomicLevelAt(level))
 logger := zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
 errorLogger = logger.Sugar()
}

func Debug(args ...interface{}) {
 errorLogger.Debug(args...)
}

func Debugf(template string, args ...interface{}) {
 errorLogger.Debugf(template, args...)
}

func Info(args ...interface{}) {
 errorLogger.Info(args...)
}

func Infof(template string, args ...interface{}) {
 errorLogger.Infof(template, args...)
}

func Warn(args ...interface{}) {
 errorLogger.Warn(args...)
}

func Warnf(template string, args ...interface{}) {
 errorLogger.Warnf(template, args...)
}

func Error(args ...interface{}) {
 errorLogger.Error(args...)
}

func Errorf(template string, args ...interface{}) {
 errorLogger.Errorf(template, args...)
}

func DPanic(args ...interface{}) {
 errorLogger.DPanic(args...)
}

func DPanicf(template string, args ...interface{}) {
 errorLogger.DPanicf(template, args...)
}

func Panic(args ...interface{}) {
 errorLogger.Panic(args...)
}

func Panicf(template string, args ...interface{}) {
 errorLogger.Panicf(template, args...)
}

func Fatal(args ...interface{}) {
 errorLogger.Fatal(args...)
}

func Fatalf(template string, args ...interface{}) {
 errorLogger.Fatalf(template, args...)
}

3.简单封装后使用示例:

package main

import (
 "logger"
)

func main() {
 logger.Infof("simple zap logger example")
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • golang有用的库及工具 之 zap.Logger包的使用指南

    zap.Logger 是go语言中相对日志库中性能最高的.那么如何开始使用? 不多说直接上代码: import ( "encoding/json" "fmt" "log" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) var Logger *zap.Logger func InitLogger() { // 日志地址 "out.log" 自定

  • golang的time包:秒、毫秒、纳秒时间戳输出方式

    菜鸟的时候只知道时间戳有10位.13位.还有好长位数的. 入坑久了才明白 10位数的时间戳是以 秒 为单位: 13位数的时间戳是以 毫秒 为单位: 19位数的时间戳是以 纳秒 为单位: golang中可以这样写: package main import ( "time" "fmt" ) func main() { fmt.Printf("时间戳(秒):%v;\n", time.Now().Unix()) fmt.Printf("时间戳(

  • golang 使用time包获取时间戳与日期格式化操作

    Time包定义的类型 Time: 时间类型, 包含了秒和纳秒以及 Location Month: type Month int 月份. 定义了十二个月的常量 const ( January Month = 1 + iota February March April May June July August September October November December ) Weekday 类型: type Weekday int 周 定义了一周的七天 const ( Sunday Wee

  • golang return省略用法说明

    golang函数如果返回值定义了变量,return后边必须跟着表达式或者值 func main() { fmt.Println("-------", test()) } func test() (n string) { n = "hello" return } 如果没有定义变量,return必须显示地返回对象 func main() { fmt.Println("-------", test()) } func test() string { n

  • golang 输出重定向:fmt Log,子进程Log,第三方库logrus的详解

    独立 fmt Log输出重定向 golang的fmt包的输出函数 Println.Printf.PrintStack等,默认将打印输出到os.Stdout.错误打印输出到os.Stderr,os.Stdout 和 os.Stderr 默认值 /dev/stdout /dev/stderr 设备. //代码摘自:golang封装包 -> /lib/golang/src/os var ( Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin&q

  • 使用Lumberjack+zap进行日志切割归档操作

    使用Lumberjack+zap进行日志切割归档 为了添加日志切割归档功能,我们将使用第三方库Lumberjack来实现. 安装 执行下面的命令安装Lumberjack go get -u github.com/natefinch/lumberjack zap logger中加入Lumberjack 要在zap中加入Lumberjack支持,我们需要修改WriteSyncer代码.我们将按照下面的代码修改getLogWriter()函数: func getLogWriter() zapcore.

  • golang xorm 自定义日志记录器之使用zap实现日志输出、切割日志(最新)

    目录 1.准备并下载好需要的包 2. 连接postgresql数据库 3. zap日志工具 4.实现xorm 自定义日志记录器 5.使用 完整代码 参考文档 1.准备并下载好需要的包 xorm.io/xorm xorm.io/core go.uber.org/zap gopkg.in/natefinch/lumberjack.v2  用于切割zap github.com/lib/pq  本文使用postgresql数据库 2. 连接postgresql数据库 // 创建pg数据库连接 func

  • Linux中logrotate日志轮询操作总结

    前言 对于Linux系统安全来说,日志文件是极其重要的工具.不知为何,我发现很多运维同学的服务器上都运行着一些诸如每天切分Nginx日志之类的CRON脚本,大家似乎遗忘了Logrotate,争相发明自己的轮子,这真是让人沮丧啊!就好比明明身边躺着现成的性感美女,大家却忙着自娱自乐,罪过!logrotate程序是一个日志文件管理工具.用于分割日志文件,删除旧的日志文件,并创建新的日志文件,起到"转储"作用.可以节省磁盘空间. 下面就对logrotate日志轮转操作做一梳理记录: 1)配置

  • Tomcat 日志切割(logrotate)详细介绍

    Tomcat 日志切割 logrotate是个强大的系统软件,它对日志文件有着一套完整的操作模式,譬如:转储.邮件和压缩等,并且默认logrotate加到cron(/etc/cron.daily/logrotate)作为每日任务执行.自动有了logrotate,我想不用再自己写日志切割脚本. 如下对Tomcat日志catalina.out日志切割 # ls -lh /usr/local/tomcat/logs/catalina.out -rw-r--r-- 1 www www 14M Aug 2

  • Crontab+Shell做Nginx日志切割脚本实例代码

    平日里,我们需要把 Nginx 的错误日志输出到文件里,但是时间一长,文件就特别大,之前我服务器上日志就一周没管它,今天一看日志文件都32个G了,大的吓人.于是就写了个日志切割的脚本. 原理 其实日志切割脚本的原理很简单 先将原来的日志文件移动到指定文件夹中 向 Nginx 发送 USR1 信号,让 Nginx 重新加载配置文件 [如果不发送信号的话,nginx 还是会将日志写到你移动的文件里去 #!/bin/bash LOGS_PATH=/home/wwwlogs DATE=$(date +%

  • nginx日志切割shell脚本

    一.脚本思路 第一步就是重命名日志文件,不用担心重命名后nginx找不到日志文件而丢失日志.在你未重新打开原名字的日志文件前,nginx还是会向你重命名的文件写日志,linux是靠文件描述符而不是文件名定位文件. 第二步向nginx主进程发送USR1信号. nginx主进程接到信号后会从配置文件中读取日志文件名称,重新打开日志文件(以配置文件中的日志名称命名),并以工作进程的用户作为日志文件的所有者. 重新打开日志文件后,nginx主进程会关闭重名的日志文件并通知工作进程使用新打开的日志文件.

  • 详解Nginx日志配置及日志切割

    日志配置 日志对于统计排错来说非常有利的.本文总结了nginx日志相关的配置如access_log.log_format.open_log_file_cache.log_not_found.log_subrequest.rewrite_log.error_log. nginx有一个非常灵活的日志记录模式.每个级别的配置可以有各自独立的访问日志.日志格式通过log_format命令来定义. ngx_http_log_module是用来定义请求日志格式的. 1. access_log指令 语法: a

  • Yii框架日志记录Logging操作示例

    本文实例讲述了Yii框架日志记录Logging操作.分享给大家供大家参考,具体如下: 1.Yii::getLogger()->log($message, $level, $category = 'application') 2.Yii::trace($message, $category = 'application'); 3.Yii::error($message, $category = 'application'); 4.Yii::warning($message, $category =

  • Golang logrus 日志包及日志切割的实现

    本文主要介绍 Golang 中最佳日志解决方案,包括常用日志包logrus的基本使用,如何结合file-rotatelogs包实现日志文件的轮转切割两大话题. Golang 关于日志处理有很多包可以使用,标准库提供的 log 包功能比较少,不支持日志级别的精确控制,自定义添加日志字段等.在众多的日志包中,更推荐使用第三方的 logrus 包,完全兼容自带的 log 包.logrus 是目前 Github 上 star 数量最多的日志库,logrus 功能强大,性能高效,而且具有高度灵活性,提供了

  • python3 配置logging日志类的操作

    配置类config_file: from configparser import ConfigParser class config_file: def __init__(self,conf_filePath,encoding="utf-8"): #打开配置文件,实例化ConfigParser类,并以默认utf-8的编码格式读取文件 self.cf = ConfigParser() self.cf.read(conf_filePath,encoding) def get_Int_Val

随机推荐