怎么实时的把日志写进数据库

十一文 发布于 2013/05/07 13:48
阅读 1K+
收藏 3

我的想法是 用shell 调用tail -f 但是不知道怎么调用。。。。谁能给个例子

还有别的好注意的不?



我们是ngnix

 

加载中
0
十一文
十一文

自己解决(目前先这么着,以后再优化性能):

#!/bin/bash
sql_user=root
sql_pass=123456789
db_name=test

sql_opt="-u$sql_user -p$sql_pass -s"

mysql_opt() {
  sql_lan=$1
  echo $sql_lan
  mysql $sql_opt << EOF
    USE $db_name;
    $sql_lan;
    QUIT
EOF
}

read_line()
{
    read
    while [ "$?" -eq  0 ]
    do
        #echo $REPLY   换成你想做的事情
		sql="insert into testlog (log_str) values('$REPLY');"
		mysql_opt "$sql";
        read
    done
}

tail -f '/log/nginx/access.log' | read_line
0
斯诺登
斯诺登

应该先把大日志按时间分隔成小日志,比如1小时一个日志,具体时间间隔,看日志量,然后用程序或脚本读刚分隔出来的日志,这样的好处,一个是避免文件读写问题,你要读的文件已经不再写入。另一个是每个日志文件都不大,读取效率高。

至于nginx怎样按时间分隔日志,这个可以用mv命令,大体思路是通过cron定时执行

mv access.log `date +\%Y\%m\%d\%H\%M\%S`.log

然后平滑重启nginx

注意不要用cp命令,效率比mv低太多

0
十一文
十一文

引用来自“xugang”的答案

应该先把大日志按时间分隔成小日志,比如1小时一个日志,具体时间间隔,看日志量,然后用程序或脚本读刚分隔出来的日志,这样的好处,一个是避免文件读写问题,你要读的文件已经不再写入。另一个是每个日志文件都不大,读取效率高。

至于nginx怎样按时间分隔日志,这个可以用mv命令,大体思路是通过cron定时执行

mv access.log `date +\%Y\%m\%d\%H\%M\%S`.log

然后平滑重启nginx

注意不要用cp命令,效率比mv低太多

你没注意看到 我要求的是实时 至少延迟是秒级别吧
斯诺登
斯诺登
你没注意到我给你的分隔日志的文件名是到秒级的%S,你想办法做到秒级的cron就可以了
0
久欠幸福
久欠幸福
最好不要把日志写入数据库。。。。
0
十一文
十一文

引用来自“久欠幸福”的答案

最好不要把日志写入数据库。。。。

为何 ?


我要做分析没辙,得做用户访问路径等的 分析 

0
i-w
i-w
日志量大了 放数据库就各种麻烦了、、、除非要求不严谨啥的。。。
0
十一文
十一文

引用来自“i-w”的答案

日志量大了 放数据库就各种麻烦了、、、除非要求不严谨啥的。。。
分表 分库就是
0
久欠幸福
久欠幸福

数据库不要存的几种:文件,图片,日志

这些占用空间太大,如果做数据库备份的占用太多的空间,让你的数据库变的越来越慢

0
王瑞平
王瑞平

最好不写日志

最多把FATLE记录一下,太影响性能

0
十一文
十一文
@红薯 大神 你能帮回答哈嘛 上面这些回答╮(╯Д╰)╭
返回顶部
顶部