Log4net入门(回滚日志文件篇)
2018-06-18 01:28:25来源:未知 阅读 ()
在上一篇Log4net(日志文件篇)中,我们使用“log4net.Appender.FileAppender”将日志信息输出到一个单一的文件中,随着应用程序的持续使用,该日志文件会越来越庞大,进而影响系统的性能。因此,有必要对日志文件按某种条件进行切分,要切分日志文件,我们可以使用“log4net.Appender.RollingFileAppender”输出源,使用该输出源我们可以按照文件大小或者日期对日志文件进行切分,下面我们分别描述之。
一、按文件大小切分日志文件
想要按文件大小切分日志文件只需要在Log4net.config配置文件中添加一个appender节点,然后在root节点中添加一个对新添加的appender节点的引用即可。Log4net.config的配置信息如下所示:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <configSections> 4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 5 </configSections> 6 7 <log4net> 8 <!-- 将日志输出到控制台 --> 9 <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 10 <layout type="log4net.Layout.PatternLayout"> 11 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 12 </layout> 13 </appender> 14 15 <!-- 将日志写到文件中 --> 16 <appender name="FileAppender" type="log4net.Appender.FileAppender"> 17 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径--> 18 <file value="Logs/FileAppender.log" /> 19 <!-- 将日志信息追加到已有的日志文件中--> 20 <appendToFile value="true" /> 21 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 22 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 23 24 <layout type="log4net.Layout.PatternLayout"> 25 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 26 </layout> 27 </appender> 28 29 <!-- 将日志以回滚文件的形式写到文件中 --> 30 <!-- 按文件大小切分日志文件 --> 31 <appender name="RollingFileAppenderBySize" type="log4net.Appender.RollingFileAppender"> 32 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径--> 33 <file value="Logs/RollingFileAppenderBySize.log" /> 34 <!-- 将日志信息追加到已有的日志文件中--> 35 <appendToFile value="true" /> 36 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 37 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 38 <!-- 指定按文件大小切分日志文件 --> 39 <rollingStyle value="Size" /> 40 <!-- 指定备份日志文件的最大切分数量,如果超过指定切分文件个数,日志将进行覆写 --> 41 <maxSizeRollBackups value="5" /> 42 <!-- 指定每个切分日志文件的大小 --> 43 <maximumFileSize value="1KB" /> 44 <!-- 指定每个切分文件具有相同的名字 --> 45 <!-- 日志文件进行切分后,每个日志文件的名字分别为:RollingFileAppenderBySize.log, RollingFileAppenderBySize.log.1, ..., RollingFileAppenderBySize.log.5 --> 46 <staticLogFileName value="true" /> 47 48 <layout type="log4net.Layout.PatternLayout"> 49 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 50 </layout> 51 </appender> 52 53 <root> 54 <!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF --> 55 <!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 --> 56 <!-- 如果没有定义LEVEL的值,则缺省为DEBUG --> 57 <level value="ALL" /> 58 <!-- 将日志输出到控制台 --> 59 <appender-ref ref="ConsoleAppender" /> 60 <!-- 将日志写到文件中 --> 61 <appender-ref ref="FileAppender" /> 62 <!-- 按文件大小切分日志文件 --> 63 <appender-ref ref="RollingFileAppenderBySize" /> 64 </root> 65 </log4net> 66 </configuration>
将上述配置文件保存,然后多次运行程序,生成的日志文件如下所示:
大家可能已经注意到了,一共有6个日志文件,其中有5个是备份文件,也就是说,如果我们设置“<maxSizeRollBackups value="5" />”,那么意思是我们将备份文件的数量设置为5。
二、按日期切分日志文件
想要按日期切分日志文件只需要在Log4net.config配置文件中添加一个appender节点,然后在root节点中添加一个对新添加的appender节点的引用即可。Log4net.config的配置信息如下所示:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <configSections> 4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 5 </configSections> 6 7 <log4net> 8 <!-- 将日志输出到控制台 --> 9 <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 10 <layout type="log4net.Layout.PatternLayout"> 11 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 12 </layout> 13 </appender> 14 15 <!-- 将日志写到文件中 --> 16 <appender name="FileAppender" type="log4net.Appender.FileAppender"> 17 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径--> 18 <file value="Logs/FileAppender.log" /> 19 <!-- 将日志信息追加到已有的日志文件中--> 20 <appendToFile value="true" /> 21 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 22 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 23 24 <layout type="log4net.Layout.PatternLayout"> 25 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 26 </layout> 27 </appender> 28 29 <!-- 将日志以回滚文件的形式写到文件中 --> 30 <!-- 按文件大小切分日志文件 --> 31 <appender name="RollingFileAppenderBySize" type="log4net.Appender.RollingFileAppender"> 32 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径--> 33 <file value="Logs/RollingFileAppenderBySize.log" /> 34 <!-- 将日志信息追加到已有的日志文件中--> 35 <appendToFile value="true" /> 36 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 37 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 38 <!-- 指定按文件大小切分日志文件 --> 39 <rollingStyle value="Size" /> 40 <!-- 指定备份日志文件的最大切分数量,如果超过指定切分文件个数,日志将进行覆写 --> 41 <maxSizeRollBackups value="5" /> 42 <!-- 指定每个切分日志文件的大小 --> 43 <maximumFileSize value="1KB" /> 44 <!-- 指定每个切分文件具有相同的名字 --> 45 <!-- 日志文件进行切分后,每个日志文件的名字分别为:RollingFileAppenderBySize.log, RollingFileAppenderBySize.log.1, ..., RollingFileAppenderBySize.log.5 --> 46 <staticLogFileName value="true" /> 47 48 <layout type="log4net.Layout.PatternLayout"> 49 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 50 </layout> 51 </appender> 52 53 <!-- 按日期切分日志文件 --> 54 <appender name="RollingFileAppenderByDate" type="log4net.Appender.RollingFileAppender"> 55 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径--> 56 <file value="Logs/RollingFileAppenderByDate.log" /> 57 <!-- 将日志信息追加到已有的日志文件中--> 58 <appendToFile value="true" /> 59 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 60 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 61 <!-- 指定按日期切分日志文件 --> 62 <rollingStyle value="Date" /> 63 <!-- 每分钟切分一个日志文件 --> 64 <!-- 每天切分一个日志文件的写法为:"yyyyMMdd" --> 65 <datePattern value="yyyyMMdd-HHmm" /> 66 <!-- 指定每个切分文件具有相同的名字 --> 67 <staticLogFileName value="true" /> 68 69 <layout type="log4net.Layout.PatternLayout"> 70 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 71 </layout> 72 </appender> 73 74 <root> 75 <!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF --> 76 <!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 --> 77 <!-- 如果没有定义LEVEL的值,则缺省为DEBUG --> 78 <level value="ALL" /> 79 <!-- 将日志输出到控制台 --> 80 <appender-ref ref="ConsoleAppender" /> 81 <!-- 将日志写到文件中 --> 82 <appender-ref ref="FileAppender" /> 83 <!-- 按文件大小切分日志文件 --> 84 <appender-ref ref="RollingFileAppenderBySize" /> 85 <!-- 按日期切分日志文件 --> 86 <appender-ref ref="RollingFileAppenderByDate" /> 87 </root> 88 </log4net> 89 </configuration>
每隔一分钟运行一次应用程序,生成的日志文件如下所示:
三、按日期切分日志文件,并以日期作为日志文件名
如果我们想以日期切分日志文件,并且以日期作为日志文件名,我们可以在Log4net.config配置文件中添加一个appender节点,然后在root节点中添加一个对新添加的appender节点的引用即可。Log4net.config的配置信息如下所示:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <configSections> 4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 5 </configSections> 6 7 <log4net> 8 <!-- 将日志输出到控制台 --> 9 <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 10 <layout type="log4net.Layout.PatternLayout"> 11 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 12 </layout> 13 </appender> 14 15 <!-- 将日志写到文件中 --> 16 <appender name="FileAppender" type="log4net.Appender.FileAppender"> 17 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径--> 18 <file value="Logs/FileAppender.log" /> 19 <!-- 将日志信息追加到已有的日志文件中--> 20 <appendToFile value="true" /> 21 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 22 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 23 24 <layout type="log4net.Layout.PatternLayout"> 25 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 26 </layout> 27 </appender> 28 29 <!-- 将日志以回滚文件的形式写到文件中 --> 30 <!-- 按文件大小切分日志文件 --> 31 <appender name="RollingFileAppenderBySize" type="log4net.Appender.RollingFileAppender"> 32 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径--> 33 <file value="Logs/RollingFileAppenderBySize.log" /> 34 <!-- 将日志信息追加到已有的日志文件中--> 35 <appendToFile value="true" /> 36 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 37 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 38 <!-- 指定按文件大小切分日志文件 --> 39 <rollingStyle value="Size" /> 40 <!-- 指定备份日志文件的最大切分数量,如果超过指定切分文件个数,日志将进行覆写 --> 41 <maxSizeRollBackups value="5" /> 42 <!-- 指定每个切分日志文件的大小 --> 43 <maximumFileSize value="1KB" /> 44 <!-- 指定每个切分文件具有相同的名字 --> 45 <!-- 日志文件进行切分后,每个日志文件的名字分别为:RollingFileAppenderBySize.log, RollingFileAppenderBySize.log.1, ..., RollingFileAppenderBySize.log.5 --> 46 <staticLogFileName value="true" /> 47 48 49 <layout type="log4net.Layout.PatternLayout"> 50 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 51 </layout> 52 </appender> 53 54 <!-- 按日期切分日志文件 --> 55 <appender name="RollingFileAppenderByDate" type="log4net.Appender.RollingFileAppender"> 56 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 --> 57 <file value="Logs/RollingFileAppenderByDate.log" /> 58 <!-- 将日志信息追加到已有的日志文件中--> 59 <appendToFile value="true" /> 60 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 61 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 62 <!-- 指定按日期切分日志文件 --> 63 <rollingStyle value="Date" /> 64 <!-- 每分钟切分一个日志文件 --> 65 <!-- 每天切分一个日志文件的写法为:"yyyyMMdd" --> 66 <datePattern value="yyyyMMdd-HHmm" /> 67 <!-- 指定每个切分文件具有相同的名字 --> 68 <staticLogFileName value="true" /> 69 70 <layout type="log4net.Layout.PatternLayout"> 71 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 72 </layout> 73 </appender> 74 75 <!-- 按日期切分日志文件,并将日期作为日志文件的名字 --> 76 <appender name="RollingFileAppenderNameByDate" type="log4net.Appender.RollingFileAppender"> 77 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 --> 78 <file value="Logs/" /> 79 <!-- 将日志信息追加到已有的日志文件中--> 80 <appendToFile value="true" /> 81 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 82 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 83 <!-- 指定按日期切分日志文件 --> 84 <rollingStyle value="Date" /> 85 <!-- 日志文件的命名规则 --> 86 <datePattern value=""Logs_"yyyyMMdd-HHmm".log"" /> 87 <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false --> 88 <staticLogFileName value="false" /> 89 90 <layout type="log4net.Layout.PatternLayout"> 91 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 92 </layout> 93 </appender> 94 95 <root> 96 <!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF --> 97 <!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 --> 98 <!-- 如果没有定义LEVEL的值,则缺省为DEBUG --> 99 <level value="ALL" /> 100 <!-- 将日志输出到控制台 --> 101 <appender-ref ref="ConsoleAppender" /> 102 <!-- 将日志写到文件中 --> 103 <appender-ref ref="FileAppender" /> 104 <!-- 按文件大小切分日志文件 --> 105 <appender-ref ref="RollingFileAppenderBySize" /> 106 <!-- 按日期切分日志文件 --> 107 <appender-ref ref="RollingFileAppenderByDate" /> 108 <!-- 按日期切分日志文件,并将日期作为日志文件的名字 --> 109 <appender-ref ref="RollingFileAppenderNameByDate" /> 110 </root> 111 </log4net> 112 </configuration>
多次运行应用程序,生成的日志如下所示:
四、既按大小又按日期切分日志文件
如果想既按大小又按日期切分日志文件,只需要将“rollingStyle”的值设置为“Composite”即可,具体配置文件如下所示:
1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 <configSections> 4 <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> 5 </configSections> 6 7 <log4net> 8 <!-- 将日志输出到控制台 --> 9 <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> 10 <layout type="log4net.Layout.PatternLayout"> 11 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 12 </layout> 13 </appender> 14 15 <!-- 将日志写到文件中 --> 16 <appender name="FileAppender" type="log4net.Appender.FileAppender"> 17 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 --> 18 <file value="Logs/FileAppender.log" /> 19 <!-- 将日志信息追加到已有的日志文件中--> 20 <appendToFile value="true" /> 21 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 22 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 23 24 <layout type="log4net.Layout.PatternLayout"> 25 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 26 </layout> 27 </appender> 28 29 <!-- 将日志以回滚文件的形式写到文件中 --> 30 <!-- 按文件大小切分日志文件 --> 31 <appender name="RollingFileAppenderBySize" type="log4net.Appender.RollingFileAppender"> 32 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 --> 33 <file value="Logs/RollingFileAppenderBySize.log" /> 34 <!-- 将日志信息追加到已有的日志文件中--> 35 <appendToFile value="true" /> 36 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 37 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 38 <!-- 指定按文件大小切分日志文件 --> 39 <rollingStyle value="Size" /> 40 <!-- 指定备份日志文件的最大切分数量,如果超过指定切分文件个数,日志将进行覆写 --> 41 <maxSizeRollBackups value="5" /> 42 <!-- 指定每个切分日志文件的大小 --> 43 <maximumFileSize value="1KB" /> 44 <!-- 指定每个切分文件具有相同的名字 --> 45 <!-- 日志文件进行切分后,每个日志文件的名字分别为:RollingFileAppenderBySize.log, RollingFileAppenderBySize.log.1, ..., RollingFileAppenderBySize.log.5 --> 46 <staticLogFileName value="true" /> 47 48 <layout type="log4net.Layout.PatternLayout"> 49 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 50 </layout> 51 </appender> 52 53 <!-- 按日期切分日志文件 --> 54 <appender name="RollingFileAppenderByDate" type="log4net.Appender.RollingFileAppender"> 55 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 --> 56 <file value="Logs/RollingFileAppenderByDate.log" /> 57 <!-- 将日志信息追加到已有的日志文件中--> 58 <appendToFile value="true" /> 59 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 60 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 61 <!-- 指定按日期切分日志文件 --> 62 <rollingStyle value="Date" /> 63 <!-- 每分钟切分一个日志文件 --> 64 <!-- 每天切分一个日志文件的写法为:"yyyyMMdd" --> 65 <datePattern value="yyyyMMdd-HHmm" /> 66 <!-- 指定每个切分文件具有相同的名字 --> 67 <staticLogFileName value="true" /> 68 69 <layout type="log4net.Layout.PatternLayout"> 70 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 71 </layout> 72 </appender> 73 74 <!-- 按日期切分日志文件,并将日期作为日志文件的名字 --> 75 <appender name="RollingFileAppenderNameByDate" type="log4net.Appender.RollingFileAppender"> 76 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 --> 77 <file value="Logs/" /> 78 <!-- 将日志信息追加到已有的日志文件中--> 79 <appendToFile value="true" /> 80 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 81 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 82 <!-- 指定按日期切分日志文件 --> 83 <rollingStyle value="Date" /> 84 <!-- 日志文件的命名规则 --> 85 <datePattern value=""Logs_"yyyyMMdd-HHmm".log"" /> 86 <!-- 当将日期作为日志文件的名字时,必须将staticLogFileName的值设置为false --> 87 <staticLogFileName value="false" /> 88 89 <layout type="log4net.Layout.PatternLayout"> 90 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 91 </layout> 92 </appender> 93 94 <!-- 既按大小又按日期切分日志文件 --> 95 <appender name="RollingFileAppenderBySizeAndDate" type="log4net.Appender.RollingFileAppender"> 96 <!-- 日志文件存放位置,可以为绝对路径也可以为相对路径 --> 97 <file value="Logs/RollingFileAppenderBySizeAndDate.log" /> 98 <!-- 将日志信息追加到已有的日志文件中--> 99 <appendToFile value="true" /> 100 <!-- 最小锁定模式,以允许多个进程可以写入同一个文件 --> 101 <lockingModel type="log4net.Appender.FileAppender+MinimalLock" /> 102 <!-- 指定既按大小又按日期切分日志文件 --> 103 <rollingStyle value="Composite" /> 104 <!-- 指定备份日志文件的最大切分数量,如果超过指定切分文件个数,日志将进行覆写 --> 105 <maxSizeRollBackups value="5" /> 106 <!-- 指定每个切分日志文件的大小 --> 107 <maximumFileSize value="1KB" /> 108 <!-- 每分钟切分一个日志文件 --> 109 <!-- 每天切分一个日志文件的写法为:"yyyyMMdd" --> 110 <datePattern value="yyyyMMdd-HHmm" /> 111 <!-- 指定每个切分文件具有相同的名字 --> 112 <staticLogFileName value="true" /> 113 114 <layout type="log4net.Layout.PatternLayout"> 115 <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" /> 116 </layout> 117 </appender> 118 119 <root> 120 <!-- 控制级别,由低到高:ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF --> 121 <!-- 比如定义级别为INFO,则INFO级别向下的级别,比如DEBUG日志将不会被记录 --> 122 <!-- 如果没有定义LEVEL的值,则缺省为DEBUG --> 123 <level value="ALL" /> 124 <!-- 将日志输出到控制台 --> 125 <appender-ref ref="ConsoleAppender" /> 126 <!-- 将日志写到文件中 --> 127 <appender-ref ref="FileAppender" /> 128 <!-- 按文件大小切分日志文件 --> 129 <appender-ref ref="RollingFileAppenderBySize" /> 130 <!-- 按日期切分日志文件 --> 131 <appender-ref ref="RollingFileAppenderByDate" /> 132 <!-- 按日期切分日志文件,并将日期作为日志文件的名字 --> 133 <appender-ref ref="RollingFileAppenderNameByDate" /> 134 <!-- 既按大小又按日期切分日志文件 --> 135 <appender-ref ref="RollingFileAppenderBySizeAndDate" /> 136 </root> 137 </log4net> 138 </configuration>
多次运行应用程序,生成的日志文件如下所示:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Window中的shellcode编写框架(入门篇) 2020-03-31
- 蓝桥杯练习(入门一) 2020-03-23
- c语言该怎么入门?C语言入门教程(非常详细) 2020-02-17
- 习题2-6:排列 2019-12-30
- C++入门到理解阶段二基础篇(9)——C++结构体 2019-11-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash