<lognet> <root> <level value=ALL /> <appenderref ref=rollingFile /> </root> <appender name=rollingFile type=lognetAppenderRollingFileAppenderlognet > <param name=File value=logtxt /> <param name=AppendToFile value=false /> <param name=RollingStyle value=Date /> <param name=DatePattern value=yyyyMMdd /> <param name=StaticLogFileName value=true /> <layout type=lognetLayoutPatternLayoutlognet> <param name=ConversionPattern value=%d [%t] %p %c %m%n /> <param name=Header value= header /> <param name=Footer value= footer /> </layout> </appender> <appender name=consoleApp type=lognetAppenderConsoleAppenderlognet> <layout type=lognetLayoutPatternLayoutlognet> <param name=ConversionPattern value=%d [%t] %p %c %m%n /> </layout> </appender> <logger name=LogNetTestLogTest> <level value=DEBUG /> <appenderref ref=rollingFile /> <appenderref ref=coloredConsoleApp /> <appenderref ref=SystemEvent /> </logger> </lognet> lognet配置节的XSD层次如下 <lognet> <root><level /><appenderref ref= /></root> <appender name= type=Appender的完全限定类名> <param name= value= /> <layout type=lognetLayoutPatternLayoutlognet> <param name= value= /> </layout> </appender> <logger> <level value= /> <appenderref ref= /> </logger> lognet是lognet配置节的根标记 root标记定义一个根级别的记录者lognet的记录者采用层级组织的 每一个LOGGER(ROOT也是一个LOGGER只不过他是祖先而已别的方面跟其他LOGGER一样)都可以定义Level level定义记录的日志级别就是说你要记录哪个级别以上的日志级别由高往低依次是: None Fatal ERROR WARN DEBUG INFO ALL 级别的定义要注意如果你定义DEBUG那么低于DEBUG级别以下的信息将不会记入日志啥意思呢?就是说就算你在程序里用()来写入一个日志信息可是你在配置中指定level为DEBUG由于INFO级别低于DEBUG所以不会被记入日志这样的处理非常灵活 Logger还有一个配置就是appenderref了ref是参照的意思lognet的架构非常有意思可扩展性非常高非常值得借鑒他分为四个要素: logger appender layout filter logger是负责日志的记录者 appender提供记录的介质 layout负责把记入的内容格式化 filter负责把内容进行筛选 可以说整个过程就是一个日志流水线每个成员负责其中的一个环节 logger发出记录信息appender接到信息根据内部的layout配置对记录信息格式化根据filter决定此信息是否被过滤掉最后将其序列化 因此logger的appenderref就是定义说LOGGER要找谁去将内容写入磁盘流或其他介质因此十分重要吧 既然是ref引用那肯定要定义这个被引用的appender对象了呀 每个appender都代表了一个输出介质 name属性指定其名称type则是lognetAppender命名空间的一个类的名称意思是指定使用哪种介质 lognet支持的appender类型有十几种最常用的有rollingFileAppenderAdoNetAppenderEventLogAppenderFileAppender分别把日志记入文件系统日志和数据库 除此之外appender内的其他参数都用param标记以key/value形式定义于其内 这里有个小提示每一个appenderlognet并没有在文档中提出他们需要哪些参数那么我们怎么知道呢? 原来这些param的名称你可以直接查对应的appender类的属性名即可例如使用EventLogAppender时通过查看类的属性我们知道其有 LogNameApplicationName属性那么意味着你可以直接在这个APPENDER的param里加入以下内容: <param name=LogName value=Application /> <param name=ApplicationName value=lognetTest /> 定义了appender的NAME及TYPE属性以及使用param为其指定参数后一个appender就建立了你可以使用他的名字在LOGGER的<appenderref中去 引用它那么引用它的LOGGER在写入日志时就是写到了APPENDER中定义的介质中去了 一个LOGGER可以引用多个APPENDER其结果是同一个日志被同时记录到多个介质中去 便如同时发邮件写入系统日志发送到远程主机不过虽然可以这样做但是还是要小心因为会对性能有一定的影响除非你需要否则不要乱用此功能 另外appender中可以定义可选的layout layout的定义非常有必要如果你不想将来看到你的日志会感觉头晕的话虽然lognet帮你写入日志但是日志信息的格式却是我们使用者自行定义的layout的type参数指定使用哪个类的定义来格式化常用的有XmlLayoutSimpleLayoutPatternLayout这个当然要根据你的需要以及你要产生的格式来选啦如果你要输出成XML文档格式你肯定不能用simplelayout吧 layout使用param以KEY/VALUE形式定义其参数 各个Layout类使用的参数当然不一样啦具体的你可以去看各个Layout类的属性 其中PatternLayout可以使用ConversionPattern参数来指定一个格式化字符串 以及可以指定一个Header参数做为日志开头的字符串Footer来指定结尾字符串 这里有一个小技巧日志中开头和结尾总想产生回车符吧虽然logger在写入一条日志会自动回车可是Header和FOOTER却不会咋办?用\n\r吗?(我从别人的BLOG上看到过)经实践\n\r会原样定改日志根本不会转换其实我们可以用XML实体呀使用&#;&#;就可以在指定位置插入一个回车换行符了 最后像lognet的文档中说的那样如果你不想你的日志文件变得很大使读写的性能下降的话建议你还是分级管理日志把粒度变小点也就是说除了定义ROOT外最后对每一个模块或每一个实体依据用途目的定义各自的LOGGER配置这样的好处是日志被分散了日志文件增长就没那么快了每一个LOGGER的结构跟ROOT是一模一样的这里不再叙述了像前面说的那样如果你相让日志产生层级关系你可以跟他们的NAME属性像C#中的namespace那样命名就可以了 要说明的是LOGGER的定义是非必须的只是一种建议罢了Lognet的配置中除了必须定义一个ROOT和一个APPENDER外其他的都是可选的 另一种配置lognet的方法是在单独的XML文件中配置这个时候只要把lognet标记中的内容复制过来就行了不需要configSections |