我的要求是将 subversion 日志(即用户名、修订号......)发送到 logstash 进行解析(然后将其存储在 elastic search 中并最终通过 kibana 显示)。由于 subversion 使用它自己的基于文件的数据库(FSFS)而不是纯文本文件,我有两个选择
- 通过 cron 运行 svn log(间隔 1 分钟),然后将该文件发送到 logstash(非常糟糕的主意)
- 使用了 subversion river 插件,我试过了,但是没有用,因为它根本无法索引数据。而且它的开发在一年前就停止了。所以一点帮助都没有
我也考虑过提交后脚本,每当任何用户签到时它都会触发它,然后将日志存储在文本文件中,但它与第 1 点相同。
任何帮助/想法都非常感谢
编辑正如我在第 3 点中提到的那样,我们编写了这个小的后提交,以便每当用户签入时,我们都可以将元数据保存在某个文件中,然后通过 syslog 将此日志传输到 logstash 服务器。这种方法最大的缺点之一是我正在处理 TB 的数据和每分钟 15 次以上的签入,这个文件变得非常大(我们可以使用 logrotate),但同时面临锁定条件问题(因为多个用户尝试签入并写入同一个文件)这最终会导致竞争条件并使情况变得更糟。将后提交钩子粘贴在下面,以便它可能对其他人有用
#!/bin/sh
REPOS="$1"
REV="$2"
LOG="/tmp/svn.log"
var1=/usr/bin/svnlook info -r $REV $REPOS | tr '\n' '|'`
var2=/usr/bin/svnlook changed -r $REV $REPOS | tr '\n' ' '`
echo "r${REV}|${var1}|${var2}\n" | tee -a ${LOG} 2>&1
echo " " | tee -a ${LOG} 2>&1
答案1
我看到至少有一个方便的选项:1)将 SVN 日志提供给 syslog,现在大多数发行版都使用 rsyslog,因此这里是 rsyslog(5.x)的示例:
$InputFileName /${path_to}/svn.log
$InputFileTag svn:
$InputFileStateFile /var/spool/rsyslog/svn_log
$InputFileSeverity notice
$InputFileFacility local7
$InputRunFileMonitor
:syslogtag, isequal, "svn:" @@${IP_of_logstash}:$PORT
&~
请注意,对于较新版本的 rsyslog,该配置将有所不同。版本 8.x 配置:
#reading SVN logs
input(type="imfile" File="/var/log/${path_to}/svn.log"
Tag="svn:"
StateFile="/var/spool/rsyslog/svn_log"
Severity="normal"
Facility="local7")
:syslogtag, isequal, "svn:" @@${IP_of_logstash}:$PORT
&~
2)配置 logstash syslog 监听器和日志解析器
在这种情况下,日志将不会另外存储在 syslog 中,而是直接转发到 logstash,syslog 传输将处理它。
答案2
一种可能性是配置 Syslog 以接受 subversion 日志并将其发送到 logstash。
有用的链接
http://logstash.net/docs/1.1.9/outputs/syslog
http://linux.die.net/man/5/syslog.conf
http://www.commandlinefu.com/commands/view/11687/send-apache-log-to-syslog-ng