go语言自制日志文件 go日志输出到文件

Go语言os标准库常用方法Getwd/Getenv/Chdir

1. os.Getwd()函数

创新互联建站服务项目包括金昌网站建设、金昌网站制作、金昌网页制作以及金昌网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,金昌网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到金昌省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

原型:func Getwd()(pwd string, err error)

作用:获取当前文件路径

返回:当前文件路径的字符串和一个err信息

示例:

输出:

当前路径: D:ProjectsGomGoLab01

2. os.Getenv()函数

原型:func Getenv(key string) string

作用:获取系统环境变量的值

参数:key - 系统环境变量名

返回:系统环境变量的值

示例:

输出:

环境变量GOPATH的值是: D:/Projects/Go

3. os.Chdir()函数

原型:func Chdir(dir string) error

作用:将当前文件路径改变为目标路径(非真实改变)

参数:dir - 目标路径(即改变之后的路径)

返回:修改成功,返回 nil;修改失败(如:目标路径不存在的情况),返回错误信息。

示例一:

输出:

起始路径: D:ProjectsGomGoLab01

修改后的路径: D:ProjectsGoDemo02

示例二:

输出:

起始路径: D:ProjectsGomGoLab01

error: chdir D:ProjectsGoDemo03: The system cannot find the file specified.

注:文件路径,Window 系统下默认是“”,写在代码中时要用“”或“/”代替。

GO语言商业案例(十六):Curve-

Golang 的创建是为了实现最大的用户效率和编码效率。已经熟悉 Java 或 PHP 的程序员可以在几周内接受 Go 的培训(许多人最终会更喜欢它)。在本文中,Dewet Diener 探讨了 Golang 的优缺点,以及它的测试驱动开发 (TDD) 如何完美契合。

Golang 由 Google 开发和设计,于 2009 年作为一种综合性编程语言首次出现,旨在最大限度地提高编码效率。创建该语言的目的是修正其他已建立语言的缺陷。尽管 Golang(或简称为“Go”)是一门年轻的语言,但已经积累了大量的开发人员,因此我们想分享为什么在 Curve 我们喜欢 Golang,以及我们如何采用它来实现我们移动银行业务的目标到云端。

Go 是一种精致的编程语言:它支持“所见即所得”的原则,这意味着清晰易读的代码和更少的复杂抽象。该语言本身易于使用且易于训练。尽管如此,作为一个相对较新的生态系统,要找到对 Go 具有广泛预先知识的工程师可能会很棘手。

然而,与其他编程语言不同,Go 的创建是为了最大限度地提高用户效率。因此,具有 Java 或 PHP 背景的开发人员和工程师可以在几周内获得使用 Go 的技能和培训——根据我们的经验,他们中的许多人最终更喜欢它。

在 Curve,我们大力提倡测试驱动开发 (TDD),Go 的框架与这种方法保持一致。通过简单地命名一个文件 foo_test.go 并在该文件中添加结构化测试函数,Go 将快速有效地运行您的单元测试。这一创新功能提高了生产力,因为它可以更加专注于测试驱动的开发和改进的同行评审机会。

Golang 具有出色的生产优化品质,例如内存占用小,这支持其在大型项目中作为构建块的能力,以及开箱即用的与其他架构的轻松交叉编译。由于 Go 代码被编译为单个静态二进制文件,因此它可以轻松进行容器化,并且通过扩展,将 Go 部署到任何高可用性环境(例如 Kubernetes)中几乎是微不足道的。

它提供了一种机制来保护工作负载,通过拥有非常纤薄的生产容器而没有任何无关的依赖项。这使得构建、部署和维护基于 Go 的资产更加直接和安全,并为希望建立或发展其微服务战略的公司提供了可靠的选择。

Go 是专门为满足我们快速发展的技术生态系统的需求而创建的。例如,Go 可以满足您构建 API 所需的一切,并将其作为其标准库的一部分。它使用简单,高性能的 http 服务器消除了团队设计新项目时经常发生的一些常见的 探索 和设计瘫痪问题——这对于一些其他流行语言(如 Java 和 Node.js)来说太常见了。

Golang 还通过其内置于语言本身的自动格式化程序巧妙地解决了代码格式化分歧。这完全消除了格式争议,进而提高了团队的生产力和注意力。

尽管我是 Go 的拥护者,但它显然也不是没有缺陷。一个争论不休的特性是 Go 没有显式接口,这是许多开发人员习惯的概念。虽然不是有害的,但它可以使选择最适合您的结构的接口成为一项任务。这是因为您不会像在其他流行的编程语言中那样编写 X 实现 Y,但您很快就会接受。

依赖管理也是另一个不属于 Google Golang 开发团队原始设计的功能。开源社区介入并创建了 Glide 和 Dep,最初的努力并没有完全解决问题。从 Go 1.11 开始,添加了对模块的支持,这似乎已成为官方的依赖管理工具。这些挑战并没有削弱 Go 作为一种高效编程语言的独创性,并且它继续为我们提供优于其他编程语言的显着优势。

Golang 吸引了全球敏锐的开发人员的注意,并且围绕它的兴奋继续增长。开源社区因有趣的项目而蓬勃发展;最著名的是 Docker 和 Kubernetes。

正是这种新鲜、有创意但又简单的包装吸引了我们去Go:它是一种令人兴奋的编码语言,可以帮助我们在 Curve 中快速开发以构建更好的产品。

windows 怎么编译 go语言

1、解压压缩包到go工作目录,如解压到E:\opensource\go\go,解压后的目录结构如下:

E:\opensource\go\go

├─api

├─bin

│ ├─go.exe

│ ├─godoc.exe

│ └─gofmt.exe

├─doc

├─include

├─lib

├─misc

├─pkg

├─src

└─test

2、增加环境变量GOROOT,取值为上面的go工作目录

3、Path环境变量中添加";%GOROOT%\bin",以便能够直接调用go命令来编译go代码,至此go编译环境就配置好了

注:如果不想手动设置系统环境变量,也可下载go启动环境批处理附件,

修改goenv.bat文件中的GOROOT值为上面的go工作目录后直接双击该bat文件,go编译环境变量即设置完成。

4、测试go编译环境,启动一个cmd窗口,直接输入go,看到下面的提示就是搭建成功了

E:\opensource\go\gogo

Go is a tool for managing Go source code.

Usage:

go command [arguments]

The commands are:

build compile packages and dependencies

clean remove object files

doc run godoc on package sources

env print Go environment information

fix run go tool fix on packages

fmt run gofmt on package sources

get download and install packages and dependencies

install compile and install packages and dependencies

list list packages

run compile and run Go program

test test packages

tool run specified go tool

version print Go version

vet run go tool vet on packages

Use "go help [command]" for more information about a command.

Additional help topics:

gopath GOPATH environment variable

packages description of package lists

remote remote import path syntax

testflag description of testing flags

testfunc description of testing functions

Use "go help [topic]" for more information about that topic.

5、编译helloworld测试程序,go语言包中test目录带有helloworld.go测试程序,源码见"附一 helloworld.go",

直接调用"go build helloworld.go"就生成了"helloworld.exe"可执行程序,运行一下这个程序看到了我们期望的hello,wolrd。

E:\opensource\go\go\testgo build helloworld.go

E:\opensource\go\go\testhelloworld.exe

hello, world

E:\opensource\go\go\test

附一 helloworld.go

// cmpout

// Copyright 2009 The Go Authors. All rights reserved.

// Use of this source code is governed by a BSD-style

// license that can be found in the LICENSE file.

// Test that we can do page 1 of the C book.

package main

func main() {

print("hello, world\n")

}

GO语言(十六):模糊测试入门(上)

本教程介绍了 Go 中模糊测试的基础知识。通过模糊测试,随机数据会针对您的测试运行,以尝试找出漏洞或导致崩溃的输入。可以通过模糊测试发现的一些漏洞示例包括 SQL 注入、缓冲区溢出、拒绝服务和跨站点脚本攻击。

在本教程中,您将为一个简单的函数编写一个模糊测试,运行 go 命令,并调试和修复代码中的问题。

首先,为您要编写的代码创建一个文件夹。

1、打开命令提示符并切换到您的主目录。

在 Linux 或 Mac 上:

在 Windows 上:

2、在命令提示符下,为您的代码创建一个名为 fuzz 的目录。

3、创建一个模块来保存您的代码。

运行go mod init命令,为其提供新代码的模块路径。

接下来,您将添加一些简单的代码来反转字符串,稍后我们将对其进行模糊测试。

在此步骤中,您将添加一个函数来反转字符串。

a.使用您的文本编辑器,在 fuzz 目录中创建一个名为 main.go 的文件。

独立程序(与库相反)始终位于 package 中main。

此函数将接受string,使用byte进行循环 ,并在最后返回反转的字符串。

此函数将运行一些Reverse操作,然后将输出打印到命令行。这有助于查看运行中的代码,并可能有助于调试。

e.该main函数使用 fmt 包,因此您需要导入它。

第一行代码应如下所示:

从包含 main.go 的目录中的命令行,运行代码。

可以看到原来的字符串,反转它的结果,然后再反转它的结果,就相当于原来的了。

现在代码正在运行,是时候测试它了。

在这一步中,您将为Reverse函数编写一个基本的单元测试。

a.使用您的文本编辑器,在 fuzz 目录中创建一个名为 reverse_test.go 的文件。

b.将以下代码粘贴到 reverse_test.go 中。

这个简单的测试将断言列出的输入字符串将被正确反转。

使用运行单元测试go test

接下来,您将单元测试更改为模糊测试。

单元测试有局限性,即每个输入都必须由开发人员添加到测试中。模糊测试的一个好处是它可以为您的代码提供输入,并且可以识别您提出的测试用例没有达到的边缘用例。

在本节中,您将单元测试转换为模糊测试,这样您就可以用更少的工作生成更多的输入!

请注意,您可以将单元测试、基准测试和模糊测试保存在同一个 *_test.go 文件中,但对于本示例,您将单元测试转换为模糊测试。

在您的文本编辑器中,将 reverse_test.go 中的单元测试替换为以下模糊测试。

Fuzzing 也有一些限制。在您的单元测试中,您可以预测Reverse函数的预期输出,并验证实际输出是否满足这些预期。

例如,在测试用例Reverse("Hello, world")中,单元测试将返回指定为"dlrow ,olleH".

模糊测试时,您无法预测预期输出,因为您无法控制输入。

但是,Reverse您可以在模糊测试中验证函数的一些属性。在这个模糊测试中检查的两个属性是:

(1)将字符串反转两次保留原始值

(2)反转的字符串将其状态保留为有效的 UTF-8。

注意单元测试和模糊测试之间的语法差异:

(3)确保新包unicode/utf8已导入。

随着单元测试转换为模糊测试,是时候再次运行测试了。

a.在不进行模糊测试的情况下运行模糊测试,以确保种子输入通过。

如果您在该文件中有其他测试,您也可以运行go test -run=FuzzReverse,并且您只想运行模糊测试。

b.运行FuzzReverse模糊测试,查看是否有任何随机生成的字符串输入会导致失败。这是使用go test新标志-fuzz执行的。

模糊测试时发生故障,导致问题的输入被写入将在下次运行的种子语料库文件中go test,即使没有-fuzz标志也是如此。要查看导致失败的输入,请在文本编辑器中打开写入 testdata/fuzz/FuzzReverse 目录的语料库文件。您的种子语料库文件可能包含不同的字符串,但格式相同。

语料库文件的第一行表示编码版本。以下每一行代表构成语料库条目的每种类型的值。由于 fuzz target 只需要 1 个输入,因此版本之后只有 1 个值。

c.运行没有-fuzz标志的go test; 新的失败种子语料库条目将被使用:

由于我们的测试失败,是时候调试了。

ZbxTable——zabbix优秀报表二开

zbxTable是一个开源zabbix报表系统,go语言编写(张思德,zabbix中国社区开源专家),目前版本已更新到1.15版本,支持zabbix5.4版本。

zbxTable部署有两种方式:RPM部署和编译安装,如有特殊需要,可选择编译安装,zbxtable用go语言编写,对系统影响小,推荐用RPM安装。

添加yum源

CentOS 6.x

rpm -Uvh

CentOS 7.X

rpm -Uvh

CentOS 8.X

rpm -Uvh

安装

全新安装直接复制命令即可

yum clean all

yum -y install zbxtable

安装ms-agent

yum -y install ms-agent

配置

数据库初始化

mysql -uroot -ppassword

create database zbxtable character set utf8 collate utf8_bin;

create user zbxtable@localhost identified by ‘zbxtablepwd123’;

这里不讲其他数据库,有兴趣的可以看官网具体配置

系统初始化

配置文件需要初始化才能生成,步骤如下:

cd /usr/local/zbxtable/

./zbxtable init

这时候会进入交互命令行,根据实际情况正确输入数据库库的账号密码,zabbix链接信息,成功后会生成配置文件,否则无法看到配置文件。

配置MS-Agent

MS-Agent作为告警消息采集客户端,采集zabbix产生的告警信息,发送到zbxtable平台中,zbxtable需要在zabbix server配置相应的action。配置如下。

cd /usr/local/zbxtable

./zbxtable install

