go语言记log:glog剖析

Golang版本的log4j日志收集工具实现 前言 大家如果使用过 Java 语言进行开发,就应该多少会用到Log4j系列日志组件工具,其格式化的输出方式深受大家喜欢,支持info,debug,error等分类打印,支持控制台、文件、以及利用 Log4j2 还能实现分布式日志收集等,对于后期维护、问题定位,提供了很好的支撑能力。 Golang作为新兴语言,自然还没有像成熟的 Java 这么多的开源工具,但我想在 Golang 中也使... 阅读详情

作者:legendtkl
链接:https://www.jianshu.com/p/1af5b452494f

首发: legendtkl.com
log的一个典型应用场景就是实现log分级,比如线上环境不需要记录DEBUG的log信息。今天介绍一下glog。先看一个glog的简单例子。

//file name: glog.go
package main

import (
    "flag"
    "github.com/golang/glog"
)

func main() {
    flag.Parse()    // 1

    glog.Info("This is a Info log")         // 2
    glog.Warning("This is a Warning log")
    glog.Error("This is a Error log")

    glog.V(1).Infoln("level 1")     // 3
    glog.V(2).Infoln("level 2")

    glog.Flush()    // 4
}

如果你之前没有用过glog,需要使用go get安装一下,你需要像下面这样执行这个go程序。上面标注的几个地方可以先注意一下,等文章读完就理解了。

$ go get
$ go build glog.go
$ ./glog -log_dir="./"

这时候不出意外的话,会在同级目录下生成下面几个类似的log文件。

glog.kltao-mac.kltao.log.ERROR.20160312-173205.22052
glog.kltao-mac.kltao.log.INFO.20160312-173205.22052
glog.kltao-mac.kltao.log.WARNING.20160312-173205.22052

这就是产生的log文件,打开第一个ERROR的log文件,文件内容如下。前面4行是文件响应信息,最后一行就是上面第14行代码记录的log内容。

Log file created at: 2016/03/12 17:32:05
Running on machine: kltao-mac
Binary: Built with gc go1.4.2 for darwin/amd64
Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
E0312 17:32:05.568597   22052 glog.go:15] This is a Error log

这个时候如果你打开另外两个INFO和WARNING的log文件,会发现WARNING日志文件中除了WARNING信息还记录了Error信息(This is a Error log),而INFO日志文件中则记录了所有的log信息(This is a Info/Warning/Error log)。很容易理解,这些log是有等级的(ERROR>WARNING>INFO),高等级的日志内容会同时会被记录到低等级的日志文件中去。那么glog提供了一个等级呢?答案是4个,除了上面提出的3个,还有一个FALTAL。

这时候又有一个问题来了,为什么第3处的日志信息没有记录下来呢?不急,这个时候如下重新执行一下。就可以在新的INFO日志文件中找到了对应的信息了。

./glog -log_dir="./" -v=3

对,就是这个-v参数。再说V之前,先说一下glog的命令行解析,对应代码就是标注的第1处。那么glog有多少种参数呢?

// By default, all log statements write to files in a temporary directory.
// This package provides several flags that modify this behavior.
// As a result, flag.Parse must be called before any logging is done.
//
//  -logtostderr=false
//      Logs are written to standard error instead of to files.
//  -alsologtostderr=false
//      Logs are written to standard error as well as to files.
//  -stderrthreshold=ERROR
//      Log events at or above this severity are logged to standard
//      error as well as to files.
//  -log_dir=""
//      Log files will be written to this directory instead of the
//      default temporary directory.
//
//  Other flags provide aids to debugging.
//
//  -log_backtrace_at=""
//      When set to a file and line number holding a logging statement,
//      such as
//          -log_backtrace_at=gopherflakes.go:234
//      a stack trace will be written to the Info log whenever execution
//      hits that statement. (Unlike with -vmodule, the ".go" must be
//      present.)
//  -v=0
//      Enable V-leveled logging at the specified level.
//  -vmodule=""
//      The syntax of the argument is a comma-separated list of pattern=N,
//      where pattern is a literal file name (minus the ".go" suffix) or
//      "glob" pattern and N is a V level. For instance,
//          -vmodule=gopher*=3
//      sets the V level to 3 in all Go files whose names begin "gopher".

glog.V(1).Infoln("level 1")这行代码表示设置的-v参数大于V()里面的参数才执行后面的Infoln。如果不加-v参数,默认等级为0,所以第三处的代码没有执行。具体实现不妨看一下源码实现,一目了然。

