Windows 日志高级筛选实践

Windows 日志高级筛选实践

yoke88 关注 0人评论 3249人阅读 2018-11-22 11:08:06

背景

经常需要查看日志,不仅是用来排错,有些时候我还需要监控系统来抓取特定日志来帮助减少我的工作负担,以及时监控到异常出现,并作出通知及响应,那么从大量日志中快速并精确筛选出想要的日志,并且精确提取信息,是一个必备的技能。我曾经用内置的事件查看器的筛选器进行事件筛选,然后保存视图,或者使用powershell get-winevent 进行筛选,也使用logparser, 或者第三方的日志查看工具比如eventexplorer 进行日志筛选。但是总是遇到几个主要的问题:

  1. 从大量日志中过滤出极个别日志,每次执行的事件总是太长。

  2. 不能灵活的或者更精确的进行筛选。一般只能大概的匹配,然后再做一步处理。通常又遇到1的问题。

尝试和比较

经过一些尝试和使用,个人觉得powershell 的get-winevent 最方便,因为毕竟是一个脚本语言,可以进一步进行处理,而且可以很灵活的处理。logparser 很快,但是如果精确提取某些日志的字段,就没有那么容易了,windows 日志的EventData中的数据复杂多样,靠几个常规字段是没有办法灵活进行处理的。

论速度的话,除了logparser,使用xml 筛选是最快速的。但是xml 筛选需要使用复杂的、受限的xpath 1.0 (被微软实现后,有更多限制),虽然有点蹩脚又难懂,但是和时间节省算起,还是划的来的,特别是重复任务。

一个比较好的开始是从下面链接开始。

https://blogs.technet.microsoft.com/askds/2011/09/26/advanced-xml-filtering-in-the-windows-event-viewer/

正式实践

一个比较常用场景是,我经常需要精确过滤到哪个账号最近锁定了,哪台计算机锁定的,什么时候。我需要很快速的能查询到锁定日志。过去虽然我用get-winevent  –filterhashtable 可以做到这些,但是速度实在太慢了,虽然我的域控只有4台。我经常和用户说,如果你想知道你在哪台计算机上锁定了,请等待一段时间,我会把查询结果用邮件发给你。不过现在使用xpath 过滤时,我基本上可以在用户打电话过来时,告诉他这些信息。

下面XML 过滤AD安全日志中的最近一天的某个用户名的锁定日志

<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[EventID=4740 and TimeCreated[timediff(@SystemTime) &lt;= 86400000] and Provider[@Name='Microsoft-Windows-Security-Auditing']]]
and
*[EventData[Data[@Name='TargetUserName']='somebody']]
</Select>
</Query>
</QueryList>

如果你只想过滤最近一天所有用户的锁定日志,那么这样写

<QueryList>
<Query Id="0" Path="Security">
<Select Path="Security">
*[System[EventID=4740 and TimeCreated[timediff(@SystemTime) &lt;= 86400000] and Provider[@Name='Microsoft-Windows-Security-Auditing']]]
</Select>
</Query>
</QueryList>

上面过滤XML可以在 事件查看器的 筛选当前日志–》XML—》手动编辑查询中进行测验。

image

OK ,为了方便使用,我们做成一个powershell function ,方便日常使用,直接上例子。