这时会在zabbix上创建ms-agent用户,密码随机,权限管理员,最后输出MS-Agent token为MS-Agent 与ZbxTable通信的token,需要和MS-Agent 配置文件里的token保持一致,否则无法正常收到告警。 Token可在conf/app.conf文件里找到。

启动服务

systemctl enable --now zbxtable

重启

systemctl restart zbxtable

查看状态

systemctl status zbxtable

必须确保zbxtable服务是active状态,如果异常,查看日志文件:/usr/local/zbxtable/logs/zbxtable.log或者系统日志message

Zbxtable-web配置

zbxtable使用nginx做代理,安装即可

yum -y install nginx

拷贝nginx配置文件

cp /usr/local/zbxtable/nginx.conf /etc/nginx/conf.d/

启动nginx

systemctl start nginx

开机自启动

systemctl enable nginx

zbxtable访问地址:,默认账号密码:admin/Zbxtable。

ELK应用之Filebeat

Filebeat是本地文件的日志数据采集器,可监控日志目录或特定日志文件(tail file),并将它们转发给Elasticsearch或Logstatsh进行索引、kafka等。带有内部模块(auditd,Apache,Nginx,System和MySQL),可通过一个指定命令来简化通用日志格式的收集,解析和可视化。

官方网址:

Filebeat涉及两个组件:查找器prospector和采集器harvester,来读取文件(tail file)并将事件数据发送到指定的输出。

启动Filebeat时,它会启动一个或多个查找器,查看你为日志文件指定的本地路径。对于prospector所在的每个日志文件,prospector启动harvester。每个harvester都会为新内容读取单个日志文件,并将新日志数据发送到libbeat,后者将聚合事件并将聚合数据发送到你为Filebeat配置的输出。

当发送数据到Logstash或Elasticsearch时,Filebeat使用一个反压力敏感(backpressure-sensitive)的协议来解释高负荷的数据量。当Logstash数据处理繁忙时,Filebeat放慢它的读取速度。一旦压力解除,Filebeat将恢复到原来的速度,继续传输数据。

Harvester负责读取单个文件的内容。读取每个文件,并将内容发送到the output,每个文件启动一个harvester, harvester负责打开和关闭文件,这意味着在运行时文件描述符保持打开状态。

如果文件在读取时被删除或重命名,Filebeat将继续读取文件。这有副作用,即在harvester关闭之前,磁盘上的空间被保留。默认情况下,Filebeat将文件保持打开状态,直到达到close_inactive状态

关闭harvester会产生以下结果:

1)如果在harvester仍在读取文件时文件被删除,则关闭文件句柄,释放底层资源。

2)文件的采集只会在scan_frequency过后重新开始。

3)如果在harvester关闭的情况下移动或移除文件,则不会继续处理文件。

要控制收割机何时关闭,请使用close_ *配置选项

Prospector负责管理harvester并找到所有要读取的文件来源。如果输入类型为日志,则查找器将查找路径匹配的所有文件,并为每个文件启动一个harvester。每个prospector都在自己的Go协程中运行。

Filebeat目前支持两种prospector类型:log和stdin。每个prospector类型可以定义多次。日志prospector检查每个文件来查看harvester是否需要启动,是否已经运行,或者该文件是否可以被忽略(请参阅ignore_older)。

只有在harvester关闭后文件的大小发生了变化,才会读取到新行。

注:Filebeat prospector只能读取本地文件,没有功能可以连接到远程主机来读取存储的文件或日志。

配置文件:$FILEBEAT_HOME/filebeat.yml。Filebeat可以一次读取某个文件夹下的所有后缀名为log的文件,也可以读取指定的某一个后缀名为log的文件。

配置文件详解( )

(1)字段解释

paths: 指定要监控的日志,目前按照Go语言的glob函数处理。没有对配置目录做递归处理,比如配置的如果是:

