作者存档: 朱坤乾 - 第13页

loganalyzer3.6.5的一个bug

从昨天开始搞loganalyzer,一直无法显示自己mysql中的日志。

日志表是自定义的。

+---------+---------------------+------+-----+-------------------+----------------+
| Field   | Type                | Null | Key | Default           | Extra          |
+---------+---------------------+------+-----+-------------------+----------------+
| logId   | bigint(20) unsigned | NO   | PRI | NULL              | auto_increment | 
| account | char(64)            | NO   |     |                   |                | 
| server  | int(10) unsigned    | NO   |     | 0                 |                | 
| device  | char(64)            | NO   |     |                   |                | 
| error   | blob                | YES  |     | NULL              |                | 
| uID     | int(11)             | YES  |     | 0                 |                | 
| date    | timestamp           | NO   |     | CURRENT_TIMESTAMP |                | 
+---------+---------------------+------+-----+-------------------+----------------+

自己定义datasource,field,view,dbmapping,一切都OK。但就是显示有问题。

如下图所示少了uID那一列的数据。

google了N多资料都无解。

网上也有一个相同现象的帖子,也没有找到原因:http://kb.monitorware.com/reading-custom-mysql-table-t11919.html

一气之外感觉自己debug可能能找到原因。

在classes/logstreamdb.class.php 中

修改readnext方法如下:

 if ( $content['MaxExecutionTime'] > 0 && $scriptruntime > ($content['MaxExecutionTime']-2) )
                        {
                                // This may display a warning message, so the user knows we stopped reading records because of the script timeout.
                                $content['logstream_warning'] = "false";

                                // Run optional Message Parsers now
                                if ( isset($arrProperitesOut[SYSLOG_MESSAGE]) )
                                {
                                        $retParser = $this->_logStreamConfigObj->ProcessMsgParsers($arrProperitesOut[SYSLOG_MESSAGE], $arrProperitesOut);

                                        // Check if we have to skip the message!
                                        if ( $retParser == ERROR_MSG_SKIPMESSAGE )
                                                $ret = $retParser;
                                }

                                // Set uID to the PropertiesOut! //DEBUG -> $this->_currentRecordNum;
                                echo "<br/>";
                                echo $dbmapping[$szTableType];
                                foreach($dbmapping[$szTableType] as $key => $val) {
                                   echo "|".$key."|".$val, '<br>';
                                }
                                foreach($dbmapping[$szTableType]['DBMAPPINGS'] as $key => $val) {
                                   echo "|_|".$key."|".$val, '<br>';
                                }

                                foreach($this->bufferedRecords[$this->_currentRecordNum] as $key => $val) {
                                   echo "|||".$key."|".$val,"<br/>";
                                }

                                echo "SYSLOG_UID:".SYSLOG_UID."<br/>";
                                echo "hello ". $dbmapping[$szTableType]['DBMAPPINGS']['uID']."world";
                                echo "hello ". $this->bufferedRecords[$this->_currentRecordNum]['uid']."world";
                                echo "<br/>";
                                $uID = $arrProperitesOut[SYSLOG_UID] = $this->bufferedRecords[$this->_currentRecordNum][$dbmapping[$szTableType]['DBMAPPINGS'][SYSLOG_UID]];

                                // Increment $_currentRecordNum
                                $this->_currentRecordNum++;
                        }

把debug信息输出后,才发现问题。

uID对应数据中的logId字段,但在this->bufferedRecords中的key全是小写的。你妹的,各个文档上谁也没写要注意这么一个东西。dbmapping直接修改uID改为logid小写后,日志查看bug解决了。

正常的显示:

 

 

syslog接收客户端发送的日志

仅仅是这一个简单的功能,不想再重新再用java重新做。

直接用nginx+php往syslog中写,syslog往mysql中输出,使用log查看工具查看日志。

php中打开syslog输出:

1、编辑php.ini

取消下面一行的注释

error_log = syslog

2、重启nginx+php

3、写php测试一下:

<?php
        openlog('php', LOG_CONS | LOG_NDELAY | LOG_PID, LOG_USER | LOG_PERROR);
        syslog(LOG_INFO, 'hello php');
?>