function get-lockedEvent{     <#     .SYNOPSIS         Function to filter user locked event which id=4740     .DESCRIPTION         This function search user locked events in DC security logs, this function need the domain admin priv.     .EXAMPLE         get-lockedEvent -loginname oaoperator -show     .EXAMPLE         PS C:\> get-lockedEvent -loginname oaoperator -summary         Count Name         ----- ----         457 Oaoperator, OA     .EXAMPLE         PS C:\> get-lockedEvent -loginname oaoperator         Username   LockedPC Datetime           EventLocation         --------   -------- --------           -------------         Oaoperator OA       2018/9/27 10:27:40 dc02         Oaoperator OA       2018/9/27 10:32:40 dc02     #>          [cmdletbinding()]     param(         [parameter(Mandatory=$false)]         [string]         $loginname,         [Parameter(Mandatory=$false)]         [switch]         $summary,         [Parameter(Mandatory=$false)]         [switch]         $show     )
# filter Locked Events generated in 1 day and username eq loginname     $f2=@'     <QueryList>     <Query Id="0" Path="Security">       <Select Path="Security">       *[System[EventID=4740  and TimeCreated[timediff(@SystemTime) &lt;= 86400000] and Provider[@Name='Microsoft-Windows-Security-Auditing']]]        and        *[EventData[Data[@Name='TargetUserName']='{0}']]       </Select>     </Query>     </QueryList>
'@
# filter Locked Events generated in 1 day      $f1=@'     <QueryList>     <Query Id="0" Path="Security">       <Select Path="Security">       *[System[EventID=4740  and TimeCreated[timediff(@SystemTime) &lt;= 86400000] and Provider[@Name='Microsoft-Windows-Security-Auditing']]]       </Select>     </Query>     </QueryList>
'@     if($loginname){         $f=$f2 -f $loginname     }else{         $f=$f1     }     $DCs=Get-ADDomainController -Filter *|%{$_.hostname}     $r=Invoke-Command -ComputerName $DCs -ArgumentList @($f) -Command{         param(             $filter         )         $events=Get-WinEvent -FilterXml  $filter         $events|%{             $e=[xml]$_.toxml()             [PSCustomObject]@{                 'Username'=$e.Event.EventData.Data.where({$_.Name -eq 'TargetUserName'})."#text"                 'LockedPC'=$e.Event.EventData.Data.where({$_.Name -eq 'TargetDomainName'})."#text"                 'Datetime'=[datetime]$e.Event.System.TimeCreated.SystemTime                 'EventLocation'=$e.Event.System.Computer             }         }     }|Sort-Object -Property Datetime |select -Property 'UserName','LockedPC','Datetime','EventLocation'     if($summary){         $r=$r|Group-Object -Property Username,LockedPC -NoElement     }          if($show){         $r|Out-GridView     }else{         $r     }
}

另外一个实践

由于最近有一些计划任务的状态需要监控,而且考虑到这应该是一个非常通用的需求,所以我想过滤计划任务名称匹配\qq_ent 开头的,然后任务执行结果不为0的日志,尽管我参考着下面的一些blog 链接,也让我尝试了好一会,我想应该记录下这些过程。

我们先来看看计划任务日志的xml 内容:

<Event xmlns="https://schemas.microsoft.com/win/2004/08/events/event">
<System>
  <Provider Name="Microsoft-Windows-TaskScheduler" Guid="{DE7B24EA-73C8-4A09-985D-5BDADCFA9017}" /> 
  <EventID>201</EventID> 
  <Version>2</Version> 
  <Level>4</Level> 
  <Task>201</Task> 
  <Opcode>2</Opcode> 
  <Keywords>0x8000000000000000</Keywords> 
  <TimeCreated SystemTime="2018-11-18T05:00:02.058811400Z" /> 
  <EventRecordID>144817</EventRecordID> 
  <Correlation ActivityID="{110529FD-DBFD-4E59-B207-83DF8CC779B8}" /> 
  <Execution ProcessID="1508" ThreadID="24392" /> 
  <Channel>Microsoft-Windows-TaskScheduler/Operational</Channel> 
  <Computer>ComputerName.xxx.com</Computer> 
  <Security UserID="S-1-5-18" /> 
  </System>
<EventData Name="ActionSuccess">
  <Data Name="TaskName">\qq_ent\store_to_db</Data> 
  <Data Name="TaskInstanceId">{110529FD-DBFD-4E59-B207-83DF8CC779B8}</Data> 
  <Data Name="ActionName">C:\Users\UserName\AppData\Local\Programs\Python\Python37\python3.exe</Data> 
  <Data Name="ResultCode">2147942401</Data> 
  <Data Name="EnginePID">22172</Data> 
  </EventData>
  </Event>

说下我们的任务:

  1. 匹配 EventData 中Data 名称为TaskName的,它的值应该是\qq_ent\xxxx

  2. 匹配 EventData中 Data 名称为ResultCode的,它的值应该是>0 或者不等于0的

  3. EventID=201

  4. Provider Name=Microsoft-Windows-TaskScheduler