type Verbose bool

func V(level Level) Verbose {
    // This function tries hard to be cheap unless there's work to do.
    // The fast path is two atomic loads and compares.

    // Here is a cheap but safe test to see if V logging is enabled globally.
    if logging.verbosity.get() >= level {
        return Verbose(true)
    }

    // It's off globally but it vmodule may still be set.
    // Here is another cheap but safe test to see if vmodule is enabled.
    if atomic.LoadInt32(&logging.filterLength) > 0 {
        // Now we need a proper lock to use the logging structure. The pcs field
        // is shared so we must lock before accessing it. This is fairly expensive,
        // but if V logging is enabled we're slow anyway.
        logging.mu.Lock()
        defer logging.mu.Unlock()
        if runtime.Callers(2, logging.pcs[:]) == 0 {
            return Verbose(false)
        }
        v, ok := logging.vmap[logging.pcs[0]]
        if !ok {
            v = logging.setV(logging.pcs[0])
        }
        return Verbose(v >= level)
    }
    return Verbose(false)
}

func (v Verbose) Info(args ...interface{}) {
    if v {
        logging.print(infoLog, args...)
    }
}

func (v Verbose) Infoln(args ...interface{}) {
    if v {
        logging.println(infoLog, args...)
    }
}

func (v Verbose) Infof(format string, args ...interface{}) {
    if v {
        logging.printf(infoLog, format, args...)
    }
}

程序中标注的4个地方,除了第4个地方,其他都说了,Flush的作用清空缓冲区,就是把日志写到文件。golog初始化的时候,起了一个Flush的守护进程,然后定期去执行I/O操作,所以退出的时候需要显示清除一下缓冲区。glog启动的初始化代码如下。

func init() {
    ...
    go logging.flushDaemon()
}

上面应该是glog的大部分使用方法了,更详细的信息可以参考github.com/golang/glog。


 

glog的编译,配置,使用 glog是Google推出的轻量级C++ log开源库,使用起来比较简单,自己可以下载源码直接编译,支持Windows和linux 下载编译glog下载路径 https://code.google.com/p/google-glog/ 需要翻墙才能下载,目前项目已经迁移到github https://github.com/google/glog github路径 目前github上面最新过的代 阅读详情

相关推荐

MTGS与3D高斯泼溅:如何用多轨迹数据重建自动驾驶场景(附代码解析)

本文深入解析了MTGS(多轨迹高斯泼溅)技术在自动驾驶场景重建中的工程实践。该方法通过分层场景表示,巧妙融合多轨迹数据,利用3D高斯泼溅技术统一处理静态几何与动态物体,有效解决了复杂环境下的重建难题。文章结合代码,详细阐述了其实现框架、损失函数设计及优化策略,为构建高保真数字孪生场景提供了实用指南。

v5w6x的博客 446

Google 出的C++轻量级日志库_GLog_了解_使用

Google 出的C++轻量级日志库_GLog_了解_使用

qq_44681788的博客 6231

避坑指南:ROS2 Humble摄像头标定常见错误排查(从‘CALIBRATE’按钮不变绿到保存文件找不到)

本文详细解析了ROS2 Humble环境下摄像头标定的常见问题及解决方案,从CALIBRATE按钮不变绿到标定文件保存失败等疑难杂症。提供硬件准备、参数设置、实时诊断到结果验证的全流程指导,特别针对Ubuntu2204系统和usb_cam驱动的兼容性问题给出实用建议,帮助开发者高效完成内参标定。

weixin_29193359的博客 398

谷歌glog日志格式修改

logging.cc glog的日志输出和格式化都在这个文件内,所以可以自行取看这个文件 下面给出具体修改日志格式的方法,这样就可以做出自己喜欢风格的日志格式 glog诟病的一点就是一个线程一个文件,其文件名的命名方式为perfix + 时间 + tid + ext 其中可通过函数控制有perfix和ext perfix(文件前缀): google::SetLogDestination ext(文件扩展名): google::SetLogFilenameExtension 时间和tid想要修改就要去修改代码

DefiniteGoal的博客 5756

秦时明月6.2魔改版_从零到一部署指南_含安卓客户端配置与GM后台直通

本文提供《秦时明月》6.2魔改版从零开始的完整部署指南。详细讲解CentOS服务器环境准备、服务端文件部署与安装、关键端口开放及进程验证。重点涵盖安卓客户端APK的IP修改与重签名方法,并介绍了GM后台工具的访问与使用,助你快速搭建并管理专属游戏服务器。

