多服务器的日志合并统计——Apache日志的cronolog轮循和webalizer合并统计

多服务器的日志合并统计
——Apache日志的cronolog轮循和webalizer合并统计

作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com

写于:2002/07 最后更新: 11/29/2006 17:05:24
Feed Back >>(Read this before you ask question)

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明
http://www.chedong.com/tech/rotate_merge_log.html

关键词:webalizer apache log analysis sort merge cronolog 日志 分析

内容摘要:你完全不必耐心地看完下面的所有内容,因为结论无非以下2点:
1 用 cronolog 干净,安全地轮循apache“日”志
2 用 sort -m 合并排序多个日志

根据个人的使用经历:
1 先介绍apache日志的合并方法;
2 然后根据由此引出的问题说明日志轮循的必要性和解决方法,介绍如何通过cronolog对apache日志进行轮循;
中间有很多在设计日志合并过程中一些相关工具的使用技巧和一些尝试的失败经历……
我相信解决以上问题的路径不止这一条途径,以下方案肯定不是最简便或者说成本最低的,希望能和大家有更多的交流。


多服务器日志合并统计的必要性

越来越多大型的WEB服务使用DNS轮循来实现负载均衡:使用多个同样角色的服务器做前台的WEB服务,这大大方便了服务的分布规划和扩展性,但多个服务器的分布使得日志的分析统计也变得有些麻烦。如果使用webalizer等日志分析工具对每台机器分别做日志统计:
1 会对数据的汇总带来很多麻烦,比如:统计的总访问量需要将SERVER1 SERVER2...上指定月份的数字相加。
2 会大大影响统计结果中唯一访客数unique visits,唯一站点数unique sites的等指标的统计,因为这几个指标并非几台机器的代数相加。

统一日志统计所带来的好处是显而易见的,但如何把所有机器的统计合并到一个统计结果里呢?
首先也许会想:多个服务器能不能将日志记录到同一个远程文件里呢?我们不考虑使用远程文件系统记录日志的问题,因为带来的麻烦远比你获得的方便多的多……
因此,要统计的多个服务器的日志还是:分别记录=>并通过一定方式定期同步到后台=>合并=>后用日志分析工具来进行分析。

首先,要说明为什么要合并日志:因为webalizer没有将同一天的多个日志合并的功能
先后运行
webalizer log1
webalizer log2
webalizer log3
这样最后的结果是:只有log3的结果。

能不能将log1<因为一个日志的分析工具不是将日志一次全部读取后进行分析,而且流式的读取日志并按一定时间间隔,保存阶段性的统计结果。因此时间跨度过大(比如2条日志间隔超过5分钟),一些日志统计工具的算法就会将前面的结果“忘掉”。因此, log1<

多台服务日志合并问题:把多个日志中的记录按时间排序后合并成一个文件

典型的多个日志文件的时间字段是这样的:
log1 log2 log3
00:15:00 00:14:00 00:11:00
00:16:00 00:15:00 00:12:00
00:17:00 00:18:00 00:13:00
00:18:00 00:19:00 00:14:00
14:18:00 11:19:00 10:14:00
15:18:00 17:19:00 11:14:00
23:18:00 23:19:00 23:14:00

日志合并必须是按时间将多个日志的交叉合并。合并后的日志应该是:
00:15:00 来自log1
00:15:00 来自log2
00:16:00 来自log1
00:17:00 来自log3
00:18:00 来自log2
00:19:00 来自log1
....

如何合并多个日志文件?
下面以标准的clf格式日志(apache)为例:
apche的日志格式是这样的:
%h %l %u %t \"%r\" %>s %b
具体的例子:
111.222.111.222 - - [03/Apr/2002:10:30:17 +0800] "GET /index.html HTTP/1.1" 200 419

最简单的想法是将日志一一读出来,然后按日志中的时间字段排序
cat log1 log2 log3 |sort -k 4 -t " "
注释:
-t " ": 日志字段分割符号是空格
-k 4: 按第4个字段排序,也就是:[03/Apr/2002:10:30:17 +0800] 这个字段
-o log_all: 输出到log_all这个文件中

但这样的效率比较低,要知道。如果一个服务已经需要使用负载均衡,其服务的单机日志条数往往都超过了千万级,大小在几百M,这样要同时对多个几百M的日志进行排序,机器的负载可想而之……
其实有一个优化的途径,要知道:即使单个日志本身已经是一个“已经按照时间排好序“的文件了,而sort对于这种文件的排序合并提供了一个优化合并算法:使用 -m merge合并选项,
因此:合并这样格式的3个日志文件log1 log2 log3并输出到log_all中比较好方法是:
sort -m -t " " -k 4 -o log_all log1 log2 log3
注释:
-m: 使用 merge优化算法

注意:合并后的日志输出最好压缩以后再发给webalizer处理
有的系统能处理2G的文件,有的不能。有的程序能处理大于2G的文件,有的不能。尽量避免大于2G的文件,除非确认所有参与处理的程序和操作系统都能处理这样的文件。所以输出后的文件如果大于2G,最好将日志gzip后再发给webalizer处理:大于2G的文件分析过程中文件系统出错的可能性比较大,并且gzip后也能大大降低分析期间的I/O操作。

日志的按时间排序合并就是这样实现的。

日志的轮循机制

让我们关心一下数据源问题:webalizer其实是一个按月统计的工具,支持增量统计:因此对于大型的服务,我可以按天将apache的日志合并后送给 webalizer统计。WEB日志是如何按天(比如每天子夜00:00:00)截断呢?
如果你每天使用crontab:每天0点准时将日志备份成access_log_yesterday
mv /path/to/apache/log/access_log /path/to/apache/log/access_log_yesterday
的话:你还需要:马上运行一下:apache restart 否则:apache会因为的日志文件句柄丢失不知道将日志记录到哪里去了。这样归档每天子夜重启apache服务会受到影响。
比较简便不影响服务的方法是:先复制,后清空
cp /path/to/apache/log/access_log /path/to/apache/log/access_log_yesterday
echo >/path/to/apache/log/access_log

严肃的分析员会这样做发现一个问题:
但cp不可能严格保证严格的0点截断。加入复制过程用了6秒,截断的access_log_yesterday日志中会出现复制过程到00:00:06期间的日志。对于单个日志统计这些每天多出来几百行日志是没有问题的。但对于多个日志在跨月的1天会有一个合并的排序问题:
[31/Mar/2002:59:59:59 +0800]
[31/Mar/2002:23:59:59 +0800]
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]

要知道[01/Apr/2002:00:00:00 这个字段是不可以进行“跨天排序”的。因为日期中使用了dd/mm/yyyy,月份还是英文名,如果按照字母排序,很有可能是这样的结果:排序导致了日志的错误
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]
[01/Apr/2002:00:00:00 +0800]
[31/Mar/2002:59:59:59 +0800]
[31/Mar/2002:59:59:59 +0800]
[31/Mar/2002:23:59:59 +0800]
[31/Mar/2002:59:59:59 +0800]
[31/Mar/2002:23:59:59 +0800]

这些跨天过程中的非正常数据对于webalizer等分析工具来说简直就好像是吃了一个臭虫一样,运行的结果是:它可能会把前一个月所有的数据都丢失!因此这样的数据会有很多风险出现在处理上月最后一天的数据的过程中。

问题的解决有几个思路:
1 事后处理:
。所以一个事后的处理的方法是:用grep命令在每月第1天将日志跨月的日志去掉,比如:
grep -v "01/Apr" access_log_04_01 > access_log_new

修改SORT后的日志:所有跨天的数据去掉。也许对日志的事后处理是一个途径,虽然sort命令中有对日期排序的特殊选项 -M(注意是:大写M),可以让指定字段按照英文月份排序而非字母顺序,但对于apache日志来说,用SORT命令切分出月份字段很麻烦。(我尝试过用 "/"做分割符,并且使用“月份” “年:时间”这两个字段排序)。虽然用一些PERL的脚本肯定可以实现,但最终我还是放弃了。这不符合系统管理员的设计原则:通用性。并且你需要一直问自己:有没有更简单的方法呢?
还有就是将日志格式改成用TIMESTAMP(象SQUID的日志就没有这个问题,它的日志本身就是使用TIMESTAMP做时间时间戳的),但我无法保证所有的日志工具都能识别你在日期这个字段使用了特别的格式。

2 优化数据源:
最好的办法还是优化数据源。将数据源保证按天轮循,同一天的日志中的数据都在同一天内。这样以后你无论使用什么工具(商业的,免费的)来分析日志,都不会因为日志复杂的预处理机制受到影响。

首先可能会想到的是控制截取日志的时间:比如严格从0点开始截取日志,但在子夜前1分钟还是后一分钟开始截取是没有区别的,你仍然无法控制一个日志中有跨 2天记录的问题,而且你也无法预测日志归档过程使用的时间。
因此必须要好好考虑一下使用日志轮循工具的问题,这些日志轮循工具要符合:
1 不中断WEB服务:不能停apache=>移动日志=>重启apache
2 保证同一天日志能够按天轮循:每天一个日志00:00:00-23:59:59
3 不受apache重启的影响:如果apache每次重启都会生成一个新的日志是不符合要求的
4 安装配置简单

首先考虑了apache/bin目录下自带的一个轮循工具:rotatelogs 这个工具基本是用来按时间或按大小控制日志的,无法控制何时截断和如何按天归档。
然后考虑logrotate后台服务:logrotate是一个专门对各种系统日志(syslogd,mail)进行轮循的后台服务,比如SYSTEM LOG,但其配置比较复杂,放弃,实际上它也是对相应服务进程发出一个-HUP重启命令来实现日志的截断归档的。

在apache的FAQ中,推荐了经过近2年发展已经比较成熟的一个工具cronolog:安装很简单:configure=>make=> make install