最后成型的过滤,和微软的之前的例子不一样。

 <QueryList>
    <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
      <Select Path="Microsoft-Windows-TaskScheduler/Operational">
      *[System/EventID=201]
       and 
      *[EventData[
                    (
                        Data[@Name='TaskName']='\qq_ent\download_images' 
                    or 
                        Data[@Name='TaskName']='\qq_ent\store_to_db_offline'
                    or 
                        Data[@Name='TaskName']=='\qq_ent\gatherQQmsg' 
                    or 
                        Data[@Name='TaskName']=='\qq_ent\store_to_db'
                    )
                    and
                        Data[@Name='ResultCode'] !=0
        ]]
      </Select>
    </Query>
    </QueryList>

我之前按照微软的例子是这样写的,结果不对的。

    <QueryList>
    <Query Id="0" Path="Microsoft-Windows-TaskScheduler/Operational">
      <Select Path="Microsoft-Windows-TaskScheduler/Operational">
      *[System/EventID=201]
       and 
      *[
            EventData[
                    (
                        Data[@Name='TaskName'] 
                        and 
                        (
                            Data='\qq_ent\download_images' 
                            or 
                            Data='\qq_ent\store_to_db_offline'
                            or 
                            Data='\qq_ent\gatherQQmsg' 
                            or 
                            Data='\qq_ent\store_to_db'
                        )
                    ) 
                    and
                    (
                        Data[@Name='ResultCode'] and Data !='0'
                    )
            ]
        ]
      </Select>
    </Query>
    </QueryList>

注意事项

  1. event log 中的Xpath 受限,能使用的函数有限,因此如果你想筛选字符串,你会发现starts-with contains 这些xpath 函数都不支持。尽量使用其他条件筛选,然后再使用powershell内置过滤功能进行过滤,当然这要牺牲一些处理时间。

  2. Xpath中的一些字符串要进行转义,比如你想比较一个数字,可能写Data>0,那么> 要转义成&gt;

参考资料

https://blogs.technet.microsoft.com/heyscriptingguy/2011/01/24/use-powershell-cmdlet-to-filter-event-log-for-easy-parsing/

https://blogs.technet.microsoft.com/heyscriptingguy/2014/06/04/data-mine-the-windows-event-log-by-using-powershell-and-xml/

https://blogs.technet.microsoft.com/heyscriptingguy/2014/06/03/use-filterhashtable-to-filter-event-log-with-powershell/

https://blogs.technet.microsoft.com/askds/2011/09/26/advanced-xml-filtering-in-the-windows-event-viewer/

©著作权归作者所有:来自51CTO博客作者yoke88的原创作品,如需转载,请注明出处,否则将追究法律责任

服务器 Windows Server

1

分享

收藏

上一篇:网络命令初步排错 下一篇:使用 Advanced Inst…

yoke88

54篇文章,31W+人气,17粉丝

关注

Ctrl+Enter 发布

发布

取消

推荐专栏更多

VMware vSAN中小企业应用案例

掌握VMware超融合技术
共41章 | 王春海
¥51.00 436人订阅

订   阅

带你玩转高可用

前百度高级工程师的架构高可用实战
共15章 | 曹林华
¥51.00 508人订阅

订   阅

负载均衡高手炼成记

高并发架构之路
共15章 | sery
¥51.00 577人订阅

订   阅

基于Kubernetes企业级容

86岁国宝级中医两次患癌,两次抗癌成功,一直在用此法

齐鲁壹点

发布时间:04-0811:41齐鲁晚报齐鲁壹点官方帐号

他是一代医宗,从医60余年,把中医领进太空:研制防治太空病中药“太空养心丸”,早在神五发射时,就采用中医方法为杨利伟调养身体。他义捐九世祖传秘方制成王氏保赤丸,造福了千家万户(以上内容据《中国中医药报》2009年6月22日第三版及《南通网》报道)……他是名扬天下的国医大师、王氏中医世家第19代传人王绵之。

王绵之教授

但大多数人都不知道,王老自己曾患过结肠癌、肺癌,但都被一一化解,康复得很好(据《老同志之友》2012年16期)。可能您会好奇,觉得王老一定有什么抗癌秘方吧?要说秘方,那还真有,而且非常简单!

盘腿一坐,养心抗癌

常年的养生实践和两次抗癌经历中,王老最喜欢一件事:打坐。他认为,打坐可以让人心无杂念,让大脑得以充分休息,是极好的养心方法;养好了心,在面对疾病甚至癌症时,就能心态平和地战胜疾病,“快乐是最好的抗癌药”。

王氏打坐法具体方法