garlic的博客 311

KUKA机器人编程实战:5分钟搞定组输入与组输出的信号配置(附代码示例)

本文详细介绍了KUKA机器人编程中组输入与组输出的信号配置方法,通过5分钟快速掌握核心技巧。文章包含信号声明语法、典型配置流程及高级应用技巧,并附有代码示例,帮助工程师高效实现机器人与外部设备的通信。

efc123456的博客 851

google glog 简单使用小结

glog 是 google 的一个 c++ 开源日志系统,轻巧灵活,入门简单,而且功能也比较完善。 安装 以下是官方的安装方法,一句命令: ➜  code git clone https://github.com/google/glog.git ➜  code cd glog ➜  glog git:(master) ✗ ./configure && make &&am...

dxmcu的专栏 789

【一文读懂】NTN(非地面网络)技术介绍

NTN,即非地面网络,是指利用卫星、高空平台(如无人机、平流层气球等)等非地面通信基础设施来实现全球通信覆盖的网络。在5G时代,NTN主要基于5G标准,特别是5G NR(New Radio)技术,通过卫星通信扩展地面网络的覆盖范围和服务能力。NTN技术的出现和发展,为全球通信带来了新的可能性和挑战。通过不断的技术创新和标准化推进,NTN有望在未来发挥更加重要的作用,为全球用户提供无处不在的通信服务。随着6G时代的到来,我们有理由相信NTN技术将迎来更加广阔的发展前景。

u011376987的博客 1万+

Glog使用

请先设置环境变量 export LOGPATH=/home/***/Log 下面是glog的一些封装: //MyLog.h#ifndef __MY_LOG_H_ #define __MY_LOG_H_ //GLog #include #include //Glog #define LOG_INFO LOG(INFO) #define LOG_WARN LOG(WARNING) #def

chdyczx的专栏 1546

【实战解析】Ubuntu双网卡冲突:如何解决同一网段下网关无法访问及上网问题

本文深入解析Ubuntu服务器双网卡配置在同一网段时引发的路由冲突问题,导致网关无法ping通及无法上网。通过分析路由表与Metric值原理,提供使用route命令调整优先级及修改Netplan配置文件的实战解决方案,确保主次路由明确,一劳永逸解决网络冲突。

f9g0h的博客 281

别再手动续期SSL证书了!用acme.sh配合阿里云DNS API,实现全自动HTTPS证书管理

本文详细介绍了如何使用acme.sh配合阿里云DNS API实现SSL/TLS证书的全自动管理,彻底解决手动续期带来的风险与不便。通过自动化部署流程,包括环境准备、API集成、多域名证书申请等关键步骤,帮助运维人员构建高效、可靠的HTTPS证书管理体系,显著提升安全性和运维效率。

weixin_29200485的博客 269

Go标准库glog使用详解

