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

log日志发送到远程服务器

前段时间看了一篇io对性能的影响的文章,记不起来在哪里看到的了。

里面对我印象比较深的是,硬盘操作(寻道、read、write)消耗的性能很可观。

这里试着把所有的日志通过内网直接输出到专用的一个日志服务器。这样可以避免在游戏服上记录日志,而且也方便统一管理日志。

在网上查找了一下相关文章,log4j2支持将日志写向远程socket或syslog。

如果用socket,还需要自己来写代码接收,所以决定使用syslog。

而且centos6以后都自带rsyslog(syslog的增强版),配置起来也方便。

以下是相关步骤:

rsyslog日志

1、编辑 /etc/rsyslog.conf

注释掉下两句最前面的#,这两句的作用是打开514端口,使用socket来接收日志。

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

修改完后重启 rsyslog

service rsyslog restart

修改防火墙,对内网开放514端口

2、发愁啊,怎么格式化日志。

看来学艺不精,使用log4j2,竟然不知道如何格式化。

现在把log4j2改为logback ( logback的syslogappender使用udp发送,注意把第一步的tcp改为udp)。

以下需要查看rsyslog如何将日志按天进行分割及按来源分别存储在不同的目录下。

syslog可以使用%msg:F:1%来进行匹配fileds,fields中使用’\t’分隔的字符串,分隔符可以自定义。

比如要使用空格为分隔符即为:%msg:F,32:1%

除了使用分隔符rsyslog还支持正则表达式进行匹配,但匹配相对慢一些。

下面我们来看一个具体路由日志的例子:

$template DynFile,"/var/log/router-log/%msg:F,32:3%/%timegenerated:1:10:date-rfc3339%/%msg:F,32:4%"

:source , !isequal , "localhost" ?DynFile

:source , !isequal , "localhost" ~

以上面的代意思是:

将消息存储在 /var/log/router-log/第二个filed/当前日期(天)/第三个field

这样,我们在定义logback的日志时,使用以下格式:

	<appender name="job" class="ch.qos.logback.classic.net.SyslogAppender">
		<syslogHost>192.168.17.17</syslogHost>
		<port>514</port>
		<suffixPattern>A</suffixPattern>
		<facility>LOCAL7</facility>
		<suffixPattern>%date ${MODULE} job.log [%thread] %logger{0}\(%L\) %p %msg
		</suffixPattern>
	</appender>

<suffixPattern>中的 ${MODULE}指定存储所在的目录,是从环境变量中获取。

job.log是存储日志的具体文件名。

你可能会问第一个field为什么是日期,我试过了%msg:F,32:1%,但无论如何尝试都无法取到第一个field的内容。只好从第二个field开始取。

当一个临时解决方案吧。

 

erlang工具

1、https://github.com/beamspirit/bigwig

erlang蜗牛学习中(五)

非阻塞tcp学习:

参考以下文档:

http://www.trapexit.org/Building_a_Non-blocking_TCP_server_using_OTP_principles

erlang蜗牛学习中(四)

socket,主动模式

被动模式,需要server调用recv时才读取数据。

主动模式,server使用receive来接收消息。

-module(test4).

-export([ttt/0]).

ttt()->
        {ok,Listen}=gen_tcp:listen(8888,[{packet,0},{active,true}]),
        {ok,Socket}=gen_tcp:accept(Listen),
        gen_tcp:close(Listen),
        loop(Socket).

loop(Socket)->
        receive
                {tcp,Socket,Bin} ->
                        io:format("hello tcp,~p~n",[Bin]),
                        loop(Socket);
                {tcp_closed,Socket}->
                        io:format("hello tcp_closed~n")
        end.

erlang蜗牛学习中(三)

test3.erl

理清楚了gen_server和gen_tcp之间的关系。

gen_server仅仅是一个通用模型。如果编写socket,还是需要gen_tcp。

gen_server不仅仅处理c/s,而且module之间也可以使用gen_server来进行交互处理。

 

-module(test3).

-export([ttt/0]).

ttt()->
        start_server().

start_server()->
        {ok,ListenSocket}= gen_tcp:listen(8888,[{packet,0},{active,false}]),
        {ok,Socket}=gen_tcp:accept(ListenSocket),
        {ok,_Bin}=loop(Socket,[]),
        gen_tcp:close(Socket),
        io:format("~p~n",[_Bin]).
loop(Socket,Bs)->
        case gen_tcp:recv(Socket,0) of
                {ok,Packet}->
                        io:format("ok read~p~n",[Packet]),
                        loop(Socket,[Bs,Packet]);
                {error,closed}->
                        io:format("error closed~n"),
                        {ok,Bs};
                {erorr,_Reason}->
                        io:format("error Reason~n"),
                        {ok,Bs}

        end.

erlang蜗牛学习中(二)

test2.erl

-module(test2).

-export([ttt/0]).

ttt()->
inets:start(),
case httpc:request(“http://www.baidu.com”) of
{ok,_Result}->
io:format(“hello ok”);
{error,_Reason}->
io:format(“hello error”)
end.

了解了用case来进行返回值不同的匹配。

erlang蜗牛学习中(一)

test1.erl

-module(test1).

-export([ttt/0]).

ttt()->
inets:start(),
R=httpc:request(“http://www.baidu.com”),
ttt(R).

ttt({ok,_Result})->
io:format(“hello ok”);
ttt({error,_Reason})->
io:format(“hello error”).

http client sample.

erlide报NullPointerException

我开发用的是eclipse4.2安装erlide后,右键失灵,不停报空指针异常。

在eclipse3.8下也报同样的错误。

此时,只需要在eclipse中设置erl/otp的路径即可。

1、如果没有显示设置erl/opt的路径,先创建一个erlang工程,即可显示出来。

2、重启eclipse后,查看erl的runtime是否有选中默认,没有的话,手动选中。

3、创建一个module,测试erlide。

 

并行开发语言

今天了解一下并行开发语言。

目前了解到有

erlang:Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境。

akka:Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。

golang:是google推广的一种并行语言。

 

akka还很新,目前还在不断更新变化中。还没有听过有完成过的项目。

erlang相对来说是很古老的语言了,十多年了。而且在许多成功项目的案例。

golang有google在后面支持说,也不一定很差。

目前目标放在erlang和golang上。两种都了解下,再确定深入学习哪一种。

 

 

阿里开源中间件:druid Dubbo cobar

网站地址:

https://github.com/alibaba/druid/wiki/_pages

druid 阿里巴巴用的数据库连接池,根据作者的测试,比其它类型的数据库池要快上很多。而且自带监控页面,可以方便的分析sql。

Dubbo 是一个

 


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