/var/log/* /*.log

则只会去/var/log目录的所有子目录中寻找以".log"结尾的文件,而不会寻找/var/log目录下以".log"结尾的文件。

encoding: 指定被监控的文件的编码类型,使用plain和utf-8都是可以处理中文日志的。

input_type: 指定文件的输入类型log(默认)或者stdin。

exclude_lines: 在输入中排除符合正则表达式列表的那些行。

include_lines: 包含输入中符合正则表达式列表的那些行(默认包含所有行),include_lines执行完毕之后会执行exclude_lines。

exclude_files: 忽略掉符合正则表达式列表的文件(默认为每一个符合paths定义的文件都创建一个harvester)。

fields: 向输出的每一条日志添加额外的信息,比如"level:debug",方便后续对日志进行分组统计。默认情况下,会在输出信息的fields子目录下以指定的新增fields建立子目录,

fields_under_root: 如果该选项设置为true,则新增fields成为顶级目录,而不是将其放在fields目录下。自定义的field会覆盖filebeat默认的field。

ignore_older: 可以指定Filebeat忽略指定时间段以外修改的日志内容,比如2h(两个小时)或者5m(5分钟)。

close_older: 如果一个文件在某个时间段内没有发生过更新,则关闭监控的文件handle。默认1h。

force_close_files: Filebeat会在没有到达close_older之前一直保持文件的handle,如果在这个时间窗内删除文件会有问题,所以可以把force_close_files设置为true,只要filebeat检测到文件名字发生变化,就会关掉这个handle。

scan_frequency: Filebeat以多快的频率去prospector指定的目录下面检测文件更新(比如是否有新增文件),如果设置为0s,则Filebeat会尽可能快地感知更新(占用的CPU会变高)。默认是10s。

document_type: 设定Elasticsearch输出时的document的type字段,也可以用来给日志进行分类。

harvester_buffer_size: 每个harvester监控文件时,使用的buffer的大小。

max_bytes: 日志文件中增加一行算一个日志事件,max_bytes限制在一次日志事件中最多上传的字节数,多出的字节会被丢弃。默认是10MB。

multiline: 适用于日志中每一条日志占据多行的情况,比如各种语言的报错信息调用栈。这个配置的下面包含如下配置:

pattern: 多行日志开始的那一行匹配的pattern

negate: 是否需要对pattern条件转置使用,不翻转设为true,反转设置为false。

match: 匹配pattern后,与前面(before)还是后面(after)的内容合并为一条日志

max_lines: 合并的最多行数(包含匹配pattern的那一行),默认为500行。

timeout: 到了timeout之后,即使没有匹配一个新的pattern(发生一个新的事件),也把已经匹配的日志事件发送出去

tail_files: 如果设置为true,Filebeat从文件尾开始监控文件新增内容,把新增的每一行文件作为一个事件依次发送,而不是从文件开始处重新发送所有内容。

backoff: Filebeat检测到某个文件到了EOF之后,每次等待多久再去检测文件是否有更新,默认为1s。

max_backoff: Filebeat检测到某个文件到了EOF之后,等待检测文件更新的最大时间,默认是10秒。

backoff_factor: 定义到达max_backoff的速度,默认因子是2,到达max_backoff后,变成每次等待max_backoff那么长的时间才backoff一次,直到文件有更新才会重置为backoff。比如: 

如果设置成1,意味着去使能了退避算法,每隔backoff那么长的时间退避一次。

spool_size: spooler的大小,spooler中的事件数量超过这个阈值的时候会清空发送出去(不论是否到达超时时间),默认1MB。

idle_timeout: spooler的超时时间,如果到了超时时间,spooler也会清空发送出去(不论是否到达容量的阈值),默认1s。

registry_file: 记录filebeat处理日志文件的位置的文件

config_dir: 如果要在本配置文件中引入其他位置的配置文件,可以写在这里(需要写完整路径),但是只处理prospector的部分。

publish_async: 是否采用异步发送模式(实验功能)。

具体的一个yml采集配置样例如下:该配置文件是filebeat采集数据的依据,并根据需求添加必要配置,filebeat收集日志后发往logstash,配置如下:

cd FILEBEAT_HOME

nohup ./bin/filebeat -f config/test.conf /FILEBEAT_HOME/logs/filebeat.log

后台启动filebeat,配置对应的参数

启动多个filebeat配置,新建一个目录(conf)存放多个filebeat的配置文件,

#nohup ./bin/filebeat -f conf/* /FILEBEAT_HOME/logs/filebeat.log

注意:一台服务器只能启动一个filebeat进程。

ps -ef |grep filebeat

kill -9 $pid

注意: 非紧急情况下,杀掉进程只能用优雅方式。

A、filebeat运行不成功

问题:配置文件格式有问题,配置文件遵循yml文件格式, 多或少一个空格 都会导致启动问题,可以使用cmd命令窗口到filebeat安装路径下,使用filebeat.exe –c filebeat.yml 查看报错,也可以看filebeat路径下的log文件夹中的filebeat文件

B、 filebeat第一次运行成功无数据

问题:a、路径有问题

b、运行条件设置有问题(例如只采集某个条件下的数据,文件中没有符合条件的数据,这种情况下先注释掉采集条件测试一下)

C、filebeat运行成功第一次运行后有数据,第二次无数据

问题:filebeat读取文件后会生成一个registry文件,注意windows机器中这个文件在手动启动的情况下会在filebeat安装目录下的data文件夹中,服务注册启动的情况下会在C盘下隐藏文件夹C:\ProgramData\filebeat中,删除掉这个就可以了

D、filebeat运行成功有数据,但是新添加数据不读取问题

问题:filebeat传输存在反压机制,在数据量特别大或者传输通道不通的情况下,filebeat会进行反压,暂停发送,等到数据量稳定或者数据传输通道正常的之后才会发送

Filebeat 保存每个文件的状态并经常将状态刷新到磁盘上的注册文件中。该状态用于记住harvester正在读取的最后偏移量,并确保发送所有日志行。如果输出(例如Elasticsearch或Logstash)无法访问,Filebeat会跟踪最后发送的行,并在输出再次可用时继续读取文件。

在Filebeat运行时,每个prospector内存中也会保存文件状态信息,当重新启动Filebeat时,将使用注册文件的数据来重建文件状态,Filebeat将每个harvester在从保存的最后偏移量继续读取。

每个prospector为它找到的每个文件保留一个状态。由于文件可以被重命名或移动,因此文件名和路径不足以识别文件。对于每个文件,Filebeat存储唯一标识符以检测文件是否先前已被采集过。

如果你使用的案例涉及每天创建大量新文件,你可能会发现注册文件增长过大。请参阅注册表文件太大?编辑有关你可以设置以解决此问题的配置选项的详细信息。

Filebeat保证事件至少会被传送到配置的输出一次,并且不会丢失数据。 Filebeat能够实现此行为,因为它将每个事件的传递状态存储在注册文件中。

在输出阻塞或未确认所有事件的情况下,Filebeat将继续尝试发送事件,直到接收端确认已收到。如果Filebeat在发送事件的过程中关闭,它不会等待输出确认所有收到事件。

发送到输出但在Filebeat关闭前未确认的任何事件在重新启动Filebeat时会再次发送。这可以确保每个事件至少发送一次,但最终会将重复事件发送到输出。

也可以通过设置shutdown_timeout选项来配置Filebeat以在关闭之前等待特定时间。

注意:Filebeat的至少一次交付保证包括日志轮换和删除旧文件的限制。如果将日志文件写入磁盘并且写入速度超过Filebeat可以处理的速度,或者在输出不可用时删除了文件,则可能会丢失数据。

在Linux上,Filebeat也可能因inode重用而跳过行。有关inode重用问题的更多详细信息,请参阅filebeat常见问题解答。

Logback日志切割用的是JDK里File#renameTo()方法。如果该方法失败,就再尝试使用复制数据的方式切割日志。查找该方法相关资料得知,只有当源文件和目标目录处于同一个文件系统、同volumn(即windows下的C, D盘)下该方法才会成功,切不会为重命名的后的文件分配新的inode值。也就是说,如果程序里一直保存着该文件的描述符,那么当程序再写日志时,就会向重命名后的文件中写。那么问题来了,filebeat是会一直打开并保存文件描述符的,那么它是怎么得知日志被切割这件事的呢?

如果只用当前文件描述符一路监控到天黑的话,那么当logback把日志重命名后,filebeat仍然会监控重命名后的日志,新创建的日志文件就看不到了。实际上,filebeat是通过close_inactive和scan_frequency两个参数(机制)来应对这种情况的:

(1)close_inactive

该参数指定当被监控的文件多长时间没有变化后就关闭文件句柄(file handle)。官方建议将这个参数设置为一个比文件最大更新间隔大的值。比如文件最长5s更新一次,那就设置成1min。默认值为5min。

(2)scan_frequency

该参数指定Filebeat搜索新文件的频率(时间间隔)。当发现新的文件被创建时, Filebeat会为它再启动一个 harvester 进行监控,默认为10s。

综合以上两个机制,当logback完成日志切割后(即重命名),此时老的harvester仍然在监控重命名后的日志文件,但是由于该文件不会再更新,因此会在close_inactive时间后关闭这个文件的 harvester。当scan_frequency时间过后,Filebeat会发现目录中出现了新文件,于是为该文件启动 harvester 进行监控。这样就保证了切割日志时也能不丢不重的传输数据。(不重是通过为每个日志文件保存offset实现的)


当前名称:go语言自制日志文件 go日志输出到文件
文章转载:http://scyanting.com/article/doccjdo.html