分类 Linux 下的文章

【转载】五种开源协议的比较(BSD,Apache,GPL,LGPL,MIT)

当Adobe、Microsoft、Sun等一系列巨头开始表现出对”开源”的青睐时,”开源”的时代即将到来!

最初来自:sinoprise.com/read.php?tid-662-page-e-fpage-1.html(遗憾的是这个链接已经打不开了),我基本未改动,只是进行了一些排版和整理。

参考文献:http://www.fsf.org/licensing/licenses/

现今存在的开源协议很多,而经过Open Source Initiative组织通过批准的开源协议目前有58种(http://www.opensource.org/licenses/alphabetical)。我们在常见的开源协议如BSD, GPL, LGPL,MIT等都是OSI批准的协议。如果要开源自己的代码,最好也是选择这些被批准的开源协议。

这里我们来看四种最常用的开源协议及它们的适用范围,供那些准备开源或者使用开源产品的开发人员/厂家参考。

BSD开源协议(original BSD licenseFreeBSD licenseOriginal BSD license

BSD开源协议是一个给于使用者很大自由的协议。基本上使用者可以”为所欲为”,可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。

但”为所欲为”的前提当你发布使用了BSD协议的代码,或则以BSD协议代码为基础做二次开发自己的产品时,需要满足三个条件:

  1. 如果再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议。
  2. 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的BSD协议。
  3. 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。

BSD 代码鼓励代码共享,但需要尊重代码作者的著作权。BSD由于允许使用者修改和重新发布代码,也允许使用或在BSD代码上开发商业软件发布和销售,因此是对 商业集成很友好的协议。而很多的公司企业在选用开源产品的时候都首选BSD协议,因为可以完全控制这些第三方的代码,在必要的时候可以修改或者二次开发。

Apache Licence 2.0(Apache License, Version 2.0Apache License, Version 1.1Apache License, Version 1.0

Apache Licence是著名的非盈利开源组织Apache采用的协议。该协议和BSD类似,同样鼓励代码共享和尊重原作者的著作权,同样允许代码修改,再发布(作为开源或商业软件)。需要满足的条件也和BSD类似:

  1. 需要给代码的用户一份Apache Licence
  2. 如果你修改了代码,需要再被修改的文件中说明。
  3. 在延伸的代码中(修改和有源代码衍生的代码中)需要带有原来代码中的协议,商标,专利声明和其他原来作者规定需要包含的说明。
  4. 如果再发布的产品中包含一个Notice文件,则在Notice文件中需要带有Apache Licence。你可以在Notice中增加自己的许可,但不可以表现为对Apache Licence构成更改。

Apache Licence也是对商业应用友好的许可。使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。

GPL(GNU General Public License

我们很熟悉的Linux就是采用了GPL。GPL协议和BSD, Apache Licence等鼓励代码重用的许可很不一样。GPL的出发点是代码的开源/免费使用和引用/修改/衍生代码的开源/免费使用,但不允许修改后和衍生的代 码做为闭源的商业软件发布和销售。这也就是为什么我们能用免费的各种linux,包括商业公司的linux和linux上各种各样的由个人,组织,以及商 业软件公司开发的免费软件了。

GPL协议的主要内容是只要在一个软件中使用(”使用”指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品必须也采用GPL协议,既必须也是开源和免费。这就是所谓的”传染性”。GPL协议的产品作为一个单独的产品使用没有任何问题,还可以享受免费的优势。

由于GPL严格要求使用了GPL类库的软件产品必须使用GPL协议,对于使用GPL协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。

其它细节如再发布的时候需要伴随GPL协议等和BSD/Apache等类似。

LGPL(GNU Lesser General Public License

LGPL是GPL的一个为主要为类库使用设计的开源协议。和GPL要求任何使用/修改/衍生之GPL类库的的软件必须采用GPL协议不同。LGPL 允许商业软件通过类库引用(link)方式使用LGPL类库而不需要开源商业软件的代码。这使得采用LGPL协议的开源代码可以被商业软件作为类库引用并 发布和销售。

但是如果修改LGPL协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用LGPL协议。因此LGPL协议的开源 代码很适合作为第三方类库被商业软件引用,但不适合希望以LGPL协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

GPL/LGPL都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品

MIT(MIT

MIT是和BSD一样宽范的许可协议,作者只想保留版权,而无任何其他了限制.也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的.

启用MemCached的SASL认证

memcached从1.4.3版本开始,能支持SASL认证

比较适合多个应用共用一个memcached集群

需要在编译时,加上--enable-sasl选项

启动memcached时,增加-S的选项

./configure --prefix=%{datadir}  --enable-sasl

/usr/local/bin/memcached -S -d -u nobody

SASL认证也可以有很多种认证机制,比如pam,shadow,ldap等

 

下面配置成使用shadow方式去认证

#修改/etc/sysconfig/saslauthd文件

MECH=shadow

#设置用户的SASL认证密码

saslpasswd2 -c -a memcached memuser

#最终生成的DB文件在/etc/下

-rw-r----- 1 root root 12288 Mar  6 11:52 /etc/sasldb2

#可以查看当前的SASL用户

sasldblistusers2

 

下面配置成通过pam-mysql使用mysql数据库的方式去认证

#首先安装pam-mysql

wget "http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz"

./configure --with-mysql=/opt/apps_install/mysql-5.5.17

make & make install

#增加一个软链接

ln -s /lib/security/pam_mysql.so /lib64/security/pam_mysql.so

#修改saslauthd配置

MECH=pam

#编辑pam.d的memcached配置

auth sufficient pam_mysql.so  user=sasl passwd=saslpwd host=xxx db=dbname table=t_app_info usercolumn=appid passwdcolumn=secret crypt=0 sqllog=1 verbose=1

account required pam_mysql.so user=sasl passwd=saslpwd host=xxx db=dbname table=t_app_info usercolumn=appid passwdcolumn=secret crypt=0 sqllog=1 verbose=1

#新增加memcached的配置文件/etc/sasl2/memcached.conf

pwcheck_method: saslauthd

#重启saslauthd

/etc/init.d/saslauthd restart

#测试saslauthd认证已经成功

/usr/sbin/testsaslauthd -s /etc/pam.d/memcached -u 10000 -p pwd

0: OK "Success."

 

memcached的java client,如spymemcached和xmemcached都已经支持SASL认证了

#xmemcached认证示例

MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("10.x.xx.xx:11211"));

builder.addAuthInfo(AddrUtil.getOneAddress("10.x.xx.xx:11211"), AuthInfo.plain("10000", "pwd"));

builder.setCommandFactory(new BinaryCommandFactory());

client=builder.build();

String v = client.get("test2");

python版本的pylibmc也支持SASL认证

time_wait过多的优化

对于处理并发量较高的Server,统计会发现本机tcp的time_wait状态的连接非常多

netstat -nat | awk '{++S[$NF]} END {for(a in S) print a, S[a]}'

TIME_WAIT 24413

established) 1

SYN_SENT 1

FIN_WAIT1 1

State 1

ESTABLISHED 15

LAST_ACK 1

LISTEN 7

该time_wait的默认值为2*MSL,MSL即max segment lifetime,是一个tcp包的最大生存时间

MSL值在Linux上好像默认是30秒,所以从time_wait状态变化到CLOSED大约需要60s时间

另外一方面,本机可用的发起连接的socket端口是有限的,可通过以下命令查看

cat /proc/sys/net/ipv4/ip_local_port_range

32768   61000

也即大约只有2万多个端口可用,如果处于 time_wait状态的连接很多

很有可能会影响本机向外发起的连接(比如说nginx的proxy服务器),出现端口不够用的情况

可以通过以下参数去减少time_wait的连接

vi /etc/sysctl.conf

#开启time_wait状态的socket重用

net.ipv4.tcp_tw_reuse = 1

#开启time_wait状态的socket快速回收

net.ipv4.tcp_tw_recycle = 1

/sbin/sysctl -p

或者直接修改time_wait的等待时间

echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout

更多的Linux内核优化可参见

http://performancewiki.com/linux-tuning.html

GlusterFS性能优化

运维的同学前端时间搭建了一个4台Server的GlusterFS集群

按照其默认的配置,没有使用replicate,读性能还是不错的,每秒大概100M

但写性能相当比较糟糕,每秒大概只有5M左右,几乎比NFS慢了一个数量级

GlusterFS的官方文档比较恶心,在其首页没有具体配置文档的链接,费了好大劲才找到

其Translators的说明文档,见这里,可以参考下

使用一些Translators进行优化后,写性能有了不少的提升,基本能达到25M-30M每秒,这个速度还是基本可以接受的

优化后,读的性能有了一定的下降,不过下降不太明显,每秒在70M-100M之间,也还是可以的

在Client端和Server端都是需要做一些优化的,主要是增加io-cache,write-behind,quick-read,io-threads这些选项

其中对性能提高最大的应该是write-behind,它相当于是个异步写

 

我们利用cluster/replicate和cluster/distribute就可以搭建一个分布式,高可用,可扩展的存储系统

server端的部分配置如下:

volume posix

type storage/posix 

option directory /data-b

end-volume

 

volume locks

type features/locks

subvolumes posix

end-volume

 

volume brick

type performance/io-threads

option thread-count 8 # default is 16

subvolumes locks

end-volume

 

volume server

type protocol/server

option transport-type tcp

subvolumes brick

option auth.addr.brick.allow *

end-volume

client的部分配置如下

volume client1

type protocol/client

option transport-type tcp

option remote-host 10.0.0.1

option remote-subvolume brick # name of the remote volume

end-volume

 

......

 

volume replicate1

    type cluster/replicate

    subvolumes client1 client2

end-volume

 

volume distribute

type cluster/distribute

subvolumes replicate1 replicate2

end-volume

 

volume iocache

  type performance/io-cache

  option cache-size 1024MB        # default is 32MB

  option cache-timeout 1                 # default is 1 second

  subvolumes distribute 

end-volume

 

volume readahead

  type performance/read-ahead

  option page-count 16 # cache per file = (page-count x page-size)

  subvolumes iocache

end-volume

 

volume writebehind

  type performance/write-behind

  option cache-size 512MB     # default is equal to aggregate-size

  option flush-behind on      # default is 'off'

  subvolumes readahead

end-volume

 

volume quickread

  type performance/quick-read

  option cache-timeout 1         # default 1 second

  option max-file-size 256KB        # default 64Kb

  subvolumes writebehind

end-volume

 

volume iothreads

  type performance/io-threads

  option thread-count 8 # default is 16

  subvolumes quickread

end-volume

Flume中的Decorator

Flume中提供了不少Decorator,用来在log发送到sink之前,做一定的预处理

以下2个是比较有用的,可以用来对日志打上tag,然后进行相应的分类

value("attr","value"{,escape=true|false}),可以在日志上加一个新的属性,相当于是打tag

split("regex",idx,"attr"),可以对日志进行split,取某个字段,然后设置到attr的tag上

设置了这些Tag后,就可以在collector上使用了,如:

#首先将日志对应的小时,设置在了hour属性上

exec config nginx_access_79_108 nginx_access "tail(\"/opt/logs/nginx/nginx_access.log\")" 'split(":",1,"hour") autoDFOChain'

#在 collector上根据hour属性,将日志记录到不同的文件中

exec config collector_150_111_nginx_access nginx_access autoCollectorSource  'roll(36600000){escapedFormatDfs("file:///opt/logs/nginx/%Y%m%d/","access_%{hour}_%{rolltag}.log","syslog")}'

因此,通过Tag这个机制,是可以实现一个Agent上多Source源的日志,在collector上输出到不同的目录,不同的文件中

这种实现方式,是不需要使用automatic flow isolation模式的

使用Flume收集管理系统日志

SWE中会产生各种各样的日志(Nginx日志,AppMaster日志,Proxy日志,DB日志,MemCache日志,App日志等)

这些日志,将来可能会统一集中到Hadoop上去运算处理

按照以前的做法,是通过各种脚本或者Syslog去处理,会有单点的问题,而且不宜统一管理

现有的开源日志系统,如Flume,Scribe,Chukwa等基本都类同

由于我们的Hadoop使用的就是Cloudera的版本,因此就首先拿Flume做了测试

Flume本身的安装非常简单,但配置却比较麻烦,主要参考它的官方文档

http://archive.cloudera.com/cdh/3/flume/UserGuide/index.html

安装过程如下,使用我们自己的yum源进行安装

yum install jdk

yum install flume

#设置环境变量

export FLUME_CONF_DIR=/opt/conf/flume

#启动master脚本

/opt/apps/flume/bin/flume-daemon.sh stop master

#启动node脚本

/opt/apps/flume/bin/flume-daemon.sh start node -n app_79_108

配置文件flume-site.xml如下:

 

    <property>

        <name>flume.master.servers</name>

        <value>10.x.x.111</value>

        <!--value>10.x.x.xxx,10.x.x.xxx,10.x.x.xxx</value-->

    </property>

    <property>

        <name>flume.master.serverid</name>

        <value>0</value>

    </property>

    <property>

        <name>flume.master.gossip.port</name>

        <value>57890</value>

    </property>

    <property>

        <name>flume.master.store</name>

        <value>zookeeper</value>

    </property>

 

<property>

        <name>flume.master.zk.use.external</name>

        <value>true</value>

    </property>

    <property>

        <name>flume.master.zk.servers</name>

        <value>10.x.x.xxx:2181,10.x.x.xxx:2181,10.x.x.xxx:2181</value>

    </property>

    <property>

        <name>flume.collector.output.format</name>

        <value>raw</value>

    </property>

 

Flume可以配置多个Master,只需要在flume.master.servers配置多个即可

Node节点可以连接任何一个Master,多个Master之间会定期通信交换信息

Master的配置信息是存放在外部的Zookeeper上

但多Master不支持automatic flow isolation这种模式,这个真是崩溃

因为在各Node上,可能会有各种不同的Log,需要依据不同的策略汇使用不同的sink,必然会用到autoChain

Master启动后,可以通过http://10.x.x.xxx:35871去查看master的状态,而且可以在线配置config

 

在Flume里可以启动多个Node节点,多个Collector节点

一个Node对应一个Physical Node,它可以对应多个Logic Node

使用Map命令去完成Physical Node和Logic Node的对应关系

每个Logic Node对应一种日志源,然后使用autoChain模式形成不同的Flow,在Collector上汇总到不同的地方

最终可以实现类似如下的效果

 

可以通过flume shell去修改配置,这种方式比较不错

/opt/apps/flume/bin/flume shell -c 10.x.x.xxx:35873

#配置node节点,将nginx的日志通过autoDFOChain方式发送出去,定义了一个nginx_access的flow

exec config nginx_access_150_77 nginx_access "tail(\"/opt/logs/nginx/access.log\")" autoDFOChain 

#配置collector节点,将nginx_access flow过来的日志给汇总到本地的日志文件,日志的输出格式可以是raw,syslog,log4j,avro,json等

exec config collector_150_111_nginx_access nginx_access autoCollectorSource  'select(   "host") escapedFormatDfs("file:///opt/logs/flume/","%Y%m%d_access.log","syslog")'

 

可以直接把日志推送到Hadoop上,由于我们的Hadoop启用了kerberos认证,所以也需要相应配置

为了使用lzo压缩,需要安装对应的lzo包,同时配置LzopCodec

 

 <property>

        <name>flume.kerberos.user</name>

        <value>flume/_HOST@XXX.SOHU.COM </value>

        <description></description>

    </property>

    <property>

        <name>flume.kerberos.keytab</name>

        <value>/home/flume/flume.keytab </value>

        <description></description>

    </property>

    <property>

        <name>flume.collector.dfs.compress.codec</name>

        <value>LzopCodec</value>

    </property>

另外,还需要配置环境变量,拷贝lzo的jar包到flume的lib中

export JAVA_LIBRARY_PATH=/opt/apps/xxxx/hadoop/lib/native/Linux-amd64-64

/opt/apps/xxxx/hadoop/lib/hadoop-lzo-0.4.12.jar /opt/apps/flume/lib/hadoop-lzo-0.4.12.jar

最后,再配置sink到hdfs上即可

 exec config collector_150_111_nginx_access nginx_access autoCollectorSource  'select    ("host") collector(60000) {escapedFormatDfs("hdfs://zw-hadoop-master:9000/user/flume/    nginx/%Y%m%d","access_%H%M_%{rolltag}.log","syslog")}'

#可以同时配置2个sink,使日志既输出到本地文件,又输出到hdfs上

exec config collector_150_111_nginx_access nginx_access autoCollectorSource  '[collec    tor(43200000){escapedFormatDfs("hdfs://zw-hadoop-master:9000/user/flume/nginx/%Y%m%d/    ","access_%H_%{rolltag}.log","syslog")},roll(86400000){text("/opt/logs/flume/nginx_ac    cess.log","syslog")}]

又见Too many open files错误

应用刚上线了2台新服务器

这两天都报警了几次,上去看了服务器的情况,负载并不高

在日志里,看到了“Too many open files...”的错误

检查ulimit设置的open files数目,已经很大了

使用lsof查看后,发现总数确实已经超出了最大值

java      1529   app *431u     sock                0,5              6003257 can't identify protocol

里面有一堆的这个错误,初步判断是socket连接的问题

突然想起来,以前也曾碰到过这样的问题,是无法连接一台内部服务器的socket

找相关同学开通连接权限后,就没问题了

第二次碰到这样的问题,记录下来,备忘...

RedHat AS打包rpm和建立本地yum源

上次和Sogou运维的同学交流,他们是通过本地yum源来统一安装应用

借鉴人家的经验,我们今后的运维部署工作,也准备使用yum统一完成

周末2天在家捣鼓了一番,终于完成了nginx的rpm包,并通过yum安装

打包rpm的过程:

1. RedHat上默认的打包路径是/usr/src/redhat/,可以自己定义:

mkdir /opt/rpmbuild

echo %_topdir /opt/rpmbuild > ~/.rpmmacros

2. 建立相应的目录

mkdir /opt/rpmbuild/BUILD

mkdir /opt/rpmbuild/RPMS

mkdir /opt/rpmbuild/RPMS/x86_64

mkdir /opt/rpmbuild/RPMS/noarch

mkdir /opt/rpmbuild/SOURCES

mkdir /opt/rpmbuild/SPECS

mkdir /opt/rpmbuild/SRPMS

3. 将nginx1.0.2源码以及相关附加包拷贝到/opt/rpmsrc/nginx下,并生成tgz

tar zcvf nginx-passport-1.0.2.tgz nginx-passport-1.0.2/

cp nginx-1.0.2-passport.tgz  /opt/rpmbuild/SOURCES/

4. 编辑相应的spec文件

vi /opt/rpmbuild/SPECS/nginx-passort.spec

Summary: Nginx not include mod_passport 

Name: nginx-nopassport

Version: 1.0.2

Release: 1

Source0: %{name}-%{version}.tgz

Packager: yushunzhi

License: GPL

Group: Applications/System

BuildRoot: %{_builddir}/%{name}-root

%define nginx_datadir   /opt/apps_install/nginx-%{version}


BuildRequires: pcre,zlib,openssl-devel,perl

Requires: pcre,zlib,openssl

%description

Nginx %{version} not include mod_passport

%prep

%setup -q

%build

./configure --prefix=%{nginx_datadir} ......

make

%install

rm -rf $RPM_BUILD_ROOT

make install DESTDIR=$RPM_BUILD_ROOT

%clean

rm -rf $RPM_BUILD_ROOT

%files

%{nginx_datadir}/

5. 执行打包

rpmbuild -bb nginx-passport.spec

 

建立本地的yum源:

1. 建立目录

mkdir /opt/yum

mkdir /opt/yum/Server

2. 生成repo文件

vi /etc/yum.repos.d/mtpc.repo

[Server]

name=Server

baseurl=http://..../Server

enabled=1

gpgcheck=0

3. 生成本地xml metadata信息

createrepo -v /opt/yum/Server/

4. 安装

yum install nginx-passport.x86_64

服务器上启用iptables引发的问题

今天,一直服务正常的一台服务器突然频繁报警重启

查看系统负载和IO,都略微偏高,但也不是特别高

查看后台服务器的Log,也没能看出什么问题

开始怀疑是压力问题,于是增加了一台新服务器

但仍旧没能解决问题,服务仍然是时断时续

后来发现从该服务器ping或者telnet后面的服务器,经常会出现超时或异常情况

ping: sendmsg: Operation not permitted 

64 bytes from 10.11.156.46: icmp_seq=6 ttl=60 time=0.241 ms

ping: sendmsg: Operation not permitted

64 bytes from 10.11.156.46: icmp_seq=8 ttl=60 time=0.234 ms

而从同一机房的其它服务器连接后面的服务器,则一切正常

在确定了非网络问题后,又经过一番排查,发现,该服务器上起了iptables

-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT

限制了转发的tcp包的速度,由于该服务器的并发量非常大

使用从/var/log/message或者dmesg可以看到如下错误:

ip_conntrack: table full, dropping packet.

最后将iptables服务关掉后,一切就正常了

对于高并发的服务器,最好不要启用iptables,因为这样会导致链接跟踪表满

如果一定需要启用iptables,则可以用以下方法来处理:

1. 增大 ip_conntrack_max 值

echo "393216" >; /proc/sys/net/ipv4/ip_conntrack_max

 

vi /etc/sysctl.conf

net.ipv4.ip_conntrack_max = 393216

(2): 降低 ip_conntrack timeout时间

vi /etc/sysctl.conf

 

net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300

net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120

net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60

net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

搭建syslog-ng服务器

1. 从syslog-ng官网下载自己合适的版本,可以是src源文件,也可以是rpm包

2. 安装rpm包,安装后的位置默认为/opt/syslog-ng下

rpm -i syslog-ng-3.1.2-1.rhel5.x86_64.rpm

3. 修改配置文件,vi /opt/syslog-ng/etc/syslog-ng.conf

@version: 3.0

options {
    create_dirs(yes);
    ts_format(bsd);
};

# sources
source s_local {
    # message generated by Syslog-NG
    internal();
    # standard Linux log source (this is the default place for the syslog() function to send logs to)
    unix-stream("/dev/log");
    # messages from the kernel
    file("/proc/kmsg" program_override("kernel: "));
    udp(ip(0.0.0.0) port(514));
};


# destinations
destination d_messages { file("/var/log/messages"); };

log {
    source(s_local);
    destination(d_messages);
};

filter f_login    { program("sso");};
log { source(s_local); filter (f_login); destination(d_login); };
destination d_login { file("/maildata/orilog/login/$YEAR$MONTH$DAY$HOUR$MIN.log" create_dirs(yes) template("$UNIXTIME|$HOST|$LEVEL|$MSG\n") );};

filter f_register { program("register");};
log { source(s_local); filter (f_register); destination(d_register); };
destination d_register { file("/maildata/orilog/register/$YEAR$MONTH$DAY$HOUR$MIN.log" create_dirs(yes));};

4.启动syslog-ng服务

/etc/init.d/syslog-ng start

5. 一些配置项说明

  • source中定义udp(ip(0.0.0.0) port(514)),是监听514的UDP端口,为了接收其它服务器远程打来的syslog
  • program是根据msg的前缀来进行过滤,比如program("sso"),将匹配以sso:开头的msg,注意sso后面必须要有:
  • match是根据msg消息的内容进行过滤,支持正则,比如:match("aaa[|]bbb")
  • template定义自己的syslog日志的输出模板,替换默认的模板,如:template("$UNIXTIME|$HOST|$LEVEL|$MSG\n")
  • destination中还可以将msg转发到其它的syslog服务器上,如:destination d_sso {file("/opt/log/sso/$YEAR$MONTH$DAY.log" );udp("192.168.x.x" port(514));};

最新文章

最近回复

  • feifei435:这两个URI实际是不一样的
  • zsy: git push origin 分支 -f 给力!
  • 冼敏兵:简单易懂,good fit
  • Jack:无需改配置文件,看着累! # gluster volume se...
  • Mr.j:按照你的方法凑效了,折腾死了。。。。
  • zheyemaster:补充一句:我的网站路径:D:\wamp\www ~~菜鸟站长, ...
  • zheyemaster:wamp2.5(apache2.4.9)下局域网访问403错误的...
  • Git中pull对比fetch和merge | 炼似春秋:[…] 首先,我搜索了git pull和git fe...
  • higkoo:总结一下吧, 性能调优示例: gluster volume s...
  • knowaeap:请问一下博主,你维护的openyoudao支持opensuse吗

分类

归档

其它