1、坐姿不强求。坐于高椅、板凳自便,双腿交叉。最好于毯状物上盘腿而坐,五指张开,放于膝或大腿上。

2、全身处于微微绷紧中的放松状态,挺胸、展肩、收腰、收颌,头顶像放了一碗水或一本书的感觉。

3、双眼睁开,看所有的一切都逐渐进入广阔状态,刚开始不习惯,可先闭一会儿眼睛,再看自己的鼻尖,慢慢凝神后再抬眼。

4、深呼吸,即腹式呼吸,这是王老的养生窍门。此法简单易行:向外呼气时瘪肚子,向内吸气时鼓肚子,按照正常的呼吸频率即可。一边呼吸,一边进入大脑空白的状态,可以想象大海、森林等清新宜人的画面,帮助放松身心。他说这样可以将身体里的废气呼出去,然后再将新鲜的空气吸入体内,起到吐故纳新的作用。

5、刚开始打坐10-20分钟即可,当双腿和脚掌麻胀感增强,可将双腿收起后交叉,双手相交,抱膝而坐,深呼吸至双腿麻胀感消失后再起立。

6、如果盘腿的时候,发现自己根本静不下心来,而且腿也疼。那么,此时,您就可以定下心来,先找到腿疼的地方,如果是胆经,可以先顺着胆经揉一揉,等它不怎么疼了再盘。

没打坐的时候,可能不知道自己哪里不舒服,但是一打坐,就知道了自己哪里酸、哪里痛,应该从哪里开始疏通。揉着揉着,就会感觉到由痛变酸,由酸转正常的滋味了。您只要每天这样修复一点点,您的身体就会越来越强壮。

7、一定要每天坚持,打坐时觉得疼就干脆放弃了,或者今天练一下,明天就不练了,打坐也就失去了它的灵性。

抗癌国医的抗癌菜

除了打坐,王老还推荐了两种食物:打霜的茄子和苦瓜,夏天吃正好。

1

霜打茄子常入药

中药许多方剂中,就经常使用“霜打茄子”作为一味药。

茄子的全身:茄花、茄根、茄汁都是良药,古代就有秋茄根治疗肿瘤的记载。

现代医学也证明,茄子中所含有龙葵碱、葫芦素是具有抗癌能力的。茄子可以放心吃,抗癌,延寿。

提醒

在茄子的所有吃法中,拌茄泥是最健康的。

首先,拌茄泥加热时间最短,只需大火蒸熟即可,因此营养损失最少。其次,拌茄泥用油最少,蒸好茄子捣成泥后,只需稍微淋一些调味汁即可。最后,拌茄泥的吃法营养吸收最完全,因为它不用削去茄子皮,而茄子皮中含有大量的生物活性物质。

2

苦瓜:李时珍口中的“一等瓜”

由于味道苦涩,很多人不喜欢吃苦瓜,这是错误的!明代神医李时珍将它成为“一等瓜”。

西医证明:苦瓜中含有一种类奎宁蛋白的东西,能将癌细胞或其他不正常的细胞杀掉。

此外,苦瓜的种子中含有一种蛋白酶抑制剂,是可以抑制肿瘤细胞分泌蛋白酶,从而遏制癌细胞的扩散。

H3C S5720交换机系统文件丢失一直重启的解决办法

转载 weixin_33814685 最后发布于2017-08-23 14:09:55 阅读数 715 收藏

展开

一、故障描述:

    公司买了两台交换机H3C S5120,由于小兄弟没经验,把flash:给格式化了,交换机不停的在重启,无法进入系统。

二、解决思路:

    1.下载tftp软件。

    2.从另外一台交换机的flash中下载一份系统文件。

    3.装系统文件上传致故障交换机的flash中,重启交换机,故障解决。


三.详细配置过程如下:

1.下载tftp软件。

链接:https://pan.baidu.com/s/1qYqfsle 密码:751q

(1)把电脑本地网卡配置:

                  IP地址:10.10.10.2

                 子网掩码: 255.255.255.0   


(2)打开tftp软件:


    下载的软件目录data中已存有交换机的系统文件(s5720li-v200r010c00spc600.c)

    如果在遇到相同型号的设备,可省略第2步。直接上传到故障交换机即可。

2.从另外一台交换机的flash中下载一份系统文件(s5720li-v200r010c00spc600.cc)。

