go语言实时监控目录变化 go语言目录结构

4.1 Go语言中包(Packages)基础知识

先看一下目录结构,注银伍意这里的src名称是必须的,go在设置了GOPATH后,默认会添加src去寻找package,暂未查询是否有方法不按照src查询

创新互联建站是一家专业提供南阳企业网站建设,专注与成都网站设计、做网站H5开发、小程序制作等业务。10年已为南阳众多企业、政府机构等服务。创新互联专业网站设计公司优惠进行中。

根据上面的描述,Go语言中通过包中函数的名称来区分公共函数和私有函数,我们在main函数中是无法调用myPrivateFunc的

此时如果执行通过go run方式执行,会看到如下的提示信息,这与大部分语言对于包管理方式相关,所以我们通过两种不同的方法来让代码执行起来

返回如下,这里面对我们后续御搏培执行有影响的两个参数GO111MODULE和GOPATH

如果要使用gopath模式引用包,则需要关闭mod模式

设置GOPATH为当前路径,即main.go所在的路径

此时再查看go env时,GOPATH已经发生改变

我们再次尝试执镇唯行代码

可以看到public函数被调用

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实现的)

用FileSystemWatcher对象监控C#目录改变

许多情况下 如果创建或修改一个文件 系统需要执行某些任务 例如 在一个数据库中插入平面文件的重要系统就是如此

在这种情况下 程序必须监控目录中新建立的文件 如果目录中新建了一个文件 程序必须提取这个文件 进行解析 再把它插入到数据库中

许多时候 这类功能要通过 调查 目录并列举上次调查后任何新建的文件来完成 在 NET Framework中 微软为开发者提供另一种连续调查一个目录中的新建文件的方法——FileSystemWatcher对象

FileSystemWatcher对象为你完成目录监控工作 如果新建 更新或删除一个文件 FileSystemWatcher将提交一个事件 通知你发生了一项改变 这样 新建一个文件后 你的程序立即就知道可以使用这个文件 立即通知改变使得你的系统以更高的效率工作 因为你不能总是 调查 目录中发生的改变 而且在两次目录扫描之间也不会有时间流失

FileSystemWatcher基础

在应用FileSystemWatcher对象之前 你必须了解这个对象的一些基本属性和事件 毫无疑问 这个对象的最重要的属性为 EnableRaisingEvents 属性

这个属性决定对象在收到改变通知时是否提交事件 如果EnableRaisingEvents属性设为假 对象将不会提交改变事件 如果设为真 它将提交改变事件 下面是你在应用FileSystemWatcher对象时将要用到的其它一些重要属性/事件

属性

Path——这个属性告诉FileSystemWatcher它需要监控哪条路径 例如 如果我们将这个属性设为 C:Temp 对象就监控那个目录发生的所有改变 IncludeSubDirectories——这个属性说明FileSystemWatcher对象是否应该监控子目录中发生的改变 Filter——这个属性允许你过滤掉某些类型的文件发生的变化 例如 如果我们只希望在TXT文件被修改/新建/删除时提交通知 可以将这个属性设为 *txt 在处理高流量或大型目录时 使用这个属性非常方便

事件

Changed——当被监控的目录中有一个文件被修改时 就提交这个事件 值得注意的是 这个事件可能会被提交多次 即使文件的内容仅仅发生一项改变 这是由于在保存文件时 文件的其它属性也发生了改变 Created——当被监控的目录新建一个文件时 就提交这个事件 如果你计划用这个事件移动新建的事件 你必须在事件处理器中写入一些错误处理代码 它能处理当前文件被其它进程使用的情况 之所以要这样做 是因为Created事件可能在建立文件的进程释放文件之前就被提交 如果你没有准备正确处理这种情况的代码 就可能出现异常 Deleted——当被监控的目录中有一个文件被删除 就提交这个事件 Renamed——当被监控的目晌嫌闷录中有一个文件被重命名 就提交这宴弯个事件

注 如果你没有将EnableRaisingEvents设为真 系统不会提交任何一个事件 如果有时FileSystemWatcher对象似乎无法工作 请首先检查EnableRaisingEvents 确保它被设为真