他的一个配置的例子会让你了解它有多么适合日志按天轮循:对httpd.conf做一个很小的修改就能实现:
TransferLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/access.log"
ErrorLog "|/usr/sbin/cronolog /web/logs/%Y/%m/%d/errors.log"

然后:日志将写入
/web/logs/2002/12/31/access.log
/web/logs/2002/12/31/errors.log
午夜过后:日志将写入
/web/logs/2003/01/01/access.log
/web/logs/2003/01/01/errors.log
而2003 2003/01 和 2003/01/01 如果不存在的话,将自动创建

所以,只要你不在0点调整系统时间之类的话,日志应该是完全按天存放的(00:00:00-23:59:59),后面日志分析中: [31/Mar/2002:15:44:59这个字段就和日期无关了,只和时间有关。

测试:考虑到系统硬盘容量,决定按星期轮循日志
apache配置中加入:
#%w weekday
TransferLog "|/usr/sbin/cronolog /path/to/apache/logs/%w/access_log"

重启apache后,除了原来的CustomLog /path/to/apche/logs/access_log继续增长外,系统log目录下新建立了 3/目录(测试是在周3),过了一会儿,我忽然发现2个日志的增长速度居然不一样!
分别tail了2个日志才发现:
我设置CustomLog使用的是combined格式,就是包含(扩展信息的),而TransferLog使用的是缺省日志格式,看了apache的手册才知道,TransferLog是用配置文件中离它自己最近的一个格式作为日志格式的。我的httpd.conf里写的是:
LogFormat ..... combined
LogFormat ... common
...
CustomLog ... combined
TransferLog ...

所以TrasferLog日志用的是缺省格式,手册里说要让TRANSFER日志使用指定的格式需要:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
TransferLog "|/usr/local/sbin/cronolog /path/to/apache/logs/%w/access_log"

重启,OK,日志格式一样了。
这样的设置结果其实是同时在logs目录下分别记录2个日志access_log和%w/access_log,能不能只记录%w/下的日志那?
查apache手册,更简单的方法:直接让CustomLog输出到cronolog归档日志,并且还能指定格式。
CustomLog "|/usr/local/sbin/cronolog /path/to/apache/logs/%w/access_log" combined

最后是一个日志同步的问题。

任务:每天凌晨找到前1天的日志,另存一个文件准备发送到服务器上。
比如我要保留前1周的日志:每天复制前1天的日志到指定目录,等待日志服务器来抓取:
/bin/cp -f /path/to/apache/logs/`date -v-1d +%w`/access_log /path/for/backup/logs/access_log_yesterday

在FREEBSD上使用以下命令
date -v-1d +%w
注释:
-v-1d: 前1天,而在GNU/Linux上这个选项应该是date -d yesterday
+%w: weekday,由于使用的都是标准时间函数库,所有工具中的WEEKDAY定义都是一样的 0-6 => 周日-周六

注意:
写到CRONTAB里的时候"%"前面需要加一个"\"转义:每天0点5分进行一次日志归档,
另外一个问题就是在cront中需要用:rm -f {} ; 而不是rm -f {}\;
5 0 * * * /bin/cp /path/to/logs/`date -v-1d +\%w`/access_log /path/to/for_sync/logs/access_yesterday
37 10 * * * /usr/bin/find /home/apache/logs/ -name access_log -mtime +1 -exec /bin/rm -f {} ;

首次开始cronolog日志统计是周3,一周以后日志又将轮循回3/access_log
但这次日志是追加到3/access_log还是重新创建一个文件呢?>>access_log or >access_log?
我测试的结果是日志将被追加:
[01/Apr/2002:23:59:59 +0800]
[01/Apr/2002:23:59:59 +0800]
[08/Apr/2002:00:00:00 +0800]
[08/Apr/2002:00:00:00 +0800]

肯定是不希望每次日志还带着上周的数据的并重复统计一次的(虽然对结果没影响),而且这样%w/下的日志不是也越来越多了吗?
解决方法1 把每天的cp改成mv
解决方法2 每天复制完成后:删除6天以前的access_log日志
find /path/to/apache/logs -name access_log -mtime +6 -exec rm -f {}\;
多保留几天的日志还是有必要的:万一日志分析服务器坏了一天呢?

以下是把apache安装在/home/apache下每天统计的一个脚本文件:
#!/bin/sh

#backup old log
/bin/cp -f /home/apache/logs/`date -d yesterday +%w`/access_log /home/apache/logs/access_log_yesterday

#remove old log
/usr/bin/find /home/apache/logs -name access_log -mtime +6 -exec rm -f {}\;

#analysis with webalizer
/usr/local/sbin/webalizer

总结:
1 用 cronolog 干净,安全地轮循日志
2 用 sort -m 排序合并多个日志


参考资料:

日志分析统计工具:
http://directory.google.com/Top/Computers/Software/Internet/Site_Management/Log_Analysis/

Apche的日志设置:
http://httpd.apache.org/docs/mod/mod_log_config.html

Apache的日志轮循:
http://httpd.apache.org/docs/misc/FAQ.html#rotate

Cronolog
http://www.cronolog.org

Webalizer
http://www.mrunix.net/webalizer/
Webalzer的Windows版
http://www.medasys-lille.com/webalizer/

AWStats的使用简介
http://www.chedong.com/tech/awstats.html

附1:Webalizer配置文件说明:重要的地方做了翻译并附有一些重要的配置修改

#
# Webalizer 样例配置文件
# Copyright 1997-2000 by Bradford L. Barrett ([email protected])
# 翻译: 车东 ([email protected])
#
# Distributed under the GNU General Public License. See the
# files "Copyright" and "COPYING" provided with the webalizer
# distribution for additional information.
#
# 这是一个Webalizer (版本 2.01)的配置文件样例
# 所有以'#'开始的行都是被程序忽略的注释,此外空白行也会被跳过,其他行都是具体的配置选项。
# 并按照"ConfigOption Value"的格式,ConfigOption是合法的配置选项关键词,而Value是相应选项对应的值
# 非法的键/值会被忽略并会有相应的警告提示。关键词和值之间至少需要一个空格或制表符tab分割
#
# 从0.98版本开始,Webalizer会找缺省在当前目录下找一个名为webalizer.conf缺省配置文件
# 如果没有找到,会使用/etc/webalizer.conf


# LogFile 定义了WEB服务的日志文件,如果这里没有定义,并且命令行参数也没有指定文件名,
# 则将STDIN(系统标准输入)作为输入数据源
# 如果日志文件扩展名为'.gz' (是一个gzip压缩文件),程序会一边读取一边进行解压缩。

LogFile /home/apache/log/access_log_yesterday

# LogType 定义了日志的类型,Webalizer一般用于CLF和Combined格式的WEB服务日志格式
指定这个选项,你可以处理FTP日志(比如wu-ftp生成的xferlog,和Squid自己的日志
值可以是:'clf', 'ftp' 或'squid', 缺省是'clf'
# JNH : 新的'iis'是为IIS设计的,IIS4缺省使用标准日志格式,IIS5缺省使用W3C格式
# webalizer会自动根据日志的文件名进行识别:标准格式的日志文件名以I开头,W3C的是E
# 你可以在一个目录下同时存放2种日志,webalizer会全部读取并生成一份报告

LogType iis

# OutputDir 报告的输出目录地址,必须是完整的全路径名,但相对路径也许也行,
# 如果没有指定,输出目录就是当前目录。

OutputDir /home/apache/htdocs/usage/

# HistoryName 允许你设置webalizer生成的历史数据文件名
# 历史数据文件保存了12个月内的数据,这些数据会用来生成首页的HTML页面index.html
# 缺省文件名是:"webalizer.hist",缺省存放在指定的输出目录中, 也可以使用绝对路径指定到其他目录中。

#HistoryName webalizer.hist

# Incremental 增量处理允许你处理被分隔成多个小文件的大日志,对于大型站点的按周,按天的日志轮循会非常有用
# 为了继续上次的处理,Webalizer在退出前会保存当时处理的数据并在下次运行是恢复当时的状态
在这个模式下,Webalizer会扫描并忽略重复的记录,请看README文件,里面有更详细的解说
值可以是:'yes'或'no'缺省为'no'.
# 'webalizer.current'这个文件用来保存当前数据,位置在OutputDir设置的输出目录中
# 启用这个选项前,请至少阅读一下README文件中的增量处理一节

Incremental yes

# IncrementalName 允许你设置保存当前数据的文件名,和HistoryName选项一样,除非设置绝对路径,否则文件就在缺省输出目录中,
# 这个选项只有在启用了Incremental模式后才有意义

#IncrementalName webalizer.current

# ReportTitle是标题文字,除非这个字符串是空的,否则主机名会空一格后显示在后面,
# 缺省是英文:"Usage Statistics for".

#ReportTitle Usage Statistics for

# HostName 定义了报告对应的主机名,用在报告的标题和URL统计里,这样
# 即使在一个虚拟主机的统计中,点击URL统计的链接也可以转向相应的正确地址。
# 或者生成报告的服务器是在另外一台机器,clicking on URL's in the report to go to the proper location in
# the event you are running the report on a 'virtual' web server,
# or for a server different than the one the report resides on.
# 如果这里没有指定webalizer会尝试调用uname命令获得系统的主机名,如果失败缺省为"localhost"

HostName www.chedong.com

# HTMLExtension 允许你设置生成报告的文件扩展名,一般缺省是"html",但你也可以根据站点改成你需要的名字
(像配置PHP一样 embeded pages)?

#HTMLExtension html

# PageType 你告诉Webalizer那种类型的URL是你定义的'页面访问'(Page View). 大部分人认为一个html或cgi请求文档是页面,
# 而嵌入在页面中的图片和声音不算,如果没有指定,如果是WEB日志统计,页面的扩展名就是'htm*'和'cgi',
# 如果是ftp日志,扩展名就是'txt' 对于Servlet这样没有扩展名的请求Webalizer也是算页面的。

PageType htm*
PageType cgi
PageType asp
PageType p*
#PageType phtml
#PageType php3
#PageType pl

# UseHTTPS 如果分析的站点使用安全服务器,URL的链接将是以'https://'开头,而不是缺省的'http://'.
如果需要,把它设置成'yes'。缺省是'no'. 这个配置只影响'Top URL's'里的链接.

#UseHTTPS no

# DNSCache 指定了用于反相DNS解析的DNS缓存文件,如果你希望对所有日志中所有的IP地址进行反相域名解析
# addresses found in the log file. 如果没有指定绝对路径(文件名不是以'/'开头),这个文件缺省就在输出目录下
更多详细说明请参考DNS.README
# JNH : 如果你使用ListServer选项,你必须指定DnsCache的全路径

#DNSCache dns_cache.db

# DNSChildren 允许你设置用多少个"子"进程进行DNS解析和更新DNS缓存文件。
# 如果指定了数字,Webalizer会创建DNS缓存文件并且每次运行都会更新,DNS解析会在
日志分析之前根据指定的数值调起子进程进行。如果使用DNS解析,DNS缓存文件名也必须指定。
# DNS lookups. If used, the DNS cache filename MUST be specified as
# well. 缺省值是0,等于禁用DNS缓存文件,子进程的个数可以是用1 到100之间,如果更大会影响系统运行。
比较合理的值是5到20之间,更多详细信息请参考DNS.README

#DNSChildren 0

# HTMLPre 定义了输出页面中最开头的HTML代码,缺省是以下的DOCTYPE声明
# 每行最长是80个字符,如果需要更多代码可以使用多条配置。

#HTMLPre

# HTMLHead 定义了插入到中间,紧接在行后的HTML代码<br># 每行最长是80个字符,如果需要更多代码可以使用多条配置。<br><br>#HTMLHead <META NAME="author" CONTENT="The Webalizer"><br><br># HTMLBody 定义了第一行<BODY>标签的HTML代码,缺省如下:<br># 每行最长是80个字符,如果需要更多代码可以使用多条配置。<br><br><br>#HTMLBody <BODY BGCOLOR="#E8E8E8" TEXT="#000000" LINK="#0000FF" VLINK="#FF0000"><br><br># HTMLPost 定义了输出页面中紧跟在第个<HR>标签后面紧跟在标题<br># 和"summary period"-"Generated on:"这几行后面的代码。<br># As with HTMLHead, you can define as many of these as you want and<br># they will be inserted in the output stream in order of apperance.<br># 每行最长是80个字符,如果需要更多代码可以使用多条配置。<br><br>#HTMLPost <BR CLEAR="all"><br><br># HTMLTail defines the HTML code to insert at the bottom of each<br># HTML document, usually to include a link back to your home<br># page or insert a small graphic. It is inserted as a table<br># data element (ie: <TD> your code here </TD>) and is right<br># alligned with the page. Max string size is 80 characters.<br><br>#HTMLTail <IMG SRC="msfree.png" ALT="100% Micro$oft free!"><br><br># HTMLEnd defines the HTML code to add at the very end of the<br># generated files. It defaults to what is shown below. If<br># used, you MUST specify the </BODY> and </HTML> closing tags<br># as the last lines. Max string length is 80 characters.<br><br>#HTMLEnd </BODY></HTML><br><br># The Quiet option suppresses output messages... Useful when run<br># as a cron job to prevent bogus e-mails. Values can be either<br># "yes" or "no". Default is "no". Note: this does not suppress<br># warnings and errors (which are printed to stderr).<br><br>#Quiet no<br><br># ReallyQuiet will supress all messages including errors and<br># warnings. Values can be 'yes' or 'no' with 'no' being the<br># default. If 'yes' is used here, it cannot be overriden from<br># the command line, so use with caution. A value of 'no' has<br># no effect.<br><br>#ReallyQuiet no<br><br># TimeMe allows you to force the display of timing information<br># at the end of processing. A value of 'yes' will force the<br># timing information to be displayed. A value of 'no' has no<br># effect.<br><br>#TimeMe no<br><br># GMTTime allows reports to show GMT (UTC) time instead of local<br># time. Default is to display the time the report was generated<br># in the timezone of the local machine, such as EDT or PST. This<br># keyword allows you to have times displayed in UTC instead. Use<br># only if you really have a good reason, since it will probably<br># screw up the reporting periods by however many hours your local<br># time zone is off of GMT.<br><br>#GMTTime no<br><br># Debug prints additional information for error messages. This<br># will cause webalizer to dump bad records/fields instead of just<br># telling you it found a bad one. As usual, the value can be<br># either "yes" or "no". The default is "no". It shouldn't be<br># needed unless you start getting a lot of Warning or Error<br># messages and want to see why. (Note: warning and error messages<br># are printed to stderr, not stdout like normal messages).<br><br>#Debug no<br><br># FoldSeqErr forces the Webalizer to ignore sequence errors.<br># This is useful for Netscape and other web servers that cache<br># the writing of log records and do not guarentee that they<br># will be in chronological order. The use of the FoldSeqErr<br># option will cause out of sequence log records to be treated<br># as if they had the same time stamp as the last valid record.<br># Default is to ignore out of sequence log records.<br><br>#FoldSeqErr no<br><br># VisitTimeout 用来定义一个访客回话的超时时间,缺省为30分钟。<br># Visits是根据访客发出请求的时间和来自这个访客所在站点(IP)的最后访问时间决定的,<br># 如果2者时间间隔超过VisitTimeout的值,这个请求就被认为是一个新的访客,访客数也被加1<br># 值为超时的秒数(缺省为=1800秒=30分钟)<br><br>#VisitTimeout 1800<br><br># IgnoreHist shouldn't be used in a config file, but it is here<br># just because it might be usefull in certain situations. If the<br># history file is ignored, the main "index.html" file will only<br># report on the current log files contents. Usefull only when you<br># want to reproduce the reports from scratch. USE WITH CAUTION!<br># Valid values are "yes" or "no". Default is "no".<br><br>#IgnoreHist no<br><br># Country Graph allows the usage by country graph to be disabled.<br># Values can be 'yes' or 'no', default is 'yes'.<br><br>#CountryGraph yes<br><br># DailyGraph and DailyStats allows the daily statistics graph<br># and statistics table to be disabled (not displayed). Values<br># may be "yes" or "no". Default is "yes".<br><br>#DailyGraph yes<br>#DailyStats yes<br><br># HourlyGraph and HourlyStats allows the hourly statistics graph<br># and statistics table to be disabled (not displayed). Values<br># may be "yes" or "no". Default is "yes".<br><br>#HourlyGraph yes<br>#HourlyStats yes<br><br># GraphLegend allows the color coded legends to be turned on or off<br># in the graphs. The default is for them to be displayed. This only<br># toggles the color coded legends, the other legends are not changed.<br># If you think they are hideous and ugly, say 'no' here :)<br><br>#GraphLegend yes<br><br># GraphLines allows you to have index lines drawn behind the graphs.<br># I personally am not crazy about them, but a lot of people requested<br># them and they weren't a big deal to add. The number represents the<br># number of lines you want displayed. Default is 2, you can disable<br># the lines by using a value of zero ('0'). [max is 20]<br># Note, due to rounding errors, some values don't work quite right.<br># The lower the better, with 1,2,3,4,6 and 10 producing nice results.<br><br>#GraphLines 2<br><br># The "Top" options below define the number of entries for each table.<br># Defaults are Sites=30, URL's=30, Referrers=30 and Agents=15, and<br># Countries=30. TopKSites and TopKURLs (by KByte tables) both default<br># to 10, as do the top entry/exit tables (TopEntry/TopExit). The top<br># search strings and usernames default to 20. Tables may be disabled<br># by using zero (0) for the value.<br><br>#TopSites 30<br>#TopKSites 10<br>#TopURLs 30<br>#TopKURLs 10<br>#TopReferrers 30<br>#TopAgents 15<br>#TopCountries 30<br>#TopEntry 10<br>#TopExit 10<br>#TopSearch 20<br>#TopUsers 20<br><br># All* 关键词允许显示所有的URL,独立站点(IP),引用链接(Referrers)<br># 用户浏览器, 搜索关键词和用户名,如果启用,会生成另外一个HTML页面并有链接<br># 加在相应栏目的下面,注意以下2点,这些统计必然比TOP统计要大的多,第2,这些对外都是可见的<br># 值可以是yes或no,缺省都是no,对于一个公开发布的站点,这些按月生成的统计<br># 会非常大。会需要很多磁盘空间,如果访问很多也会带来很多流量。<br><br>#AllSites no<br><span style="color:rgb(0,153,0);">AllURLs yes</span><br>#AllReferrers no<br>#AllAgents no<br><span style="color:rgb(0,153,0);">AllSearchStr yes</span><br>#AllUsers no<br><br># The Webalizer normally strips the string 'index.' off the end of<br># URL's in order to consolidate URL totals. For example, the URL<br># /somedir/index.html is turned into /somedir/ which is really the<br># same URL. This option allows you to specify additional strings<br># to treat in the same way. You don't need to specify 'index.' as<br># it is always scanned for by The Webalizer, this option is just to<br># specify _additional_ strings if needed. If you don't need any,<br># don't specify any as each string will be scanned for in EVERY<br># log record... A bunch f them will degrade performance. Also,<br># the string is scanned for anywhere in the URL, so a string of<br># 'home' would turn the URL /somedir/homepages/brad/home.html into<br># just /somedir/ which is probably not what was intended.<br><br>#IndexAlias home.htm<br>#IndexAlias homepage.htm<br><br># The Hide*, Group* and Ignore* and Include* keywords allow you to<br># change the way Sites, URL's, Referrers, User Agents and Usernames<br># are manipulated. The Ignore* keywords will cause The Webalizer to<br># completely ignore records as if they didn't exist (and thus not<br># counted in the main site totals). The Hide* keywords will prevent<br># things from being displayed in the 'Top' tables, but will still be<br># counted in the main totals. The Group* keywords allow grouping<br># similar objects as if they were one. Grouped records are displayed<br># in the 'Top' tables and can optionally be displayed in BOLD and/or<br># shaded. Groups cannot be hidden, and are not counted in the main<br># totals. The Group* options do not, by default, hide all the items<br># that it matches. If you want to hide the records that match (so just<br># the grouping record is displayed), follow with an identical Hide*<br># keyword with the same value. (see example below) In addition,<br># Group* keywords may have an optional label which will be displayed<br># instead of the keywords value. The label should be seperated from<br># the value by at least one 'white-space' character, such as a space<br># or tab.<br>#<br># The value can have either a leading or trailing '*' wildcard<br># character. If no wildcard is found, a match can occur anywhere<br># in the string. Given a string "www.yourmama.com", the values "your",<br># "*mama.com" and "www.your*" will all match.<br># Your own site should be hidden<br><br>#HideSite *mrunix.net<br>#HideSite localhost<br><br># Your own site gives most referrals<br>#HideReferrer mrunix.net/<br><br># This one hides non-referrers ("-" Direct requests)<br>#HideReferrer Direct Request<br><br># Usually you want to hide these<br>HideURL *.gif<br>HideURL *.GIF<br>HideURL *.jpg<br>HideURL *.JPG<br>HideURL *.png<br>HideURL *.PNG<br>HideURL *.ra<br><span style="color:rgb(0,153,0);">HideURL *.css</span><br><br># Hiding agents is kind of futile<br>#HideAgent RealPlayer<br><br># You can also hide based on authenticated username<br>#HideUser root<br>#HideUser admin<br><br># Grouping options<br>#GroupURL /cgi-bin/* CGI Scripts<br>#GroupURL /images/* Images<br>#GroupSite *.aol.com<br>#GroupSite *.compuserve.com<br>#GroupReferrer yahoo.com/ Yahoo!<br>#GroupReferrer excite.com/ Excite<br>#GroupReferrer infoseek.com/ InfoSeek<br>#GroupReferrer webcrawler.com/ WebCrawler<br><br>#GroupUser root Admin users<br>#GroupUser admin Admin users<br>#GroupUser wheel Admin users<br><br># The following is a great way to get an overall total<br># for browsers, and not display all the detail records.<br># (You should use MangleAgent to refine further...)<br><br>#GroupAgent MSIE Micro$oft Internet Exploder<br>#HideAgent MSIE<br>#GroupAgent Mozilla Netscape<br>#HideAgent Mozilla<br>#GroupAgent Lynx* Lynx<br>#HideAgent Lynx*<br><br># HideAllSites allows forcing individual sites to be hidden in the<br># report. This is particularly useful when used in conjunction<br># with the "GroupDomain" feature, but could be useful in other<br># situations as well, such as when you only want to display grouped<br># sites (with the GroupSite keywords...). The value for this<br># keyword can be either 'yes' or 'no', with 'no' the default,<br># allowing individual sites to be displayed.<br><br>#HideAllSites no<br><br># The GroupDomains keyword allows you to group individual hostnames<br># into their respective domains. The value specifies the level of<br># grouping to perform, and can be thought of as 'the number of dots'<br># that will be displayed. For example, if a visiting host is named<br># cust1.tnt.mia.uu.net, a domain grouping of 1 will result in just<br># "uu.net" being displayed, while a 2 will result in "mia.uu.net".<br># The default value of zero disable this feature. Domains will only<br># be grouped if they do not match any existing "GroupSite" records,<br># which allows overriding this feature with your own if desired.<br><br>#GroupDomains 0<br><br># The GroupShading allows grouped rows to be shaded in the report.<br># Useful if you have lots of groups and individual records that<br># intermingle in the report, and you want to diferentiate the group<br># records a little more. Value can be 'yes' or 'no', with 'yes'<br># being the default.<br><br>#GroupShading yes<br><br># GroupHighlight allows the group record to be displayed in BOLD.<br># Can be either 'yes' or 'no' with the default 'yes'.<br><br>#GroupHighlight yes<br><br># The Ignore* keywords allow you to completely ignore log records based<br># on hostname, URL, user agent, referrer or username. I hessitated in<br># adding these, since the Webalizer was designed to generate _accurate_<br># statistics about a web servers performance. By choosing to ignore<br># records, the accuracy of reports become skewed, negating why I wrote<br># this program in the first place. However, due to popular demand, here<br># they are. Use the same as the Hide* keywords, where the value can have<br># a leading or trailing wildcard '*'. Use at your own risk ;)<br><br>#IgnoreSite bad.site.net<br>#IgnoreURL /test*<br>#IgnoreReferrer file:/*<br>#IgnoreAgent RealPlayer<br>#IgnoreUser root<br><br># The Include* keywords allow you to force the inclusion of log records<br># based on hostname, URL, user agent, referrer or username. They take<br># precidence over the Ignore* keywords. Note: Using Ignore/Include<br># combinations to selectivly process parts of a web site is _extremely<br># inefficent_!!! Avoid doing so if possible (ie: grep the records to a<br># seperate file if you really want that kind of report).<br><br># Example: Only show stats on Joe User's pages...<br>#IgnoreURL *<br>#IncludeURL ~joeuser*<br><br># Or based on an authenticated username<br>#IgnoreUser *<br>#IncludeUser someuser<br><br># The MangleAgents allows you to specify how much, if any, The Webalizer<br># should mangle user agent names. This allows several levels of detail<br># to be produced when reporting user agent statistics. There are six<br># levels that can be specified, which define different levels of detail<br># supression. Level 5 shows only the browser name (MSIE or Mozilla)<br># and the major version number. Level 4 adds the minor version number<br># (single decimal place). Level 3 displays the minor version to two<br># decimal places. Level 2 will add any sub-level designation (such<br># as Mozilla/3.01Gold or MSIE 3.0b). Level 1 will attempt to also add<br># the system type if it is specified. The default Level 0 displays the<br># full user agent field without modification and produces the greatest<br># amount of detail. User agent names that can't be mangled will be<br># left unmodified.<br><br>#MangleAgents 0<br><br># 搜索引擎关键词允许你设置搜索引擎和URL中的查询格式,用于统计用户通过那些关键词<br># 被用来找到你的站点。第1个关键词是从WEB日志中的referrer字段识别搜索引擎,第2个是<br># URL中的关键词的参数名。<br><br>SearchEngine yahoo.com p=<br>SearchEngine altavista.com q=<br>SearchEngine google.com q=<br>SearchEngine eureka.com q=<br>SearchEngine lycos.com query=<br>SearchEngine hotbot.com MT=<br>SearchEngine msn.com MT=<br>SearchEngine infoseek.com qt=<br>SearchEngine webcrawler searchText=<br>SearchEngine excite search=<br>SearchEngine netscape.com search=<br>SearchEngine mamma.com query=<br>SearchEngine alltheweb.com query=<br>SearchEngine northernlight.com qr=<br><span style="color:rgb(0,153,0);">SearchEngine baidu.com word=</span><br style="color:rgb(0,153,0);"><span style="color:rgb(0,153,0);">SearchEngine sina.com.cn word=</span><br style="color:rgb(0,153,0);"><span style="color:rgb(0,153,0);">SearchEngine sohu.com word=</span><br style="color:rgb(0,153,0);"><span style="color:rgb(0,153,0);">SearchEngine 163.com q=</span><br><br><br><br># Dump* 用来将统计导出成用制表符(TAB)分割的文本文件,从而方便导入到其他应用中做统计。<br># 比如数据库和统计软件<br><br># DumpPath specifies the path to dump the files. If not specified,<br># it will default to the current output directory. Do not use a<br># trailing slash ('/').<br><br>#DumpPath /var/lib/httpd/logs<br><br># The DumpHeader keyword specifies if a header record should be<br># written to the file. A header record is the first record of the<br># file, and contains the labels for each field written. Normally,<br># files that are intended to be imported into a database system<br># will not need a header record, while spreadsheets usually do.<br># Value can be either 'yes' or 'no', with 'no' being the default.<br><br>#DumpHeader no<br><br># DumpExtension allow you to specify the dump filename extension<br># to use. The default is "tab", but some programs are pickey about<br># the filenames they use, so you may change it here (for example,<br># some people may prefer to use "csv").<br><br>#DumpExtension tab<br><br># 控制各个大类统计的导出。<br># 值可以是'yes'或 'no'缺省为'no'.<br><br>#DumpSites no<br><span style="color:rgb(0,153,0);">DumpURLs yes</span><br>DumpReferrers yes<br>#DumpAgents no<br>#DumpUsers no<br><span style="color:rgb(0,153,0);">DumpSearchStr yes</span><br><br># End of configuration file... Have a nice day!<br><br># begin of JNH mofications<br># new entry for Win32 release<br><br># NOUVELLE ENTREE pour les serveurs NT<br><br># nom de la page par defaut sur le serveur<br># replace file "Index" for unix systems by other name <br><br># IndexPage default<br><br># 所有的日志存放目录<br># 文件个数限制为一个目录下250,如果需要处理更多你需要移动文件并再次运行。<br><br># FolderLog C:\JnhDev\WebAlizer32\Exemple de Logs\IIS4.0\Log Standard\<br><span style="color:rgb(0,153,0);">FolderLog C:\WINNT\system32\LogFiles\W3SVC3\</span><br>ExtentionLog log<br><br># when you use mix type of log in same folder, webalizer sort file for order by<br># name, but if begin of file file is mix sort didn't make work, then you can disable it<br># default is no <br><br># DisableSort yes<br><br><br># Name of file contain list of server to process like for each line :<br># Name of Customer<SPACE>Folder of log<SPACE>Folder output<SPACE>Host Name1;Host Name 2<br># sample (extract of production file, who have 255 lines)<br># all of option in this file apply to all reports ...<br># New in this file you can use coma (") for delimit field<br># wA001 c:\WA001\LogIIS\ c:\wA001\stats wa001.LeRelaisInternet.com;www1.jeanlouisaubert.com<br># wA002 c:\WA002\LogIIS\ c:\wA002\stats wa002.LeRelaisInternet.com;www.restotel.fr;www.nordpage.fr<br># wA003 c:\WA003\LogIIS\ c:\wA003\stats Wa003.LeRelaisInternet.com;www.autobusavapeur.com<br><br>#ServerList c:\jnhdev\webalizer\listeserv.txt<br><br># If you have dayly rotation on log name, you can change name after process a file<br># to have less no productive work day<br># to use this option you need to use "HistoryName" and "Incremental"<br><br><span style="color:rgb(0,153,0);">RenameLog yes</span><br style="color:rgb(0,153,0);"><span style="color:rgb(0,153,0);">NewExtension sav</span><br><br><br># 2 New Options for optimize DNS resolution : is time to live in data base cache <br># for good dns resolution (default is 30 days) and for bad resolution, like<br># no reverse IP, in this case it's better to store errors in database file <br># cause each day bad dns consume a lot of time (default 7 days)<br><br>#TtlDns 30<br>#TtlDnsError 7<br><br># new option for convert each record date to Local time before process it ...<br># Test only<br># default = No<br><br>ConvertTime yes<br><br><br># end of JNH .. HAve a nice day !!!<br><br></p> <p>注意:对IIS日志需要通过配置将发送字节数sc_size和referer2个字段启用。<br></p> <p><br>原文出处:<a href="http://www.chedong.com/tech/rotate_merge_log.html">http://www.chedong.com/tech/rotate_merge_log.html</a><br></p> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1741961535367954432"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(应用服务器,Apache,浏览器,Access,Web)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1947360469564059648.htm" title="PyCharm 高效入门指南:从安装到进阶,解锁 Python 开发全流程" target="_blank">PyCharm 高效入门指南:从安装到进阶,解锁 Python 开发全流程</a> <span class="text-muted"></span> <div>作为Python开发者的利器,PyCharm的安装与配置是开启高效编程之旅的第一步。面对Community和Professional两个版本,该如何选择呢?Community版是免费开源的,适合初学者和简单项目开发,包含基础的Python开发功能;而Professional版虽收费,但功能更强大,支持Web开发、数据库连接等高级功能,适合专业开发者和复杂项目。1.安装与配置下载与安装下载PyCha</div> </li> <li><a href="/article/1947357192839557120.htm" title="ab命令压力测试---网站性能压力测试" target="_blank">ab命令压力测试---网站性能压力测试</a> <span class="text-muted">凯凯恺恺恺恺凯凯</span> <a class="tag" taget="_blank" href="/search/ab%E5%91%BD%E4%BB%A4/1.htm">ab命令</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/1.htm">性能测试</a> <div>网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环。只有让服务器处在高压情况下,才能真正体现出软件、硬件等各种设置不当所暴露出的问题。性能测试工具目前最常见的有以下几种:ab、http_load、webbench、siege。今天我们专门来介绍ab。ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试</div> </li> <li><a href="/article/1947333369742290944.htm" title="10.jobManager初始化流程" target="_blank">10.jobManager初始化流程</a> <span class="text-muted"></span> <div>JobManager初始化流程1.找到入口类StandaloneSessionClusterEntrypoint该类位于Flink源码的以下路径中:flink-runtime/src/main/java/org/apache/flink/runtime/entrypoint/StandaloneSessionClusterEntrypoint.java2.查看main方法/**Entrypoint</div> </li> <li><a href="/article/1947330598683078656.htm" title="某易云音乐获取" target="_blank">某易云音乐获取</a> <span class="text-muted">我愿与你相伴</span> <a class="tag" taget="_blank" href="/search/python%E7%88%AC%E5%8F%96%E6%95%99%E7%A8%8B/1.htm">python爬取教程</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>importosimportrequestsfromlxmlimportetreeheaders={'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/121.0.0.0Safari/537.36','Cookie':'_iuqxldmzr_=32;WEVNSM=1.</div> </li> <li><a href="/article/1947325551450583040.htm" title="基于ASP.Net Core 开发的纯BS结构的RoadFlow工作流平台" target="_blank">基于ASP.Net Core 开发的纯BS结构的RoadFlow工作流平台</a> <span class="text-muted"></span> <div>基于ASP.NetCore开发的纯BS结构的RoadFlow工作流平台RoadFlow是一款集成工作流引擎的ASP.NETCOREMVC快速开发框架,由从事多年工作流开发与实施的技术团队开发。该工作流平台是根据多年对企事业单位工作流应用经验总结而成,是一款符合于国情的工作流平台,特别适合于国内无标准,复杂多变的工作审批流转。拥有全浏览器兼容的可视化流程设计器、表单设计器、灵活精细的权限管理等先进设</div> </li> <li><a href="/article/1947313951305953280.htm" title="B/S架构系统角色与对应协议详解" target="_blank">B/S架构系统角色与对应协议详解</a> <span class="text-muted">步行cgn</span> <a class="tag" taget="_blank" href="/search/JavaWeb/1.htm">JavaWeb</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>B/S架构系统角色与对应协议详解一、核心角色及协议映射系统角色主要职责关键协议协议作用说明浏览器用户交互界面HTTP/HTTPS应用层通信基础(Browser)发送请求/渲染响应WebSocket全双工实时通信执行前端逻辑WebRTC点对点音视频传输DNS域名解析--------------------------------------------------------------------</div> </li> <li><a href="/article/1947313951884767232.htm" title="Servlet 对象的生命周期" target="_blank">Servlet 对象的生命周期</a> <span class="text-muted"></span> <div>Servlet对象的生命周期Servlet的生命周期由Web容器(如Tomcat)管理,分为以下三个阶段:️1.初始化阶段(init())触发时机:当容器第一次收到针对该Servlet的请求时,或容器启动时(若配置了)。执行方法:调用init(ServletConfigconfig)方法。特点:仅执行一次,用于加载资源(如数据库连接、配置文件)。ServletConfig对象提供初始化参数(在we</div> </li> <li><a href="/article/1947313572484804608.htm" title="支付宝支付" target="_blank">支付宝支付</a> <span class="text-muted">屿筱</span> <a class="tag" taget="_blank" href="/search/%E9%B8%BF%E8%92%99/1.htm">鸿蒙</a><a class="tag" taget="_blank" href="/search/HarmonyOS5/1.htm">HarmonyOS5</a> <div>当前我们有现成的支付宝H5端支付能力,所以需要我们采用混合开发的模式进行操作,所谓混合开发就是鸿蒙原生内嵌一个支付宝的h5页面,经过互相通信实现整个支付流程使用Web组件通过src发起支付宝接口请求(携带订单id参数)监听Web组件的网络请求变化,如果发现/pay/redirect关键标识,证明支付已经完成解析回调参数(如果payResult参数为true,即为成功)import{promptAc</div> </li> <li><a href="/article/1947313572962955264.htm" title="鸿蒙与web混合开发双向通信" target="_blank">鸿蒙与web混合开发双向通信</a> <span class="text-muted">屿筱</span> <a class="tag" taget="_blank" href="/search/%E9%B8%BF%E8%92%99/1.htm">鸿蒙</a><a class="tag" taget="_blank" href="/search/HarmonyOS5/1.htm">HarmonyOS5</a> <div>鸿蒙与web混合开发双向通信用runJavaScript和registerJavaScriptProxywebentry/src/main/resources/rawfile/1.html混合开发打开相册//直接写js代码functionchangeImg(){//1.获取img这个元素constimg=document.querySelector('img')//2.修改元素的属性img.src</div> </li> <li><a href="/article/1947311054052716544.htm" title="python flask restful_Flask应用示例1 - 通过Flask实现Restful服务" target="_blank">python flask restful_Flask应用示例1 - 通过Flask实现Restful服务</a> <span class="text-muted">weixin_39548787</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/flask/1.htm">flask</a><a class="tag" taget="_blank" href="/search/restful/1.htm">restful</a> <div>1,前言Python的强大,已经涉及到软件开发领域的方方面面。然而,Python入门容易,精确很难,需要深入研究。在Web方面同样如此,常用的PythonWeb框架,例如Django、Flask、Tornado等等,共计有100多种,各有优劣。本文以Flask为例,介绍Flask的Restful实现方式,主要实现对数据表的增删查改操作。2,需求在开发代码之前,需要提前明确URL请求、HTTP方法与</div> </li> <li><a href="/article/1947309415493332992.htm" title="java毕业设计-基于Javaweb的家常小菜烹饪学习管理系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)" target="_blank">java毕业设计-基于Javaweb的家常小菜烹饪学习管理系统的设计与实现(源码+LW+部署文档+全bao+远程调试+代码讲解等)</a> <span class="text-muted">程序猿刘</span> <a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E6%AF%95%E4%B8%9A%E8%AE%BE%E8%AE%A1/1.htm">毕业设计</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AF%BE%E7%A8%8B%E8%AE%BE%E8%AE%A1/1.htm">课程设计</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>博主介绍:✌️码农一枚,专注于大学生项目实战开发、讲解和毕业文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌️技术范围::小程序、SpringBoot、SSM、JSP、Vue、PHP、Java、python、爬虫、数据可视化、大数据、物联网、机器学习等设计与开发。主要内容:免费开题报告、任务书、全bao定制+</div> </li> <li><a href="/article/1947299837074534400.htm" title="springboot+vue生态系统的气象数据可视化平台Java+python-计算机毕业设计" target="_blank">springboot+vue生态系统的气象数据可视化平台Java+python-计算机毕业设计</a> <span class="text-muted"></span> <div>目录功能和技术介绍具体实现截图开发核心技术:开发环境开发步骤编译运行核心代码部分展示系统设计详细视频演示可行性论证软件测试源码获取功能和技术介绍该系统基于浏览器的方式进行访问,采用springboot集成快速开发框架,前端使用vue方式,基于es5的语法,开发工具IntelliJIDEAx64,因为该开发工具,内嵌了Tomcat服务运行机制,可不用单独下载Tomcatserver服务器。由于考虑到</div> </li> <li><a href="/article/1947298598446231552.htm" title="2019-05-16" target="_blank">2019-05-16</a> <span class="text-muted">海牙kyogre</span> <div>前端优化动画性能之requestAnimationFrame@(技术分享)在前端做动画很多人第一人的反应是用定时器,比如setInterval、setTimeout,除此之外css3可以使用transition和animation来实现。而编写动画循环的关键是要知道延迟时间多长合适。一方面,循环间隔必须足够短,这样才能让不同的动画效果显得平滑流畅;另一方面,循环间隔还要足够长,这样才能确保浏览器有</div> </li> <li><a href="/article/1947295428160581632.htm" title="如何使用爬虫简单的爬取一个网页的静态前端代码" target="_blank">如何使用爬虫简单的爬取一个网页的静态前端代码</a> <span class="text-muted"></span> <div>什么是爬虫?Python爬虫是一种使用Python语言编写的程序,用于自动访问网页并提取所需信息。它通常用于网络数据抓取、数据挖掘和信息收集。Python爬虫可以模拟浏览器行为,向服务器发送请求并接收响应数据,然后解析这些数据以获取有用的信息。爬虫的基本原理(流程)发送请求:爬虫向目标网站的服务器发送HTTP请求(通常是GET请求)。获取响应:服务器返回网页的HTML内容。解析内容:爬虫解析HTM</div> </li> <li><a href="/article/1947294797018492928.htm" title="[Python] -项目实战8- 构建一个简单的 Todo List Web 应用(Flask)" target="_blank">[Python] -项目实战8- 构建一个简单的 Todo List Web 应用(Flask)</a> <span class="text-muted">踏雪无痕老爷子</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>一、为什么选Flask?轻量上手快:仅需几行代码就能跑一个可用的Web应用。灵活扩展:可接入数据库、身份认证、前端框架等。教育性强:涵盖前后端交互基础,适合入门全栈开发。二、项目结构建议flask_todo/├──app.py├──templates/│└──index.html├──static/│└──style.css├──todo.db└──requirements.txtapp.py:后</div> </li> <li><a href="/article/1947294797484060672.htm" title="鸿蒙蓝牙通信" target="_blank">鸿蒙蓝牙通信</a> <span class="text-muted">屿筱</span> <a class="tag" taget="_blank" href="/search/%E9%B8%BF%E8%92%99/1.htm">鸿蒙</a><a class="tag" taget="_blank" href="/search/HarmonyOS5/1.htm">HarmonyOS5</a> <div>https://developer.huawei.com/consumer/cn/doc/best-practices/bpta-bluetooth-low-energy蓝牙权限module.json5{"module":{"requestPermissions":[{"name":"ohos.permission.ACCESS_BLUETOOTH","reason":"$string:app_n</div> </li> <li><a href="/article/1947294797924462592.htm" title="B/S 架构通信原理详解" target="_blank">B/S 架构通信原理详解</a> <span class="text-muted">步行cgn</span> <a class="tag" taget="_blank" href="/search/JavaWeb/1.htm">JavaWeb</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a> <div>B/S架构通信原理详解一、核心架构Browser/Server(浏览器/服务器)模型:前端:浏览器作为统一客户端(Chrome/Firefox/Edge等)后端:服务器处理业务逻辑+数据存储(Nginx/Apache/Tomcat等)通信协议:基于HTTP/HTTPS的请求-响应模型二、完整通信流程sequenceDiagramparticipant用户participant浏览器particip</div> </li> <li><a href="/article/1947287616474902528.htm" title=".NET 9 RC1 正式发布" target="_blank">.NET 9 RC1 正式发布</a> <span class="text-muted">dotNET跨平台</span> <a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a> <div>.NET9RC1是.NET9的第一个候选发布版本(ReleaseCandidate),标志着该版本接近最终发布。这次更新包括增强的WebSocketAPI、新的压缩选项、高级SignalR跟踪以及.NETMAUI的更新,以改善文本对齐等。在文章还宣布了.NETConf2024的日期,将于2024年11月12日至14日举行,庆祝.NET9的发布,具体详见:https://devblogs.micro</div> </li> <li><a href="/article/1947287172142919680.htm" title="2023-03-22" target="_blank">2023-03-22</a> <span class="text-muted">小郭不会打篮球</span> <div>3.21笔记一、定位作用:显示定在所有其他元素之上、可以让元素在浏览器中任意位置。a标准流块级元素独占一行→垂直布局行内元素/行内块元素一行显示多个→水平布局b浮动可以让原本垂直布局的块级元素变成水平布局c定位可以让元素自由的摆放在网页的任意位置一般用于盒子之间的层叠情况1、属性名:position静态定位:static相对定位:relative绝对定位:absolute固定定位:fixed向下移</div> </li> <li><a href="/article/1947286859558219776.htm" title="ZooKeeper学习专栏(三):ACL权限控制与Zab协议核心原理" target="_blank">ZooKeeper学习专栏(三):ACL权限控制与Zab协议核心原理</a> <span class="text-muted"></span> <div>文章目录前言一、ACL访问控制列表二、原子广播协议(Zab协议)总结前言在分布式系统中,安全访问控制和一致性保证是两大核心需求。本文将深入探讨Zookeeper的ACL权限控制机制和Zab协议的核心原理,帮助读者理解Zookeeper如何保障数据安全性和系统一致性。一、ACL访问控制列表ACL(AccessControlLists)是Zookeeper保护ZNode数据安全的关键机制,它定义了哪些</div> </li> <li><a href="/article/1947283579935453184.htm" title="使用 .NET 6.0 的简单 WebSocket 客户端和服务器应用程序" target="_blank">使用 .NET 6.0 的简单 WebSocket 客户端和服务器应用程序</a> <span class="text-muted"></span> <div>几个月前,有同事来找我,问能否用.NET创建一个简单的WebSocket服务器(以及之后的客户端)。据我了解,他想用它来控制对方电脑上的进程。或许对其他人也有用,所以我把它发布在这里。让我们从服务器开始。我这里使用的是.NET6和ASP.NETCore,不需要任何额外的配置。它实际上是一个准系统应用程序,没有任何花哨的附加功能。Console.Title="Server";varbuilder=W</div> </li> <li><a href="/article/1947280300493041664.htm" title="LVS----DR模式配置" target="_blank">LVS----DR模式配置</a> <span class="text-muted">KellenKellenHao</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/lvs/1.htm">lvs</a><a class="tag" taget="_blank" href="/search/DR%E6%A8%A1%E5%BC%8F/1.htm">DR模式</a> <div>LVS-DR模式配置通过负载均衡器配置:将负载均衡器的IP地址设置为Web节点的虚拟IP(VIP)地址。这样,客户端的请求将发送到负载均衡器的VIP地址。客户端请求到达负载均衡器:当客户端发送请求到负载均衡器的VIP地址时,负载均衡器会接收到请求。负载均衡器将请求转发到后端Web节点:负载均衡器将请求转发到其中一个后端Web节点。它通过修改目标IP地址为相应的Web节点的IP地址,并修改源IP地址</div> </li> <li><a href="/article/1947280301088632832.htm" title="LVS-----TUN模式配置" target="_blank">LVS-----TUN模式配置</a> <span class="text-muted">KellenKellenHao</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/LVS/1.htm">LVS</a><a class="tag" taget="_blank" href="/search/TUN%E6%A8%A1%E5%BC%8F/1.htm">TUN模式</a> <div>一、实验环境主机名称ip角色lvs-tun192.168.100.100lvs调度器web1192.168.100.1后端web服务器1web2192.168.100.2后端web服务器2client192.168.100.200客户端二、搭建lvs调度器的TUN模式1、lvs-tun调度器配置#清除DR模式的策略ipvsadm-C#查看策略ipvsadm-L[root@lvs-tun~]#ipv</div> </li> <li><a href="/article/1947279650870849536.htm" title="聊聊flink的RpcService" target="_blank">聊聊flink的RpcService</a> <span class="text-muted">go4it</span> <div>序本文主要研究一下flink的RpcServiceRpcServiceflink-release-1.7.2/flink-runtime/src/main/java/org/apache/flink/runtime/rpc/RpcService.javapublicinterfaceRpcService{StringgetAddress();intgetPort();CompletableFutu</div> </li> <li><a href="/article/1947275638490591232.htm" title="PHP 性能优化全攻略:提升 Web 应用速度的关键" target="_blank">PHP 性能优化全攻略:提升 Web 应用速度的关键</a> <span class="text-muted">来恩1003</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/1.htm">从入门到精通</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a><a class="tag" taget="_blank" href="/search/%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/1.htm">性能优化</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>PHP学习资料PHP学习资料PHP学习资料在Web开发领域,PHP凭借其简单易用、开源免费等特性,成为众多开发者构建网站和应用的首选语言。然而,随着业务的发展和用户量的增加,PHP应用的性能问题逐渐凸显。性能不佳不仅会导致用户体验下降,还可能影响业务的发展。因此,对PHP代码进行性能优化至关重要。本文将深入探讨PHP性能优化的各个方面,包括缓存的使用、代码优化策略以及服务器配置优化等,帮助开发者打</div> </li> <li><a href="/article/1947273497575223296.htm" title="计算机毕设——高校在线学习平台" target="_blank">计算机毕设——高校在线学习平台</a> <span class="text-muted"></span> <div>随着教育信息化改革不断推进,传统教学模式逐渐暴露出诸多弊端,例如资源分散、互动匮乏、教学反馈滞后等。如何借助现代Web技术构建一个功能完善、稳定高效的教学平台,成为许多高校面临的重要课题。本文将从我的毕业设计项目《在线学习平台》出发,分享一个完整在线教育平台的设计与开发过程,涵盖技术选型、系统架构、核心模块实现以及系统测试等内容,适合对SpringBoot+Vue全栈开发感兴趣的同学学习参考。一、</div> </li> <li><a href="/article/1947267827685715968.htm" title="MySQL(149)如何进行数据清洗?" target="_blank">MySQL(149)如何进行数据清洗?</a> <span class="text-muted">辞暮尔尔-烟火年年</span> <a class="tag" taget="_blank" href="/search/MySQL/1.htm">MySQL</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>数据清洗在数据处理和分析过程中至关重要,确保数据质量和一致性。以下是一个详细的指南,展示如何使用Java进行数据清洗,包括处理缺失值、重复值、异常值、数据类型转换以及标准化等步骤。一、准备工作确保安装有Java开发环境(JDK)和Maven或Gradle等依赖管理工具。我们将使用ApacheCommonsCSV库来处理CSV文件,并使用Java标准库进行数据清洗操作。二、加载数据首先,我们加载数据</div> </li> <li><a href="/article/1947266815931510784.htm" title="IM即时通讯源码/im源码基于uniapp框架从0开始设计搭建在线聊天系统" target="_blank">IM即时通讯源码/im源码基于uniapp框架从0开始设计搭建在线聊天系统</a> <span class="text-muted">宠友信息</span> <a class="tag" taget="_blank" href="/search/uni-app/1.htm">uni-app</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%B0%8F%E7%A8%8B%E5%BA%8F/1.htm">小程序</a> <div>文章目录前言一、确定技术栈二、数据库设计:1.引入库2.使用SpringBoot创建后端项目3.实现WebSocket通信:3.1创建WebSocket配置类:3.2创建ChatWebSocketHandler类:3.3前端WebSocket连接与通信:总结前言随着人社交产品的不断发展,即时通讯聊天这门技术也越来越重要,很多人都开启了学习通讯技术,本文就介绍了即时通讯的基础内容。一、确定技术栈在开</div> </li> <li><a href="/article/1947265304262406144.htm" title="(详细文档)java web在线商城系统(jsp + servlet)" target="_blank">(详细文档)java web在线商城系统(jsp + servlet)</a> <span class="text-muted">熊猫发电机:miniqq207</span> <a class="tag" taget="_blank" href="/search/%E5%AE%9E%E8%AE%AD%E9%A1%B9%E7%9B%AE/1.htm">实训项目</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E4%BB%93%E5%BA%93/1.htm">数据仓库</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a> <div>目录一、设计任务......................................................................................41.1设计意义................................................................................41.2设计目的..........</div> </li> <li><a href="/article/1947261768380248064.htm" title="JAVAWeb2" target="_blank">JAVAWeb2</a> <span class="text-muted">DanB24</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>1.数据库设计1.软件的研发步骤数据库设计概念数据库设计就是根据业务系统的具体需求,结合我们所选用的DBMS,为这个业务系统构造出最优的数据存储模型。建立数据库中的表结构以及表与表之间的关联关系的过程。有哪些表?表里有哪些字段?表和表之间有什么关系?数据库设计的步骤需求分析(数据是什么?数据具有哪些属性?数据与属性的特点是什么)逻辑分析(通过ER图对数据库进行逻辑建模,不需要考虑我们所选用的数据库</div> </li> <li><a href="/article/13.htm" title="github中多个平台共存" target="_blank">github中多个平台共存</a> <span class="text-muted">jackyrong</span> <a class="tag" taget="_blank" href="/search/github/1.htm">github</a> <div>在个人电脑上,如何分别链接比如oschina,github等库呢,一般教程之列的,默认 ssh链接一个托管的而已,下面讲解如何放两个文件 1) 设置用户名和邮件地址 $ git config --global user.name "xx" $ git config --global user.email "test@gmail.com"</div> </li> <li><a href="/article/140.htm" title="ip地址与整数的相互转换(javascript)" target="_blank">ip地址与整数的相互转换(javascript)</a> <span class="text-muted">alxw4616</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>//IP转成整型 function ip2int(ip){ var num = 0; ip = ip.split("."); num = Number(ip[0]) * 256 * 256 * 256 + Number(ip[1]) * 256 * 256 + Number(ip[2]) * 256 + Number(ip[3]); n</div> </li> <li><a href="/article/267.htm" title="读书笔记-jquey+数据库+css" target="_blank">读书笔记-jquey+数据库+css</a> <span class="text-muted">chengxuyuancsdn</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a> <div>1、grouping ,group by rollup, GROUP BY GROUPING SETS区别 2、$("#totalTable tbody>tr td:nth-child(" + i + ")").css({"width":tdWidth, "margin":"0px", &q</div> </li> <li><a href="/article/394.htm" title="javaSE javaEE javaME == API下载" target="_blank">javaSE javaEE javaME == API下载</a> <span class="text-muted">Array_06</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>oracle下载各种API文档: http://www.oracle.com/technetwork/java/embedded/javame/embed-me/documentation/javame-embedded-apis-2181154.html JavaSE文档: http://docs.oracle.com/javase/8/docs/api/ JavaEE文档: ht</div> </li> <li><a href="/article/521.htm" title="shiro入门学习" target="_blank">shiro入门学习</a> <span class="text-muted">cugfy</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a> <div>声明本文只适合初学者,本人也是刚接触而已,经过一段时间的研究小有收获,特来分享下希望和大家互相交流学习。 首先配置我们的web.xml代码如下,固定格式,记死就成 <filter>         <filter-name>shiroFilter</filter-name> &nbs</div> </li> <li><a href="/article/648.htm" title="Array添加删除方法" target="_blank">Array添加删除方法</a> <span class="text-muted">357029540</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a> <div>     刚才做项目前台删除数组的固定下标值时,删除得不是很完整,所以在网上查了下,发现一个不错的方法,也提供给需要的同学。 //给数组添加删除             Array.prototype.del = function(n){ </div> </li> <li><a href="/article/775.htm" title="navigation bar 更改颜色" target="_blank">navigation bar 更改颜色</a> <span class="text-muted">张亚雄</span> <a class="tag" taget="_blank" href="/search/IO/1.htm">IO</a> <div>今天郁闷了一下午,就因为objective-c默认语言是英文,我写的中文全是一些乱七八糟的样子,到不是乱码,但是,前两个自字是粗体,后两个字正常体,这可郁闷死我了,问了问大牛,人家告诉我说更改一下字体就好啦,比如改成黑体,哇塞,茅塞顿开。       翻书看,发现,书上有介绍怎么更改表格中文字字体的,代码如下    </div> </li> <li><a href="/article/902.htm" title="unicode转换成中文" target="_blank">unicode转换成中文</a> <span class="text-muted">adminjun</span> <a class="tag" taget="_blank" href="/search/unicode/1.htm">unicode</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A0%81%E8%BD%AC%E6%8D%A2/1.htm">编码转换</a> <div>  在Java程序中总会出现\u6b22\u8fce\u63d0\u4ea4\u5fae\u535a\u641c\u7d22\u4f7f\u7528\u53cd\u9988\uff0c\u8bf7\u76f4\u63a5这个的字符,这是unicode编码,使用时有时候不会自动转换成中文就需要自己转换了使用下面的方法转换一下即可。 /** * unicode 转换成 中文 </div> </li> <li><a href="/article/1029.htm" title="一站式 Java Web 框架 firefly" target="_blank">一站式 Java Web 框架 firefly</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/Java+Web/1.htm">Java Web</a> <div>Firefly是一个高性能一站式Web框架。 涵盖了web开发的主要技术栈。 包含Template engine、IOC、MVC framework、HTTP Server、Common tools、Log、Json parser等模块。 firefly-2.0_07修复了模版压缩对javascript单行注释的影响,并新增了自定义错误页面功能。 更新日志: 增加自定义系统错误页面功能</div> </li> <li><a href="/article/1156.htm" title="设计模式——单例模式" target="_blank">设计模式——单例模式</a> <span class="text-muted">ayaoxinchao</span> <a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>定义          Java中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”   分析          从定义中可以看出单例的要点有三个:一是某个类只能有一个实例;二是必须自行创建这个实例;三是必须自行向系统提供这个实例。   &nb</div> </li> <li><a href="/article/1283.htm" title="Javascript 多浏览器兼容性问题及解决方案" target="_blank">Javascript 多浏览器兼容性问题及解决方案</a> <span class="text-muted">BigBird2012</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div>不论是网站应用还是学习js,大家很注重ie与firefox等浏览器的兼容性问题,毕竟这两中浏览器是占了绝大多数。 一、document.formName.item(”itemName”) 问题 问题说明:IE下,可以使用 document.formName.item(”itemName”) 或 document.formName.elements ["elementName&quo</div> </li> <li><a href="/article/1410.htm" title="JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误" target="_blank">JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/junit4.11/1.htm">junit4.11</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a> <div>        下载了最新的JUnit版本,是4.11,结果尝试使用发现总是报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing这样的错误,上网查了一下,一般的解决方案是,换一个低一点的版本就好了。还有人说,是缺少hamcrest的包。去官网看了一下,如下发现:    </div> </li> <li><a href="/article/1537.htm" title="[Zookeeper学习笔记之二]Zookeeper部署脚本" target="_blank">[Zookeeper学习笔记之二]Zookeeper部署脚本</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a> <div>Zookeeper伪分布式安装脚本(此脚本在一台机器上创建Zookeeper三个进程,即创建具有三个节点的Zookeeper集群。这个脚本和zookeeper的tar包放在同一个目录下,脚本中指定的名字是zookeeper的3.4.6版本,需要根据实际情况修改):   #!/bin/bash #!!!Change the name!!! #The zookeepe</div> </li> <li><a href="/article/1664.htm" title="【Spark八十】Spark RDD API二" target="_blank">【Spark八十】Spark RDD API二</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a> <div>coGroup package spark.examples.rddapi import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.SparkContext._ object CoGroupTest_05 { def main(args: Array[String]) { v</div> </li> <li><a href="/article/1791.htm" title="Linux中编译apache服务器modules文件夹缺少模块(.so)的问题" target="_blank">Linux中编译apache服务器modules文件夹缺少模块(.so)的问题</a> <span class="text-muted">ronin47</span> <a class="tag" taget="_blank" href="/search/modules/1.htm">modules</a> <div>在modules目录中只有httpd.exp,那些so文件呢? 我尝试在fedora core 3中安装apache 2. 当我解压了apache 2.0.54后使用configure工具并且加入了 --enable-so 或者 --enable-modules=so (两个我都试过了) 去make并且make install了。我希望在/apache2/modules/目录里有各种模块,</div> </li> <li><a href="/article/1918.htm" title="Java基础-克隆" target="_blank">Java基础-克隆</a> <span class="text-muted">BrokenDreams</span> <a class="tag" taget="_blank" href="/search/java%E5%9F%BA%E7%A1%80/1.htm">java基础</a> <div>        Java中怎么拷贝一个对象呢?可以通过调用这个对象类型的构造器构造一个新对象,然后将要拷贝对象的属性设置到新对象里面。Java中也有另一种不通过构造器来拷贝对象的方式,这种方式称为 克隆。         Java提供了java.lang.</div> </li> <li><a href="/article/2045.htm" title="读《研磨设计模式》-代码笔记-适配器模式-Adapter" target="_blank">读《研磨设计模式》-代码笔记-适配器模式-Adapter</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a> <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ package design.pattern; /* * 适配器模式解决的主要问题是,现有的方法接口与客户要求的方法接口不一致 * 可以这样想,我们要写这样一个类(Adapter): * 1.这个类要符合客户的要求 ---> 那显然要</div> </li> <li><a href="/article/2172.htm" title="HDR图像PS教程集锦&心得" target="_blank">HDR图像PS教程集锦&心得</a> <span class="text-muted">cherishLC</span> <a class="tag" taget="_blank" href="/search/PS/1.htm">PS</a> <div>HDR是指高动态范围的图像,主要原理为提高图像的局部对比度。 软件有photomatix和nik hdr efex。 一、教程 叶明在知乎上的回答: http://www.zhihu.com/question/27418267/answer/37317792 大意是修完后直方图最好是等值直方图,方法是HDR软件调一遍,再结合不透明度和蒙版细调。 二、心得 1、去除阴影部分的</div> </li> <li><a href="/article/2299.htm" title="maven-3.3.3 mvn archetype 列表" target="_blank">maven-3.3.3 mvn archetype 列表</a> <span class="text-muted">crabdave</span> <a class="tag" taget="_blank" href="/search/ArcheType/1.htm">ArcheType</a> <div>maven-3.3.3 mvn archetype 列表 可以参考最新的:http://repo1.maven.org/maven2/archetype-catalog.xml   [INFO] Scanning for projects... [INFO]                 </div> </li> <li><a href="/article/2426.htm" title="linux shell 中文件编码查看及转换方法" target="_blank">linux shell 中文件编码查看及转换方法</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/shell/1.htm">shell</a><a class="tag" taget="_blank" href="/search/%E4%B8%AD%E6%96%87%E4%B9%B1%E7%A0%81/1.htm">中文乱码</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E4%BB%B6%E7%BC%96%E7%A0%81/1.htm">文件编码</a> <div>一、查看文件编码。     在打开文件的时候输入:set fileencoding     即可显示文件编码格式。 二、文件编码转换     1、在Vim中直接进行转换文件编码,比如将一个文件转换成utf-8格式       &</div> </li> <li><a href="/article/2553.htm" title="MySQL--binlog日志恢复数据" target="_blank">MySQL--binlog日志恢复数据</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/binlog/1.htm">binlog</a> <div> 恢复数据的重要命令如下 mysql> flush logs; 默认的日志是mysql-bin.000001,现在刷新了重新开启一个就多了一个mysql-bin.000002                  </div> </li> <li><a href="/article/2680.htm" title="数据库中数据表数据迁移方法" target="_blank">数据库中数据表数据迁移方法</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>刚开始想想好像挺麻烦的,后来找到一种方法了,就SQL中的 INSERT 语句,不过内容是现从另外的表中查出来的,其实就是 MySQL中INSERT INTO SELECT的使用   下面看看如何使用   语法:MySQL中INSERT INTO SELECT的使用 1. 语法介绍       有三张表a、b、c,现在需要从表b</div> </li> <li><a href="/article/2807.htm" title="Java反转字符串" target="_blank">Java反转字符串</a> <span class="text-muted">dyy_gusi</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2/1.htm">反转字符串</a> <div>       前几天看见一篇文章,说使用Java能用几种方式反转一个字符串。首先要明白什么叫反转字符串,就是将一个字符串到过来啦,比如"倒过来念的是小狗"反转过来就是”狗小是的念来过倒“。接下来就把自己能想到的所有方式记录下来了。 1、第一个念头就是直接使用String类的反转方法,对不起,这样是不行的,因为Stri</div> </li> <li><a href="/article/2934.htm" title="UI设计中我们为什么需要设计动效" target="_blank">UI设计中我们为什么需要设计动效</a> <span class="text-muted">gcq511120594</span> <a class="tag" taget="_blank" href="/search/UI/1.htm">UI</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>随着国际大品牌苹果和谷歌的引领,最近越来越多的国内公司开始关注动效设计了,越来越多的团队已经意识到动效在产品用户体验中的重要性了,更多的UI设计师们也开始投身动效设计领域。 但是说到底,我们到底为什么需要动效设计?或者说我们到底需要什么样的动效?做动效设计也有段时间了,于是尝试用一些案例,从产品本身出发来说说我所思考的动效设计。 一、加强体验舒适度 嗯,就是让用户更加爽更加爽的用</div> </li> <li><a href="/article/3061.htm" title="JBOSS服务部署端口冲突问题" target="_blank">JBOSS服务部署端口冲突问题</a> <span class="text-muted">HogwartsRow</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/jboss/1.htm">jboss</a><a class="tag" taget="_blank" href="/search/server/1.htm">server</a><a class="tag" taget="_blank" href="/search/EJB3/1.htm">EJB3</a> <div>服务端口冲突问题的解决方法,一般修改如下三个文件中的部分端口就可以了。   1、jboss5/server/default/conf/bindingservice.beans/META-INF/bindings-jboss-beans.xml   2、./server/default/deploy/jbossweb.sar/server.xml   3、.</div> </li> <li><a href="/article/3188.htm" title="第三章 Redis/SSDB+Twemproxy安装与使用" target="_blank">第三章 Redis/SSDB+Twemproxy安装与使用</a> <span class="text-muted">jinnianshilongnian</span> <a class="tag" taget="_blank" href="/search/ssdb/1.htm">ssdb</a><a class="tag" taget="_blank" href="/search/reids/1.htm">reids</a><a class="tag" taget="_blank" href="/search/twemproxy/1.htm">twemproxy</a> <div>目前对于互联网公司不使用Redis的很少,Redis不仅仅可以作为key-value缓存,而且提供了丰富的数据结果如set、list、map等,可以实现很多复杂的功能;但是Redis本身主要用作内存缓存,不适合做持久化存储,因此目前有如SSDB、ARDB等,还有如京东的JIMDB,它们都支持Redis协议,可以支持Redis客户端直接访问;而这些持久化存储大多数使用了如LevelDB、RocksD</div> </li> <li><a href="/article/3315.htm" title="ZooKeeper原理及使用 " target="_blank">ZooKeeper原理及使用 </a> <span class="text-muted">liyonghui160com</span> <div>           ZooKeeper是Hadoop Ecosystem中非常重要的组件,它的主要功能是为分布式系统提供一致性协调(Coordination)服务,与之对应的Google的类似服务叫Chubby。今天这篇文章分为三个部分来介绍ZooKeeper,第一部分介绍ZooKeeper的基本原理,第二部分介绍ZooKeeper</div> </li> <li><a href="/article/3442.htm" title="程序员解决问题的60个策略" target="_blank">程序员解决问题的60个策略</a> <span class="text-muted">pda158</span> <a class="tag" taget="_blank" href="/search/%E6%A1%86%E6%9E%B6/1.htm">框架</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a> <div>根本的指导方针 1. 首先写代码的时候最好不要有缺陷。最好的修复方法就是让 bug 胎死腹中。 良好的单元测试 强制数据库约束 使用输入验证框架 避免未实现的“else”条件 在应用到主程序之前知道如何在孤立的情况下使用   日志 2. print 语句。往往额外输出个一两行将有助于隔离问题。 3. 切换至详细的日志记录。详细的日</div> </li> <li><a href="/article/3569.htm" title="Create the Google Play Account" target="_blank">Create the Google Play Account</a> <span class="text-muted">sillycat</span> <a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a> <div>Create the Google Play Account Having a Google account, pay 25$, then you get your google developer account. References: http://developer.android.com/distribute/googleplay/start.html https://p</div> </li> <li><a href="/article/3696.htm" title="JSP三大指令" target="_blank">JSP三大指令</a> <span class="text-muted">vikingwei</span> <a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a> <div>JSP三大指令   一个jsp页面中,可以有0~N个指令的定义! 1. page --> 最复杂:<%@page language="java" info="xxx"...%>   * pageEncoding和contentType:     > pageEncoding:它</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html><script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script>