(1)查看另一台交换机flash:

<HUAWEI>dir

Directory of flash:/

  Idx  Attr     Size(Byte)  Date        Time       FileName

    0  drw-              –  Aug 23 2016 03:00:52   dhcp

    1  drw-              –  Aug 23 2016 03:00:24   user

    2  drw-              –  Aug 23 2016 03:01:03   logfile

    3  drw-              –  Aug 23 2016 03:00:12   $_install_mod

    4  -rw-            836  Aug 23 2016 03:04:07   rr.bak

    5  -rw-            836  Aug 23 2016 03:04:07   rr.dat

    6  -rw-             28  Aug 23 2016 03:03:55   private-data.txt

    7  drw-              –  Aug 23 2016 03:00:52   localuser

    8  -rw-     64,011,164  Dec 15 2016 17:51:28   s5720li-v200r010c00spc600.cc

(2)配置交换机VLAN1 IP为10.10.10.1:

    #interface Vlanif1

    #ip address 10.10.10.1 255.255.255.0

(3)从交换机下载系统文件:

<HUAWEI>tftp 10.10.10.2 put s5720li-v200r010c00spc600.cc

Info: Transfer file in binary mode.

Uploading the file to the remote TFTP server. Please wait…

100%    

TFTP: Uploading the file successfully.

64011164 byte(s) sent in 1435 second(s).

<HUAWEI>

3.将系统文件上传致故障交换机的flash中,重启交换机,故障解决。


(1)机器重启生出现下面界面按Ctrl + B

INIT: version 2.88 booting

Starting udev

Starting Bootlog daemon: bootlogd.

Populating dev cache

INIT: Entering runlevel: 3ge = 5

Stopping Bootlog daemon: bootlogd.

Wind River Linux 6.0.0.30 localhost console

localhost login: root (automatic login)

login[1922]: root login on ‘console’

Jan 23 2017, 19:21:20

mknod: /dev/mvPP: File exists

BootLoad version : 020a.0001

Backup U-Boot ……………………………………………………. done

Press Ctrl+B or Ctrl+E to enter BootLoad menu:  2

(2)进入下面启动菜单:


1)选择4

Enter your choice(1-8):

BootLoad Menu

     1. Boot with default mode

     2. Enter serial submenu

     3. Enter startup submenu

4. Enter ethernet submenu

     5. Enter filesystem submenu

     6. Enter password submenu

     7. Clear password for console user

     8. Reboot

    (Press Ctrl+E to enter diag menu)

Enter your choice(1-8): 4


2)选择4

        ETHERNET  SUBMENU

     1. Update BootROM system

     2. Download file to Flash through ethernet interface

     3. Upload Configuration file to Ftp through ethernet interface

4. Modify ethernet interface boot parameter

     5. Return to main menu

Enter your choice(1-5): 4

3)选择1,配置下载文件,指定交换机的IP,及tftp服务器也就是电脑的IP

        BOOTLINE  SUBMENU

1. Set TFTP protocol parameters

     2. Set FTP protocol parameters

     3. Return to ethernet menu

Enter your choice(1-3): 1

‘.’ = clear field;  ‘-‘ = go to previous field;  ‘Ctrl+D’ = quit

Load File name      : s5720li-v200r010c00spc600.cc

Switch IP address   : 10.10.10.1

Server IP address   : 10.10.10.2

Starting to write BOOTLINE into flash … done


4)选择3 返回

        BOOTLINE  SUBMENU

     1. Set TFTP protocol parameters

     2. Set FTP protocol parameters

3. Return to ethernet menu

Enter your choice(1-3): 3

5)选择2 下载文件到flash中

        ETHERNET  SUBMENU

     1. Update BootROM system

2. Download file to Flash through ethernet interface

     3. Upload Configuration file to Ftp through ethernet interface

     4. Modify ethernet interface boot parameter

     5. Return to main menu

Enter your choice(1-5): 2

Use tftp to download file : s5720li-v200r010c00spc600.cc , please wait for a moment.

……………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………………….

Download file successfully.


6)选择5 返回

        ETHERNET  SUBMENU

     1. Update BootROM system

     2. Download file to Flash through ethernet interface

     3. Upload Configuration file to Ftp through ethernet interface

     4. Modify ethernet interface boot parameter

5. Return to main menu

    Enter your choice(1-5): 5