事件处理

当FileSystemWatcher调用一个事件处理器时 它包含两个自变量——一个叫做 sender 的对象和一个叫做 e 的FileSystemEventArgs对象 我们感兴趣的自变量为FileSystemEventArgs自变量 这个对象中包含有提交事件的原因 以下是FileSystemEventArgs对象的一些属性

属性

Name——这个属性中使事件被提交的文件的名称 其中并不包含文件的路径——只包含使用事件被提交的文件或目录名称 ChangeType——这是一个WatcherChangeTypes 它指出要提交哪个类型的事件 其有效值包括 ○ Changed○ Created○ Deleted○ Renamed FullPath——这个属性中包含使事件被提交的文件的完整路径 包括文件名和目者肢录名

代码实例

列表A列出了FileSystemWatcher对象的一个简单应用实例 在这个例子中 我们监控 C:Temp 目录中是否建立了* TXT文件 这可能是FileSystemWatcher的最简单用法

列表A

publicvoid CreateWatcher()

{

//Create a new FileSystemWatcher

FileSystemWatcher watcher = newFileSystemWatcher();

//Set the filter to only catch TXT files

watcher Filter = * txt ;

//Subscribe to the Created event

watcher Created += new

FileSystemEventHandler(watcher_FileCreated);

//Set the path to C:Temp

watcher Path = @ C:Temp ;

//Enable the FileSystemWatcher events

watcher EnableRaisingEvents = true;

}

void watcher_FileCreated(object sender FileSystemEventArgs e)

{

//A new TXT file has been created in C:Temp

Console WriteLine( A new * txt file has been created! );

}

这篇文章下载版本的样本项目中还提供了另外一些实例

应用

最初 FileSystemWatcher的用途可能并不明显 当然 如果一个文件或目录发生改变 它会向我们发出警报 但在哪些情况下我们需要这类信息呢?

如果一个系统允许客户端上传文件进行处理 这时可能就要用到FileSystemWatcher对象 尽管很明显我们已经进入Web服务和SOA时代 但许多系统仍然要将平面文件插入到某些位置 不管是FTP服务器或网络共享文件夹中 我已经将FileSystemWatcher对象应用到这种类型的系统中 虽然并不是完全没有出错 但它在 调查 目录变化方面确实有一定的优势

如果你想让两个文件保持同步 这时也可以用到FileSystemWatcher对象 你可以用FileSystemWatcher同时监控这两个文件的位置 如果其中一个出现更新 就提交一个Changed事件 然后你就可以将这些改变复制到其它系统/文件中

lishixinzhi/Article/program/net/201311/13620

服务器用什么监控软件好?

曾经做过几次大规模服务器监控,下面推荐几款监控软件和辅助软件。

1.zabbix一款老牌经典的监控软件。是一个企业级的分布式开搭哗源监控方案。能够实时监控从成千上万台服务器、虚拟机和网络设备中收集到的数以百万计的指标。?

提供图形操作界面,可以方便的添加监控指标、告警指标。支持邮件、微信等的告警通知。

2.Prometheus,近些年监控方中旁面的当红炸子鸡?,Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB)。Prometheus使用Go语言开发,是GoogleBorgMon监控系统的开源版本。

其优点是轻量级,配置简易,上手简单,丰富的告警模板。

以上是两款监控软件,下面推荐几款监控辅助软件。

1.grafana监控展示界面,在我们获取到监控数据后,可能需要把数据展示出来,给领导们邀功。grafana就是这样一款软件,开源免费,模板丰富。可直接对接zabbixprometheus和mysql数据库等。

2.钉钉机器人。服务器出现告警怎么办,当然是发消息通知运维人员啊。钉钉机器人就提供这么一个功能。在钉钉群里面直接创建机器人,会给我们一个restfull的接口,我们就可知培行以直接发送post请求。原生linux就直接用curl发送,Prometheus提供插件可以直接对接。


分享标题:go语言实时监控目录变化 go语言目录结构
本文来源:http://abwzjs.com/article/ddpcdid.html