golang/glog是 C++ 版本google/glog的 Go 版本实现,基本实现了原生 glog 的日志格式。在 Kuberntes 中,glog 是默认日志库。 glog 的通用功能 glog 将日志级别分为 4 种,分别是: INFO:普通日志; WARNING:告警日志; ERROR:错误日志; FATAL:严重错误日志,打印完日志后程序将会推出(os.Exit()) glog 的使用很简单,可参考下面这个例子: package main import ( "flag...

Aiky哇 2947

深入解析Zynq Ultrascale+ RF Data Converter中的PLL配置与时钟管理

本文深入解析了Zynq Ultrascale+ RF Data Converter中PLL配置与时钟管理的核心原理与实践。文章将RFDC时钟系统比作交响乐团,详细阐述了PLL作为指挥的关键作用,以及系统时钟、Tile时钟、参考时钟与采样时钟的层级关系。重点剖析了PLL配置参数(如VCO频率、分频器设置)的计算方法与稳定性考量,并提供了从IP配置使能顺序到多Tile同步、DRP访问等常见问题的实战避坑指南与调试技巧,帮助工程师构建稳定的射频信号处理基石。

7up55的博客 449

【kubevirt】(virt-launcher Part 1)virt-launcher 入口与外壳层 — 超深度逐行专业分析

Part 1: virt-launcher 入口与外壳层 — 超深度逐行专业分析

zhonglinzhang 514

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++高性能剧本杀拼团平台:微服务架构与智能匹配算法实践

在分布式系统与高并发服务开发领域,微服务架构通过将复杂应用拆分为独立、松耦合的服务,已成为构建可扩展、易维护后端系统的核心范式。其原理在于服务间通过轻量级通信机制(如RPC)协作,每个服务可独立开发、部署与伸缩。这种架构的技术价值在于提升了开发效率、系统容错性和技术选型的灵活性,尤其适用于需要快速迭代和应对流量峰值的互联网应用场景,例如在线社交、电商交易和实时匹配平台。本文聚焦于一个基于C++的剧本杀拼团平台,深入探讨如何利用C++的高性能特性,结合微服务设计思想与智能匹配算法,构建一个能够处理海量并发请求

dflkg8956的专栏 447

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Google glog使用说明

一、glog是什么: Googleglog是一个基于程序级记录日志信息的c++库,编程使用方式与c++的stream操作类似,例: LOG(INFO)<<"Found"<<num<<"cookies"; “LOG”宏为日志输出关键字,“INFO”为严重性程度。 主要支持功能: 1,参数设置,以命令行参数的方式设置标志参数来控制日志记录行为; 2,严重性分级,根据日志严重性分级记录日志; 3,可有条件地记录日志信息; 4,条件中止程...

chenyulancn的专栏 1363

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

glog输出到一个文件_【go语言】一文轻松使用日志记录框架glog

最近在研究一个开源项目的源码,发现底层使用了glog来实现日志管理,跟大家分享一下glog的使用。glog是用来实现日志的分级,提供等级有Info、Warning、Error和Fatal,加上格式化变量的输出,例如Infof、Warningf、Errorf和Fatalf。通过使用glog可以很好的实现日志的管理,用法也比较简单。glog.Info("Prepare to repel boarder...

weixin_32238435的博客 3174

GLog 初始化说明

#include <iostream> #include <glog/logging.h> int main(int argc, char* argv[]) { google::InitGoogleLogging(argv[0]); FLAGS_logtostderr = false; // 是否将日志输出到stderr而非文件。 ...

weixin_30954265的博客 1574

glog 谷歌日志使用

glog谷歌日志使用

weixin_45399468的博客 1487

glog使用教程

glogglog是一个轻量、稳定、开源的日志系统,详细见上一篇文章所述.这里主要介绍glog的使用.

2万+

GoogleLog(GLog)源码分析

        GLog是Google开发的一套日志输出框架。由于其具有功能强大、方便使用等特性,它被众多开源项目使用。本文将通过分析其源码,解析Glog实现的过程。         该框架的源码在https://github.com/google/glog上可以获取到。本文将以目前最新的0.3.3版本源码为范例进行分析。(转载请指明出于breaksoftware的csdn博客)       ...

方亮的专栏 1万+

Glog日志模块

自己原本想写一个关于日志记录的库文件以用于加速项目开发与调试,无意中了解到Google的日志模块Glog,特找来学习一下。Google Logging Libraryglog托管在Github,可以自行下载,适用于多平台的操作系统,是用C++实现的应用程序级别的日志库,可以下载下来直接使用,非常方便。官方使用代码示例#include <glog/logging.h>int main(int argc

对酒当歌,人生几何。譬如朝露,去日苦多 1941

c++下命令行参数解析库gflag及日志库glog

c++下命令行参数解析库gflag及日志库gloggflag是什么,为什么要用gflag?如何使用注意事项glog是什么,为什么要用glog gflag是什么,为什么要用gflag? 当使用c++开发大型程序特别是工具类程序时,肯定希望当程序编译完成后,我们不需要修改程序的代码,仅仅传递不同的命令行就运行程序执行不同的功能,例如Git,我们通过传递git push,git pull 就可以通过git执行不同的操作,通常这样的参数管理库叫命令行参数解析库,而gflag就是google开源的一个通用方便c++命

DargonWain的博客 1012

[glog]_[C/C++]_[使用glog来记录日志]

glog 快速使用教程场景1.大部分程序由函数组成, 每个函数执行一段设计好的逻辑, 但是大部分的时候有可能出现意料之外的值, 这时候就很想知道这种意料以外的值是如何产生的, 这就需要一个函数调用和参数跟踪, 日志正好发挥作用.2.调试多线程程序时某些函数执行顺序可能出现期望之外的顺序,或者需要知道出问题时线程执行的顺序,而Debug程序并不能同时Debug多个线程的函数调用, 而且会影响线程的竞争

小白 7198

带你入门Go:Log日志模块

Go Log模块

bravezhe的专栏 3205
上一篇: python获取jenkins服务里的文件及备份
下一篇: 「CI」为什么要持续集成
琅琊山二当家
博客等级 码龄18年 447粉丝 322原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值