6)选择1 设置默认启动模式

        BootLoad Menu

1. Boot with default mode

     2. Enter serial submenu

     3. Enter startup submenu

     4. Enter ethernet submenu

     5. Enter filesystem submenu

     6. Enter password submenu

     7. Clear password for console user

     8. Reboot

    (Press Ctrl+E to enter diag menu)

Enter your choice(1-8): 1

Now, the current startup file is flash:/s5720li-v200r010c00spc600.cc

Info: Check signature, please wait…………

System total memory is 0x15200000

Start to initialize the LSW …

Initializing the LSW ……………………………………………… done

Initializing netlink ……………………………………………… done

Initializing fast netlink …………………………………………. done

Backup BootLoad ………………………………………………….. done

Backup Kernel ……………………………………………………. done

Backup RamDisk …………………………………………………… done

Stack status : enable

ECM Stack status : run

Initializing FSP task begin …

Initializing DEV module …………………………………………… done

Initializing hardware system ………………………………………. done

Begin to start the system …

Registering IPC and VP callback to platform …………………………. done

Initializing VFS ………………………………. Done

Checking startup system-software …………………………………… done

Reading PAF file …………………………………………………. done

Initializing VOS monitor ……………………….. Done

CFM initialization advance ……………………… done

Initializing PAT ………………………………. Done

Initializing HA ……………………………….. done

VFS registering to HA ………………………….. Done

VRP root begin …

VRP root end

CFG initialization begin ……………………….. done

CFM initialization begin ……………………….. done

CLI initialization begin ……………………….. done

Registering VRP all link command begin …………… Done

Creating task begin …

Creating task end

Task initialization begin …

Task initialization end

ECMM status : run

Cmd registering begin …

Cmd registering end

Task awake begin …

Task awake end

Recover configuration begin …

Recover configuration end

Press ENTER to get started.

Login authentication

Username:admin

Password:

7)启动到输入用户名和密码的界面,证明交换机系统恢复完成。输入默认用户名和密码登录交换机:

用户名:admin

密码:admin@huawei.com

转载于:https://blog.51cto.com/fengyunshan911/1958631

让你的 Firefox 飞起来(Firefox超速绝密方法)

让你的 Firefox 飞起来(Firefox超速绝密方法)

分类: 系统运维

2010-04-23 12:03:29

