Nebula能够控制日志文件总容量和循环写日志文件吗?

我们现在部署的Nebula环境长时间运行后,graphd和storaged的日志文件有时会非常大,几十GB到上百GB,有占满磁盘的风险。

我们使用的是Nebula V3.0.0社区版,在其手册中没有找到控制日志文件总容量和允许循环写日志文件的配置参数,在最新的V3.6.0版本的手册中也没有此类配置参数。

看社区的帖子,可以通过logrotate软件服务来实现这种控制日志文件总容量的功能。但这个解决方案比较受限,要求系统上必须要有logrotate软件,也比较麻烦。

还是希望Nebula自身能够提供此功能,Python和Java的日志库都是具有此功能的,C++的日志库应该也有此功能,Nebula应该把这个功能用起来并通过配置参数开放出来。

昨天问了 @yee 应该是可以配置的。不过具体配置方式可能得请教下 @yee

新的 k8s operator 也有支持了

@MuYi @yee 要是已经能直接利用 glog 内置的方式,通过配置实现就太好了,到时候补一下文档也(*❦ω❦)

1 个赞

执行 nebula-graphd --help 可以看到如下的输出:

注意上面标红的两个 flag,一个是指定 log 保留时间,过期文件自动清理。一个是指定日志文件的最大限制,超过会自动切成新的日志文件,即根据 size 做 rotate。

两个 flag 可以直接配置到 nebula 的安装目录的 etc 中的三个 conf 文件中:

--max_log_size=1800
--logcleansecs=300
2 个赞

学到啦,太赞了:+1:t2:

我在我的V3.0.0社区版试验了下,没起作用,日志最大1MB,生成的超过1MB的日志文件并没有被清除掉,是不是社区版没有这个功能,还是V3.0.0版本低了,功能实现还有问题:

Nebula配置文件目录:
[root@c79tps6 etc]# cat nebula-storaged.conf
########## basics ##########

Whether to run as a daemon process

–daemonize=true

The file to host the process id

–pid_file=pids/nebula-storaged.pid

Whether to use the configuration obtained from the configuration file

–local_config=true

########## logging ##########

The directory to host logging files

–log_dir=logs

Log level, 0, 1, 2, 3 for INFO, WARNING, ERROR, FATAL respectively

–minloglevel=2
–max_log_size=1
–logcleansecs=30

Verbose log level, 1, 2, 3, 4, the higher of the level, the more verbose of the logging

–v=0

Maximum seconds to buffer the log messages

–logbufsecs=0

Whether to redirect stdout and stderr to separate output files

–redirect_stdout=true

Destination filename of stdout and stderr, which will also reside in log_dir.

–stdout_log_file=storaged-stdout.log
–stderr_log_file=storaged-stderr.log

Copy log messages at or above this level to stderr in addition to logfiles. The numbers of severity levels INFO, WARNING, ERROR, and FATAL are 0, 1, 2, and 3, respectively.

–stderrthreshold=2

Wether logging files’ name contain time stamp.

–timestamp_in_logfile_name=false

Nebula日志文件目录:

[root@c79tps6 storage0]# ll
总用量 1384
drwxr-xr-x 2 root root 53248 8月 16 14:52 rocksdb
-rw-r–r-- 1 root root 1342461 8月 16 14:52 storaged-stderr.log
-rw-r–r-- 1 root root 0 8月 16 14:36 storaged-stdout.log

上面跟社区版/企业版没关系,是 glog 自身的功能,你可以按照我上面说的,去 nebula 的安装目录,执行 bin/nebula-graphd --help 检查对应的上面的两个 flag 的定义是否存在,如果不存在可能是因为 nebula 依赖的 third party 中的 glog 的版本不同。

清理日志的功能是 logcleansecs 这个flag 控制,如果没达到这个flag 设置的时间,即使 rotate 出来的日志也不会清理,要等这些日志过期之后才能自动清理。

不知道你遇到的问题是:日志超过配置的 1M 没有 rotate?还是说 rotate 的日志过期后没有清理?

试验了几种配置参数的组合,发现以下几个规律:
(1)–timestamp_in_logfile_name=false时,没有文件名带时间戳的日志文件,日志文件只有stderr.log,max_log_size控制不了该日志文件的大小增长,因为只有一个日志文件,无法轮转。

(2)–timestamp_in_logfile_name=true时,有文件名带时间戳的日志文件,max_log_size可以控制该类日志文件的大小超过了其值即进行轮转,即新建一个新的日志文件。

(3)在上述两种情况下,超过max_log_size的日志文件存在的时间超过了logcleansecs设置的秒数,都不会被删除。感觉logcleansecs参数的删除过期的轮转文件的功能并没有编码实现。

删除日志文件的功能并不能根据日志文件有多旧,而是要根据一个所有日志文件的总容量,如果总容量超过了设置的最大容量,则删除最旧的日志文件。因此logcleansecs参数的语义并没有存在的必要,应该设置一个total_log_size的参数。

总之对Nebula所用的glog库比较失望,其最吸引我的能够动态更改日志级别的功能也未能用起来,配置参数复杂而别扭,搞到现在才明白一点。比Java世界的slf4j和Python世界的loguru.logger要差太多,google的人也有水平差的。。。

2 个赞

研究了一下 glogs 库,现在 3.x 版本的 nebula 使用的 glogs v0.5 版本确实不支持上面的 logcleansecs 的 flag 来控制自动清理的时间,但是代码中有提供如下的接口按天来清理过期的日志:

google::EnableLogCleaner(int overdue_days);

但是这个接口在现在的 nebula 的 log 配置相关的代码中并没有显式调用,后面可以 PR 增加这个设置。目前如果想完成日志自动清理的任务,可以启动一个 cron job 来自动清理,比如配置 crontab 增加一条:

0 0 */5 * * find /path/to/nebula/logs/dir -type f -iname 'nebula-graphd.*.log.INFO.*' -mtime +5 -delete 

每5天删除修改时间5天以上的 nebula-graphd 的 INFO 日志,不过上面这样清理还是要依赖把 timestamp_in_logfile_name max_log_size 打开。

1 个赞

track via https://github.com/vesoft-inc/nebula/issues/5688

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。