4、在/var/log/message中可以看到输出:

php[21641]:  hello php
php[21642]:  hello php
php[21643]:  hello php

rsyslog接收日志写入mysql配置

$EscapeControlCharactersOnReceive off

$template TraditionalFormat2,"%msg%\n"
$template TraditionalFormat3,"%syslogtag% %msg%\n"
$template TraditionalFormat4,"%syslogtag% %msg%\n"
$template StdSQLFormat,"insert into bi_action(id,serverId,`date`,`%msg:R,ERE,1,DFLT:\w+ \w+ (\w+)--end%`) values(%msg:R,ERE,1,DFLT:(\w+)--end%,%msg:R,ERE,1,DFLT:\w+ (\w+) \w+--end%,%$year%%$month%%$day%,1) on duplicate key update `%msg:R,ERE,1,DFLT:\w+ \w+ (\w+)--end%`=`%msg:R,ERE,1,DFLT:\w+ \w+ (\w+)--end%`+1  ",SQL



        if re_match($syslogtag,'^moon[0-9]+-[a-zA-Z_]+.log$') then {
                $ActionFileDefaultTemplate TraditionalFormat2
                $template DynFile2,"/opt/logs/router-log/%syslogtag:R,ERE,1,DFLT:(.*)-.*.log--end%/%timegenerated:1:10:date-rfc3339%/%syslogtag:R,ERE,1,DFLT:.*-(.*).log--end%.log"
                *.* -?DynFile2
                $ModLoad ommysql
                *.* :ommysql:127.0.0.1,Syslog,root,
                stop
        } else if re_match($syslogtag,'^moon[0-9]+$') then {
                        $ActionFileDefaultTemplate TraditionalFormat3
                        $template DynFile3,"/opt/logs/router-log/moon-alert.log"
                        *.* -?DynFile3
                        stop
        } else if re_match($syslogtag,'^moon[0-9]+\\-BI$') then {
                        $ActionFileDefaultTemplate TraditionalFormat4
                        $template DynFile4,"/opt/logs/router-log/moon-BI.log"
                        *.* -?DynFile4
                        *.*     >127.0.0.1,Syslog,root,;StdSQLFormat

                        stop
        }

java visualvm jstatd启动时遇到的一个错误

今天启动jstatd时一直报下面的错误:

root@cvs jstatd]# jstatd -J-Djava.security.policy=/opt/joycube/jstatd/tools.policy
Could not contact registry
Connection refused to host: 192.168.17.12; nested exception is:
        java.net.ConnectException: Connection timed out
java.rmi.ConnectException: Connection refused to host: 192.168.17.12; nested exception is:
        java.net.ConnectException: Connection timed out
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
        at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:341)
        at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
        at java.rmi.Naming.rebind(Naming.java:177)
        at sun.tools.jstatd.Jstatd.bind(Jstatd.java:57)
        at sun.tools.jstatd.Jstatd.bind(Jstatd.java:66)
        at sun.tools.jstatd.Jstatd.main(Jstatd.java:143)
Caused by: java.net.ConnectException: Connection timed out
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:579)
        at java.net.Socket.connect(Socket.java:528)
        at java.net.Socket.<init>(Socket.java:425)
        at java.net.Socket.<init>(Socket.java:208)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
        ... 8 more

上面提示的ip很奇怪。这台机器的ip应该是10.234.10.12

运行hostname -i,显示为192.168.17.12

这是错误的IP,打开 /etc/hosts,发现里面配置了本机名cvs解析为192.158.17.12,这台机器以前换过ip,修改为10.234.10.12。

ok,jstatd可以正常运行了。

mingw遇到的一个问题

自己的写一小段代码:

#include <stdio.h>
#include <string.h>
#include <lua.h>

int main(int argc,char* argv[]){
        lua_State* L=luaL_newstate();
        char tmp[1024];
        while(!feof(stdin)){
                fgets(tmp,sizeof(tmp),stdin);
                printf("%4lu %s\n",strlen(tmp),tmp);
        }
        return 0;
}

在win7 64位,mingw下编译总是报警告:

format '%lu' expects argument of type 'long unsigned int', but argument 2 has type 'size_t' [-Wformat=]    test3.c    /test7/src    line 18    C/C++ Problem

google了一下,试了各种方法,也无结果。
突然灵感一来,想起来mingw是32位系统,难道是因为这个原因,下载mingw64试下。

安装mingw64:http://sourceforge.net/projects/mingwbuilds/

 

ryzomcore 开源游戏代码

https://bitbucket.org/ryzom/ryzomcore

 

开始进行服务器调优,记录一下过程

开始进行服务器调优,记录一下过程,以便以后参考

1、服务器512M内存。mysql本地,日志rsyslog输出至远程。

2、直接往服务器发送10000个注册用户的请求,单socket,发送用了80毫秒,服务器处理完消耗89秒。

2.1) 关闭log后只需要27秒。但因为平时要使用log进行记录,不应该关闭log

2.2) 使用@Async标签,将db操作设置为异步,在dao上设置的@Async,未生效,处理时间还是一样长。

2.2) 1万个帐号注册只需要1分半,已经可以接受了。

3、测试1万帐号同时登陆。

3.1)需要同时开启10000个runnable,先试下同时开10000个socket的速度

3.2) 同时开始10000个socket,感觉速度还可以接受。

3.3)直接无限向服务器发送包,直接达到积累至几百万的消息包,先暂停优化。

3.3.1) 关闭log后,处理速度提升了两个数量级,发ping包,可以一次处理几十万也不会产生积累。但我写的机器人却卡死了,出现: GC overhead limit exceeded。jdk中自带的jvisualvm是个好东西。查找一下是哪里导致的挂掉。

3.4) 10000帐号同时并发登陆,好吧,直接卡死了。明天来解决。

3.5) 慢,非常慢。很耗时。

3.6) 猜测是否因为db读取慢的原因。测试db读取随机1万帐号只需要16秒。不是db读取的问题。

3.7) 打开日志,查看日志,发现一个现象:log处理中出现5秒的空白间隔,没有处理任何消息,经常出现。

3.8) 查找代码:

((InetSocketAddress) context.channel().remoteAddress()).getHostName();

问题出现在这里了,这里是阻塞方法,会去通过dns反查hostname。

修改为如下:

((InetSocketAddress) context.channel().remoteAddress()).getAddress().getHostAddress();

现在1万帐号登陆消耗38秒。

3.9 )  关闭日志后,1万帐号登陆只消耗11秒,已经可以接受了,上面测试的1万db读取需要16秒,这里更快是因为服务器是8线程同时处理登陆。

3.10) 关闭日志后,单socket发送1万帐号注册,处理完成31秒。这里有改进余地。暂时已经可以了。

3.11) 关闭日志后,多线程socket发送1万帐号注册,处理完成30秒。看这里主要是db io在消耗性能。

Ooyala分享的一篇技术文章 

http://www.jdon.com/45871

技术stack如下:
• Spray – high performance HTTP
• SLF4J / Logback
• Yammer Metrics
• spray-json
• Akka 2.x
• Scala 2.9 / 2.10

Android Asynchronous Http Client

loopj : http://loopj.com/android-async-http/

Android Asynchronous Http Client

scala工程创建

akka和scala学习。

都推荐使用sbt来进行管理。

sbt是一个类似maven的scala工具。

在项目目录下创建文件: build.sbt

至少要包含以下内容:

name := "hello"

version := "1.0"

scalaVersion := "2.10.3"

运行sbt,会自动在该目录下创建project文件夹:

在project文件夹下创建文件: plugins.sbt

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.4.0")

重新运行sbt.

输入:eclipse

会自动将项目转为eclipse项目。

可以使用eclipse中的import功能导入项目,并且项目目录已经自动创建好了。

如果要改为akka项目,在build.sbt中添加以下两行:

resolvers += "Typesafe Repository" at "http://search.maven.org/"

libraryDependencies += "com.typesafe.akka" % "akka-actor_2.10" % "2.3.0"

Warning: Use of undefined constant XML - assumed 'XML' (this will throw an Error in a future version of PHP) in /opt/wordpress/wp-content/plugins/wp-syntaxhighlighter/wp-syntaxhighlighter.php on line 1048