首先,在URL栏输入“about:config”, 将打开一个参数的命令行清单,这就是我们以下进行编辑的第一步。
Firefox 加速技巧:修改参数- -让灵动的Firefox跑得更快 1.network.http.pipelining
在 Filter 中输入 network.http.pipelining,双击赋值为 true,默认为 false。如果没有找到这个键值,可以右键新建一个 Boolean,把她赋值为 true 就 OK 了。
还是像我在从前解释过的那样,激活这个键值之后,Pipelining同时发出成倍数的连接请求,从而达到提升连接速度的效果。网络上的大多数网站都是基于 HTTP 协议,而 HTTP1.1可以支持多线程的连接请求,通过这个操作可以减少Firefox载入网页的时间。不过并不是所有网页所在的服务器都支持这种操作,所以当你修改键值之后却看不到一点实际效果的时候,请不要对我破口大骂。
2.network.http.pipelining.maxrequests
在 Filter 中输入 network.http.pipelining.maxrequests,双击并赋值为 8,默认键值为 4。
3.network.http.proxy.pipelining
在 Filter 中输入 network.http.proxy.pipelining,双击并赋值为 true。
这两条优化的道理同上,这里就不再多解释了。
4.network.dns.disableIPv6
在 Filter 中输入 network.dns.disableIPv6,双击并赋值为 true。
IPv6 把 IP 地址由 32 位增加到 128 位,从而能够支持更大的地址空间,当用户在终端向一个IPv6-capableDNS服务器发送连接请求时,也许服务器端会错误的返回给用户一个 IPv4 地址。而 Firefox可以对这一切明察秋毫,不过在Firefox纠错的同时也必然会导致信号的延迟,所以这里我们把她赋值为 true,禁用掉她。
5.content.interrupt.parsing
右键新建 Boolean 值,键名为 content.interrupt.parsing,赋值 true。
默认这个键值并不存在。我们激活这个键值之后,当目标网页载入时,Firefox会根据一定频率打断解析的过程,不断的向用户反馈她所收集到的网页信息,有点像流媒体的意思。这时的 Firefox很聪明,不会一根筋的一直钻牛角。在下面的内容中我还会具体讲一下这个键值的魅力所在。
6.content.max.tokenizing.time
右键新建 Integer 值,键名为 content.max.tokenizing.time,赋值 2250000。
这个键值的作用其实就是指定一个循环事件的处理周期,这里的单位是微秒,要是我没有算错的话。理论上当我们将这个值取的越小,网页就会从视觉上载入的越流畅,因为Firefox会在很短的单位时间里反馈回解析到的网页信息。可是这样无疑延迟了网页整体载入的时间,所以在这里我们不妨将这个周期取的大一些,理论上可以加速网页的载入。
7.content.notify.interval
右键新建 Integer 值,键名为 content.notify.interval,赋值 750000。
载入一个网页其实也是一门很大的学问。让我们来放一个慢动作,我们姑且先把在终端第一次收到的网页信息很不专业的叫做预载入页面吧,这个页面有可能是不完整的图片或者文字,或者别的媒体文件。从我们第一次向远端主机发出连接请求到我们在终端收到这个预载入页面花费的时间,就是这里我们要定义的键值。理论上当我们将这个时间设置的很低时,肯定会更快的拿到所谓的预载入页面,可这是一种杀鸡取卵的做法,这样无形中反而增加了我们整体页面的载入时间。按照官方的说法,低于 100,000 将会降低 Firefox 的性能,那好吧,那我们把她彪到 750000 吧。
8.content.notify.ontimer
右键新建 Boolean 值,键名为 content.notify.ontimer,赋值 true。
为了使我们上面设置的 750000 微秒生效,还需要把这个键值激活。只有这两个键值配合,才会起作用。
9.content.notify.backoffcount
右键新建 Integer 值,键名为 content.notify.backoffcount,赋值 5。
这个键值控制Firefox的内置计数器在归零之前载入页面返回的次数。我们将目标网页分成好多个部分进行下载,每下载完一个部分,计数器归零一次。-1就是没有限制,值为0时这项功能被禁用。这里我们将她设置成5,当返回的次数达到五次而这部分网页还没有完全下载完时,那么剩下的没有下载完的网页内容将不会再按照我们预告设置的周期,像之前的五次那样一点一点的搬运回来,而是会一次性的下载完。也就是说在这个部分的网页下载过程中,Firefox 一共向我们反馈了 6次信息,前5次的时间间隔是我们在上面的键值中设置的周期 2250000微秒,而第6次也就是最后一次则没有时间限制,什么时候把剩下的下完了,什么时候反馈回来。
只有当我们在上面提到的 content.notify.ontimer 键值为 true 的时候,这里的设置才会生效。
10.content.switch.threshold
右键新建 Integer 值,键名为 content.switch.threshold ,赋值 750000,也就是四分之三秒。
在前面我们提到了一个键值content.interrupt.parsing,通过激活她实际上我们可以在载入页面的过程中跟Firefox产生互动,毕竟我们每一个人的心里都充满了爱。把 content.interrupt.parsing激活后当页面载入时Firefox会有两种操作模式:高频和低频中断模式。使用高频模式时,网页回馈的频率也很高,我们坐在显示器前看到的网页载入过程也会更加的平滑。低频时网页回馈的频率相对比较低,可是这时反而加快了网页载入的时间。当我们移动鼠标或者触击键盘时,高频模式被激活。在经过某一段时间我们没有碰鼠标和键盘,程序没有接到鼠标和键盘发出的任何指令时,Firefox就会自动进入低频模式工作,而这所谓的某一段时间,就是我们这里要指定的值。
11.nglayout.initialpaint.delay
右键新建 Integer 值,键名为 nglayout.initialpaint.delay,赋值 0。
这里实际上延迟了整个网页的显示速度,但是因为用户更喜欢在整个网页完全截入之前就开始阅读网页 (就像流媒体那样),所以在这里可以把值调为零,加速用户阅读网页的速度,有时候阅读速度和载入速度并不是成正比的。
在网络状况稳定的情况下这些优化的确是会起到一些效果的,并不光是心理作用,大家在为自己的浏览器提速时,也可以稍微参考一下。
备注:如果不是原版只需要修改前四项即可。