??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲性69影院在线观看,亚洲国产成人久久综合野外,亚洲日本国产综合高清http://www.tkk7.com/masen/category/20938.htmlzh-cnSat, 21 Mar 2015 14:04:20 GMTSat, 21 Mar 2015 14:04:20 GMT60slf4j_logback(?http://www.tkk7.com/masen/articles/423642.htmlMasenMasenThu, 19 Mar 2015 12:39:00 GMThttp://www.tkk7.com/masen/articles/423642.htmlhttp://www.tkk7.com/masen/comments/423642.htmlhttp://www.tkk7.com/masen/articles/423642.html#Feedback0http://www.tkk7.com/masen/comments/commentRss/423642.htmlhttp://www.tkk7.com/masen/services/trackbacks/423642.html阅读全文

Masen 2015-03-19 20:39 发表评论
]]>
slf4j(?http://www.tkk7.com/masen/articles/423618.htmlMasenMasenThu, 19 Mar 2015 06:12:00 GMThttp://www.tkk7.com/masen/articles/423618.htmlhttp://www.tkk7.com/masen/comments/423618.htmlhttp://www.tkk7.com/masen/articles/423618.html#Feedback0http://www.tkk7.com/masen/comments/commentRss/423618.htmlhttp://www.tkk7.com/masen/services/trackbacks/423618.htmlSlf4j 全称为Simple Logging Facade for JAVAQjava单日志门面?nbsp;是对不同日志框架提供的一个门面封装。可以在部v的时候不修改M配置卛_接入一U日志实现方案。和commons-loging 应该有一L初衷。个人感觉设从计上更好一些,没有commons 那么多潜规则。同时有两个额外特点Q?/span>

1. 能支持多个参敎ͼq过{} 占位W进行替换,避免老写logger.isXXXEnabled q种无奈的判断,带来性能提升见:http://www.slf4j.org/faq.html#logging_performance ?/span>

2.OSGI 机制更好兼容支持

一图胜千言Q官|上的一个图Q?/p>





  1. <dependency>  
  2.     <groupId>org.slf4j</groupId>  
  3.     <artifactId>slf4j-log4j12</artifactId>  
  4.     <version>1.7.2</version>  
  5. </dependency>  




Masen 2015-03-19 14:12 发表评论
]]>
常用输出格式 %c cd?/title><link>http://www.tkk7.com/masen/articles/202174.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Thu, 22 May 2008 07:05:00 GMT</pubDate><guid>http://www.tkk7.com/masen/articles/202174.html</guid><wfw:comment>http://www.tkk7.com/masen/comments/202174.html</wfw:comment><comments>http://www.tkk7.com/masen/articles/202174.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/masen/comments/commentRss/202174.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/masen/services/trackbacks/202174.html</trackback:ping><description><![CDATA[<div class="preobwr" id="art" style="margin: 15px" width="100%"> <p>常用输出格式</p> <p>%c   列出logger名字I间的全Uͼ如加上{<层数>}表示Z最内层v的指定层数的名字I间<br /> %X  按MDCQMapped Diagnostic Context,U程映射表)输出日志。通常用于多个客户端连接同一台服务器Q方便服务器区分是那个客L讉K留下来的日志?br /> %p  日志信息U别<br /> %d   %d{<日期格式>}:日志信息产生旉,使用ISO8601定义的日期格?br /> %C   日志信息所在地Q全限类名)<br /> %m   产生的日志具体信?br /> %n    输出日志信息换行<br /> %F 昄调用logger的源文g?br /> %l     输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数<br /> %L    昄调用logger的代码行<br /> %M   昄调用logger的方法名<br /> %r     昄从程序启动时到记录该条日志时已经l过的毫U数<br /> %t     输出产生该日志事件的U程?br /> %% 昄一?/p> <p><br /> <br /> <br /> 获取logger<br /> Logger.getRootLogger()  获取根logger<br /> Logger.getLogger(String name)获取子logger<br /> Logger.getLogger(Class clazz)?br /> Logger.getLogger(clazz.getName())</p> <p>讄日志U别(.setLevel(int,Exception))<br /> Level.ALL打开所有日?br /> Level.DEBUG 用于调试<br /> Level.INFO 用于q行q程<br /> Level.WARN 用于潜在的错?br /> Level.ERROR 用于错误事g<br /> Level.FATAL 用于严重错误旉<br /> Level.OFF 关闭所有日?/p> <p>输出端Appender(.addAppender(Appender).setAdditivity(boolean additive)是否覆盖)<br /> org.apache.log4j.ConsoleAppender  输出到控制台<br />  targer:<br />   ConsoleAppender.SYSTEM_OUT(Default)<br />   ConsoleAppender.SYSTEM_ERR<br />  public ConsoleAppender(Layout)<br />  public ConsoleAppender(Layout,String targer)<br /> org.apache.log4j.FileAppender   输出到文?br />  public FileAppender(Layout,String fileName)<br />  public FileAppender(Layout,String fileName,boolean append)是否覆盖<br /> org.apache.log4j.DailyRollingFileAppender 输出到文?每天一个新文g<br /> org.apache.log4j.RollingFileAppender  输出到文?自动新增改名<br />  public RollingFileAppender(Layout,String fileName)<br />  void setMaxBackupIndex(int index) 讄日志文g最大备份数<br />  void setMaximumFileSize(long size) 讄日志文g最大尺?br /> org.apache.log4j.WriterAppender  格式输出到L地方<br /> org.apache.log4j.JDBCAppender  输出到数据库</p> <p>日志格式?Layout)<br /> %c   cd?br /> %d   旉<br /> %f   cd<br /> %l   位置<br /> %m   信息<br /> %n   换行<br /> %p   U别<br /> %r   耗时<br /> %t   U程?/p> <p>public PatternLayout() 使用默认讄DEFAULT_CONVERSION_PATTERN 只打C?br /> public PatternLayout(String)使用自定义的pattern构造一个PatternLayout<br /> void setConversionPattern(String)  讄日志格式<br /> HTMLLayout<br /> SimpleLayout</p> <p><br /> 5.<br /> 1.BasicConfigurator.configure()<br />  PatternLayout p = new PatternLayout("%p [%t] %c (%F:%L) - %m%n");  <br />  ConsoleAppender a = new ConsoleAppender(p,ConsoleAppender.SYSTEM_OUT); <br />  root.addAppender(a);         <br />  rootLogger.setLevel(Level.DEBUG);       <br /> 2.PropertyConfigurator.configure("/help/example.properties")<br />   String resource = "/help/example.properties";<br />   URL configFileResource = Log4J.class.getResource(resource);<br />   PropertyConfigurator.configure(configFileResource);<br /> 3.DOMConfigurator.configure("/help/example.xml")<br /> xml declaration and dtd <br /> | <br /> log4j:configuration <br /> | <br /> +-- appender (name, class) <br /> | | <br /> | +-- param (name, value) <br /> | +-- layout (class) <br /> | | <br /> | +-- param (name, value) <br /> +-- logger (name, additivity) <br /> | | <br /> | +-- level (class, value) <br /> | | | <br /> | | +-- param (name, value) <br /> | +-- appender-ref (ref) <br /> +-- root <br /> | <br /> +-- param (name, class) <br /> +-- level <br /> | | <br /> | +-- param (name, value) <br /> +-- appender-ref (ref) </p> <p><br /> 0.log4j.properties模板<br /> log4j.rootLogger=info,CONSOLE,RFILE,FILE,DB      讄U别和三个输出端<br /> log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender     <br /> log4j.appender.CONSOLE.Target=System.out        控制台类?br /> log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout    <br /> log4j.appender.CONSOLE.layout.ConversionPattern= %4p [%t] (%F:%L) - %m%n </p> <p>log4j.appender.FILE=org.apache.log4j.FileAppender     <br /> log4j.appender.FILE.File=/help/my.properties       目标文g<br /> log4j.appender.FILE.Append=false        是否q加<br /> log4j.appender.FILE.layout=org.apache.log4j.PatternLayout     布局模式<br /> log4j.appender.FILE.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %c:%L - %m%n   格式化布局</p> <p>log4j.appender.RFILE=org.apache.log4j.RollingFileAppender     <br /> log4j.appender.RFILE.File=/help/my.properties       目标文g<br /> log4j.appender.RFILE.MaxFileSize=1KB        最大长?br /> log4j.appender.RFILE.MaxBackupIndex=3       最多备?br /> log4j.appender.RFILE.layout=org.apache.log4j.PatternLayout     布局模式<br /> log4j.appender.RFILE.layout.ConversionPattern=%d{yyyy-MM-dd hh:mm:ss}:%p %c:%L - %m%n   格式化布局</p> <p>log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender     <br /> log4j.appender.DB.URL=jdbc:oracle:thin:@127.0.0.1:1521:mumu     URL<br /> log4j.appender.DB.driver=oracle.jdbc.driver.OracleDriver     驱动<br /> log4j.appender.DB.user=liulibo         用户?br /> log4j.appender.DB.password=liulibo        密码<br /> log4j.appender.DB.layout=org.apache.log4j.PatternLayout     布局模式<br /> log4j.appender.DB.layout.ConversionPattern=insert into log4j(createdate,thread,level_,class,message) values(\'%d\',\'%t\',\'%-5p\',\'%c\',\'%m\')</p> <p>create table log4j(createdate varchar2(32),thread varchar2(32),level_ varchar2(32),class varchar2(32),message varchar2(32));<br />  <br /> 0.XML模板<br /> <?xml version="1.0" encoding="UTF-8" ?><br /> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"></p> <p><log4j:configuration><br />         <br />  <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender"><br />   <layout class="org.apache.log4j.PatternLayout"><br />    <param name="ConversionPattern" value="%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n"/><br />   </layout><br />  </appender><br />   <br />  <appender name="RollingFileAppender" class="org.apache.log4j.RollingFileAppender"><br />      <param name="Append" value="false"/><br />      <param name="MaxFileSize" value="1KB"/> <br />      <param name="File" value="dom/my.log"/> <br />      <param name="MaxBackupIndex" value="3"/> <br />      <layout class="org.apache.log4j.PatternLayout"><br />        <param name="ConversionPattern" value="%d{yyyy-MM-dd hh:mm:ss}:%p %t %c - %m%n"/><br />      </layout><br />  </appender><br />  <br />  <appender name="JDBCAppender" class="org.apache.log4j.jdbc.JDBCAppender"><br />      <param name="URL" value="jdbc:oracle:thin:@127.0.0.1:1521:mumu"/><br />      <param name="user" value="liulibo"/> <br />      <param name="password" value="liulibo"/> <br />      <param name="driver" value="oracle.jdbc.driver.OracleDriver"/><br />      <layout class="org.apache.log4j.PatternLayout"><br />        <param name="ConversionPattern" value="insert into log4j(createdate,thread,level_,class,message) values(\'%d\',\'%t\',\'%-5p\',\'%c\',\'%m\')"/><br />      </layout><br />  </appender><br />   <br />  <root><br />   <priority value ="debug" /><br />   <appender-ref ref="ConsoleAppender"/><br />   <appender-ref ref="RollingFileAppender"/><br />   <appender-ref ref="JDBCAppender"/><br />  </root></p> <p></log4j:configuration></p> <p>应用<br />  web.xml<br />   <context-param><br />    <param-name>props</param-name><br />    <param-value>/WEB-INF/log4j.properties</param-value><br />   </context-param><br />   <br />   <listener><br />    <listener-class>cart.listener.SCServletContextListener</listener-class><br />   </listener><br />  初始化方法中d<br />  private void initLog4j(ServletContext context){<br />    String prefix = context.getRealPath("/");<br />    System.out.println("prefix:"+prefix);<br />    String props = context.getInitParameter("props");<br />   if(props != null) {<br />    PropertyConfigurator.configure(prefix+props);<br />   }<br />   Logger logger = Logger.getLogger(SCServletContextListener.class); <br />    }</p> <div></div> </div> <img src ="http://www.tkk7.com/masen/aggbug/202174.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/masen/" target="_blank">Masen</a> 2008-05-22 15:05 <a href="http://www.tkk7.com/masen/articles/202174.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>有效地记录日志可以简化企业的开发过E?/title><link>http://www.tkk7.com/masen/articles/202117.html</link><dc:creator>Masen</dc:creator><author>Masen</author><pubDate>Thu, 22 May 2008 03:40:00 GMT</pubDate><guid>http://www.tkk7.com/masen/articles/202117.html</guid><wfw:comment>http://www.tkk7.com/masen/comments/202117.html</wfw:comment><comments>http://www.tkk7.com/masen/articles/202117.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/masen/comments/commentRss/202117.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/masen/services/trackbacks/202117.html</trackback:ping><description><![CDATA[<div id="kuluhru" class="center"> <h4>摘要:</h4> 如果您是一名开发h员,那您很可能就已经hq种l验Q您已经开发了一些代码以及一些测试用例。应用程序经q了严格?QA 试Q您信代码可以完全适合业务的需求。然而,在将应用E序最l交付终端用L手里Ӟ却会出现一些预想不到的问题。如果没有适当的日志消息,可能需要花费几天的旉来诊断这些问题。不q的是,大部分项目对于日志都没有一个清晰的{略。如果没有这U策略,pȝ产生的日志消息就有可能无益于问题的分析和解决。在本文中,我们讨Z业应用程序日志的各个斚w的问题?</div> <!-- end of summary line --> <div id="kriorjt" class="overflow" id="text">在企业的开发过E中Q我们不可避免地会碰到很多问题;如果您希望在开发过E的后期能够有效地捕?bugQ那需要一U有效的日志{略。但是在一个企业的应用E序中要惛_现有效地记录日志Q需要进行一番规划,q设计一些准则。在本文中,N Charles Chan 向您介l一些最好的实践Q从而帮助您从项目一开始就~写有用的日志代码?br /> <br /> 如果您是一名开发h员,那您很可能就已经hq种l验Q您已经开发了一些代码以及一些测试用例。应用程序经q了严格?QA 试Q您信代码可以完全适合业务的需求。然而,在将应用E序最l交付终端用L手里Ӟ却会出现一些预想不到的问题。如果没有适当的日志消息,可能需要花费几天的旉来诊断这些问题。不q的是,大部分项目对于日志都没有一个清晰的{略。如果没有这U策略,pȝ产生的日志消息就有可能无益于问题的分析和解决。在本文中,我们讨Z业应用程序日志的各个斚w的问题。您看C?Java™ q_上日?API 的概qͼ学习一些最好的~写日志代码的实践,q了解如果需要在产品环境中对详细日志重新q行排序Q应该如何处理?br /> <br /> <strong>选择日志 API</strong> <br /> <br /> 在?Java q_q行开发时Q可以用两个主要的日志 APIQApache Log4J ?Java Logging APIQ在 1.4 及更高版本的 Java q_中都提供了这两个 API。与 Java Logging API 相比QLog4J 更加成熟Q特性也更加丰富。这两个日志的实现都采用了一个类似的设计模式Q如?1 所C)。除非您的公叔R制要使用W三方的库,否则我强烈徏议?Log4J。如果您不能军_使用哪个 APIQ就可以使用 Apache Commons Logging APIQ它对底层的日志实现q行了封装。从理论上来_q样不用修改代码可以进行日志实现的切换。然而,实际上您很少会切换日志的实现Q因此,我不使用 Apache Commons Logging APIQ因为它的复杂性ƈ不没有给您带来其他特性?br /> <br /> <br /> <strong>日志概述</strong><br /> <br /> Log4J ?Java Logging API 都采用了cM的设计和使用模式Q如?1 和清?1 所C)。消息首先被创徏Q然后传递给一个具有特定优先权的日志对象。这些消息的目的和格式是p出处理程序及其布局所军_?br /> <br /> <br /> <br /> 清单 1. 日志对象的实例化和?br /> <br /> <pre class="overflow">import org.apache.log4j.Logger;<br /> <br /> public class MyClass {<br />   /*<br />    * Obtain a logger for a message category. In this case, the message category is<br />    * the fully qualified class name of MyClass.<br />    */<br />   private static final Logger logger = Logger.getLogger(MyClass.class.getName());<br />   ...<br />   public void myMethod() {<br />     ...<br />     if (logger.isDebugEnabled()) {<br />       logger.debug("Executing with parameters: " + param1 + ":" + param2);<br />     }<br />   }<br /> }</pre> <br /> <br /> <br /> 一个好的日志实C提供了很多不同的输出处理E序Q最常见的文件输出处理程序和l端输出处理E序。Log4J q提供了一些处理程序将消息发布C?JMS 主题中,或者将消息插入一个数据库表中。尽这~写一个定制的附加器ƈ不困难,但是~写和维护这U代码的M成本不应低估。消息的格式可以通过 Layout 对象q行配置。最常见?layout 对象?PatternLayoutQ它Ҏ所提供的模式对消息q行格式化?br /> <br /> 清单 2 l出了一?Log4J 的样例配|文Ӟ它负责配|?FileAppender。在q种配置中,com.ambrosesoft.log.MyClass cM的错误消息被发送给 FileAppenderQ后者将其写入一个名?log.txt 的文件中。这些消息是Ҏ与这个添加器相关?layoutQ在q种情况中是 PatternLayoutQ进行格式化的?br /> <br /> <br /> 清单 2. Log4J XML 配置样例文g<br /> <pre class="overflow"><?xml version="1.0" encoding="UTF-8" ?><br /> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><br /> <br /> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><br />         <br />   <appender name="fileAppender" class="org.apache.log4j.FileAppender"><br />     <param name="File" value="log.txt"/><br />     <param name="Append" value="true"/><br />     <layout class="org.apache.log4j.PatternLayout"><br />       <param name="ConversionPattern" value="%d [%t] %p - %m%n"/><br />     </layout><br />   </appender><br /> <br />   <category name="com.ambrosesoft.log.MyClass"><br />     <priority value="error"/><br />     <appender-ref ref="fileAppender"/><br />   </category><br /> <br />   <root><br />     <priority value="debug"/><br />     <appender-ref ref="fileAppender"/><br />   </root><br /> <br /> </log4j:configuration></pre> <br /> <br /> <br /> <strong>日志最佛_?/strong><br /> <br /> 关于日志Q您要做的一个最重要的选择可能是确定一U模式,每个日志消息分配给一个特定的 cd。常见的一U实跉|使用每个cȝ全名Q这些类的操作会被作Z个消息类别在日志中记录(正如我们在清?1 中看到的一PQ这是因可以让开发h员更l粒度地记录每个cȝ讄。然而,q只有在使用日志消息来跟t执行过E时才能良好地工作。在企业U的应用E序中,有很多其他类型的日志消息。D例来_一条日志消息可能是为安全顾问生的Q而另外一条日志消息则可能是会Z帮助q行性能调优而生的。如果这两条消息所x的是同一个类Q这样就会被分配l相同的cdQ这很隑֜日志输出l果中对其进行区分?br /> <br /> Z避免q个问题Q应用程序应该具有一l专用的日志记录E序Q它们都q行了独特的分类Q如清单 3 所C。每个日志记录程序都可以配置自己的优先和输出处理程序。例如,安全性日志记录程序可以在日志写入目的地之前Ҏ息进行加密。有时应用程序的设计者应该与使用日志的用P例如安全NQ一h商讨日志的输出格式,从而对q些消息q行更好的控制?br /> <br /> <br /> 清单 3. 专用的日志记录程?br /> <br /> <pre class="overflow">import org.apache.log4j.Logger;<br /> <br /> public interface Loggers {<br />   Logger performance = Logger.getLogger("performance");<br />   Logger security = Logger.getLogger("security");<br />   Logger business = Logger.getLogger("business");<br /> }<br /> ...<br /> public class MyClass {<br />   ....<br />   if (Loggers.security.isWarnEnabled()) {<br />     Loggers.security.warn("Access denied: Username [" + userName + "] ...");<br />   }<br />   ...<br /> }</pre> <br /> <br /> <br /> <strong>选择日志的?/strong><br /> <br /> 一?cd Q例?securityQ中的消息可以具有不同的 优先U。有些消息是Z调试而生的Q有些是Z警告而生的Q有些则是出现错误而生的。消息的不同优先U可以通过记录 U别 来生。最常用的日志别有Q?br /> <br /> Debug: q个U别的消息中包含了非常广泛的上下文信息。通常用于问题诊断?br /> <br /> Info: q些消息包含了一些有助于在品环境中Q粒度较_)帮助跟踪执行q程的上下文消息?br /> <br /> Warning: 警告消息Q说明系l中可能存在问题。例如,如果q个消息cd是有兛_全性方面的Q那么如果检到字典dQ就应该产生一条警告消息?br /> <br /> Error: 错误消息说明pȝ中出C严重的问题。这U问题通常都是不可恢复的,需要h工进行干预?br /> 标准?Java Logging API ?Apache Log4J 在此之外又提供了一些日志别。日志别的主要目标是帮助您qo有用信息中的噪声。ؓ了防止出C用错误的U别以及降低日志消息的效用的情况Q在开始编码之前,必须为开发h员提供一个清晰的指导斚w?br /> <br /> <strong>日志消息的格?/strong><br /> <br /> <span style="color: red">一旦选定日志记录E序q徏立v日志U别之后Q就可以开始构建日志消息了。在q样做时Q重要的是要包含可能多的上下文信息Q例如用h供的参数Q其他应用程序的状态信息。记录日志对象的一U方法是它们{换成 XML。第三方库,例如 XStreamQ请参阅 参考资料)可以自动?Java 对象转换?XML 。尽这是一U非常强大的机制Q但是我们必要考虑在速度与详l程度之间达CU^衡。除了典型的应用E序状态信息之外,q应该记录以下信息:<br /> <br /> U程 ID: 企业U的应用E序通常都是在多U程的环境中q行的。用线E?ID 信息Q您可以将多个h区分开来?br /> <br /> 调用E序的标? 调用E序的标识也是非帔R要的信息。由于不同的用户h不同的特权,它们的执行\径也可能会有很大的不同。将用户的标识放到日志消息中Q这对于对安全性敏感的应用E序是非常大的一个帮助?br /> <br /> 旉? 通常来说Q用户只能近似地知道问题发生的时间。如果没有时间戳Q就很难让别人来判断问题的原因所在?br /> <br /> 源代码信? q包括类名、方法名和行受除非您非常x安全性,否则我徏议您保留调试标记Q?gQ,即在编译品时也是如此。如果没有调试标讎ͼJava ~译器就会删除所有的行号信息Q从而极大地减少日志消息的可用性?<br /> 上面q些信息Q除了调用程序标识)都是由日志实现自动获取的。ؓ了将q些信息包含到消息中Q您只需要ؓ输出处理E序配置一个适当?layout 模式卛_。要捕获调用者的标识Q您可以利用 Log4J 中的诊断上下文特性(更多信息请参?参考资料)。诊断上下文让您可以上下文信息与当前正在运行的U程兌在一赗这些信息可以在行格式化的同时而包含到每条消息中?br /> <br /> ?J2EE Web 应用E序中,应用逻辑用h识保存到诊断上下文中最好的地方是在一?servlet qo器中。清?4 中显CZ要实现这U功能的必要代码。它使用?Log4J 1.3 alpha 中提供的映射诊断上下文类QMDCQ。您可以使用 Log4J 1.2 中提供的嵌套诊断上下文(NDCQ实现相同的功能。有?servlet qo器的更多通用信息Q请参阅 参考资?中的信息?br /> </span><br /> <br /> 清单 4. ?servlet qo器中使用诊断上下?br /> <br /> <pre class="overflow">import javax.servlet.Filter;<br /> ...<br /> import javax.servlet.http.HttpServletRequest;<br /> import javax.servlet.http.HttpSession;<br /> import org.apache.log4j.MDC;<br /> <br /> public class LoggerFilter implements Filter {<br />     <br />     public void doFilter(ServletRequest request, ServletResponse response,<br />             FilterChain chain) throws IOException, ServletException {<br />         <br />         // Retrieves the session object from the current request.<br />         HttpSession session = ((HttpServletRequest)request).getSession();<br />         <br />         // Put the username into the diagnostic context.<br />         // Use %X{username} in the layout pattern to include this information.<br />         MDC.put("username", session.getAttribute("username"));<br />         <br />         // Continue processing the rest of the filter chain.<br />         chain.doFilter(request, response);<br />         <br />         // Remove the username from the diagnostic context.<br />         MDC.remove("username");<br />     }<br />     ...<br /> }</pre> <br /> <br /> <br /> <strong>使用 AspectJ 跟踪执行情况</strong><br /> <br /> 在对问题q行诊断Ӟ通常跟踪E序的执行情况会很有帮助。您可以在程序执行的不同地方持箋发送日志消息吗Q例如方法的入口函数和出口函数。这是一个老问题,在出?AspectJ 之前一直都没有什么好的解x案。?AspectJQ可以在应用E序的不同地Ҏ行代码段。在 AspectJ 中,q些地方都称?point cutQ在 point cut 处所执行的代码称?advice。point cut 和advice 合称 aspect?br /> <br /> 关于 AspectJQ有一件事情非常神奇,aspect 不用很多努力可以应用到整个应用E序中。有?AspectJ 的更多信息,请参?参考资料。清?5 l出了一?AspectJ 源文件的例子Q它用来Ҏ法的入口和出口函数记录日志。在q个例子中,跟踪日志E序在每次q入或退?com.ambrosesoft 包的一个共有方法时都会记录一条日志?br /> <br /> <br /> 清单 5. 使用 AspectJ 记录Ҏ的入口和出口<br /> <br /> <pre class="overflow">import org.apache.log4j.Logger;<br /> import java.lang.reflect.Field;<br /> <br /> public aspect AutoTrace {<br /> <br />     private static final Logger logger = Logger.getLogger(AutoTrace.class);<br />     <br />     pointcut publicMethods() : execution(public * com.ambrosesoft..*(..));<br /> <br />     pointcut loggableCalls() : publicMethods();<br />     <br />     /**<br />      * Inspect the class and find its logger object. If none is found, use<br />      * the one defined here.<br />      */<br />     private Logger getLogger(org.aspectj.lang.JoinPoint joinPoint) {<br />         try {<br />             /*<br />              * Try to discover the logger object. <br />              * The logger object must be a static field called logger.<br />              */<br />             Class declaringType = joinPoint.getSignature().getDeclaringType();<br />             Field loggerField = declaringType.getField("logger");<br />             loggerField.setAccessible(true);<br />             return (Logger)loggerField.get(null);<br />         } catch(NoSuchFieldException e) {<br />             /*<br />              * Cannot find a logger object, use the internal one.<br />              */<br />             return logger;<br />         } catch(Exception e) {<br />             throw new RuntimeException(e);<br />         }<br />     }<br />     <br />     /**<br />      * An aspect to log method entry.<br />      */<br />     before() : loggableCalls(){<br />         getLogger(thisJoinPoint).debug("Entering.." + thisJoinPoint.getSignature().toString());<br />     }<br />       <br />     /**<br />      * An aspect to log method exit.<br />      */<br />     after() : loggableCalls(){<br />         getLogger(thisJoinPoint).debug("Exiting.." + thisJoinPoint.getSignature().toString());<br />     }<br /> } </pre> <br /> <br /> <br /> <strong>产品环境中的日志</strong><br /> <br /> 一旦应用程序处于品环境中之后Q您通常都需要关闭调试或信息日志消息Q从而对q行时的性能q行优化。然而,当有些不好的事情发生Ӟ您又不能在开发环境中重现q个问题Q那可能需要在产品环境中激z调试消息了。重要的是能够修Ҏ志的讄Q而不用关闭服务器。诊断品的问题即不用p数天来进行详l的调研Q通常也需要几个小时的旉。在q段旉之内Q开发h员需要激zL关闭应用E序不同范围的日志。如果每ơ修Ҏ志的讄之后都需要重新启动品应用程序,那么情况׃变得非常不可靠了?br /> <br /> q运的是QLog4J 提供了一U简单的机制来解册个问题。在 Log4J 1.2 中,DOMConfigurator 中的 configureAndWatch() Ҏ会对 Log4J q行配置Qƈ自动监视日志配置文g中的变化。这在清?6 中进行了阐述。(注意Q在 Log4J 1.3Q目前仍?alpha 版本Q?中ƈ不推荐?DOMConfiguratorQ它使用了一个更加灵zȝ实现 JoranConfigurator。)<br /> <br /> Z保 configureAndWatch() 是在 Log4J 初始化之前调用的Q您应该在启动类中调用它。不同的应用E序服务器采用了不同的机制来执行启动代码Q更多信息请参阅 参考资料)。详l信息请查看应用服务器的实现。有些应用服务器可能需要您?Log4J 的库攑ֈ服务器的 classpath 中。日志配|文件应该保存到一个需要日志的人可以访问的位置?br /> <br /> <br /> 清单 6. 使用 DOMConfigurator 配置 Log4J<br /> <br /> / <pre class="overflow">*<br /> * Configure Log4J library and periodically monitor log4j.xml for any update.<br /> */<br /> DOMConfigurator.configureAndWatch("/apps/config/log4j.xml");</pre> <br /> <br /> <br /> 如果您的日志配置文g不能方便地进行访问(例如您的产品环境是由一个不同的l织q行l护的)Q那么您必M用一U不同的{略。标准的Ҏ是?JMXQ它提供了一个标准的 API 来管理自q应用E序讄。在C JMX 兼容的服务器中,您可以用管?bean Q或 MBeans Q来扩展应用服务器的理l端的功能(更多有关使用 JMX 以及?WebSphere Application Server 6.0 中?JMX 的内容,请参?参考资?一节。)׃ JMX Ҏ非常复杂Q如果您的情况需要?JMXQ那应该只用作q个用途?br /> <br /> <strong>记录敏感的数?/strong><br /> <br /> 在记录品环境中的日志时Q除了技术方面的挑战之外Q还存在一些业务问题需要克服。例如,记录敏感的信息可能会引v安全性的问题。ƈ没有M限制可以防止您将某个用户的用户名和密码保存到正文文g中。您q必要保护其他敏感信息Q例?e-mail 地址、电话号码以及帐号信息。安全顾问和设计师有责Q要确保这些信息不会未加Q何处理就保存到日志中。对敏感信息使用安全性专用的日志E序可以帮助降低风险。您可以l这个日志程序配|一个专用的附加器,从而用一U加密的格式来保存消息,或者将其保存到一个安全的地方。然而,防止出现安全风险的最x法是在项目开始之前就讄适当的编码规范,q在查代码时强制施行q些规范?br /> <br /> <strong>从异怸提取有用信息</strong> <br /> <br /> 当发生一个非预期的异常时 —?例如Q如果数据库q接H然失效了,或者系l资源变得很低了 —?必d光当地进行处理,否则׃丢失有用的信息,q些信息在诊断问题时是非常有帮助的。首先,必须记录异常及其堆栈跟踪状况。其ơ,应该使用一U用L面友好的方式来标识错误页面,q对于终端用户和技术支持小l来说都是非常有帮助的?br /> <br /> 技术支持小l在接到一个技术支持电话时所面的一个挑战是在用h报告的问题与特定的日志异怹间徏立某U关联。非常有用的一U简单技术是为每个异帔R记录一个唯一?ID。这?ID 可以告诉用户Q也可以包含在终端用h填写的问题报告表单中。这样可以减技术支持团队成员猜的旉Q让他们可以快速对问题作出响应。考虑到可L的问题Q可以定期对 ID q行回收?br /> <br /> <strong>日志文g的管?/strong><br /> <br /> 一个非常繁忙的应用E序的日志文件可能会q速变得非常大。较大的日志文g很难使用Q这是因为它们需要过滤大量的噪声才能扑ֈ有用的信受Log 循环 是常见的一个可以帮助解册个问题的实践。日志@环会周期性地Ҏ日志q行归档Q这h消息可以总能写到一个相对较的文g中。日志消息降低了一些效用来提高速度Q您可能很少需要参考一周之前的日志消息。在 Log4J 1.2 中, DailyRollingFileAppender 附加器可以根据所提供的日期模式来循环使用日志文g。(?Log4J 1.3 中,已经对这个@环日志文仉加器重新q行了设计。现在您可以提供一U策略来控制如何q行循环了。例如, TimeBasedRollingPolicy 定义了一U基于时间和日期的@环模式。)清单 7 昄了让 Log4J 在每天午夜对自己的日志文件进行@环所采用的配|片断?<br /> <br /> <br /> 清单 7. 使用 DailyRollingFileAppender 循环使用日志文g<br /> <br /> <pre class="overflow"><?xml version="1.0" encoding="UTF-8" ?><br /> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><br /> <br /> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><br />         <br />   <appender name="fileAppender" class="org.apache.log4j.DailyRollingFileAppender"><br />     <param name="File" value="log.txt"/><br />     <param name="Append" value="true"/><br />     <param name="DatePattern" value="'.'yyyy-MM-dd"/><br />     <layout class="org.apache.log4j.PatternLayout"><br />       <param name="ConversionPattern" value="%d [%t] %p - %m%n"/><br />     </layout><br />   </appender><br /> ...<br /> </log4j:configuration></pre> <br /> <br /> <br /> <strong>集群环境中的日志</strong><br /> <br /> 现在有越来越多的企业U应用程序是在集环境或分布式环境中q行部v的。然而,集群环境中的日志需要更多规划,因ؓ消息都是从不同的源头生成的(通常是不同的机器Q。如果要对不同的机器记录日志Q那必dq些机器的时间戳q行同步Q否则日志消息的ơ序؜׃。对机器间时钟进行同步的一U简单方法是使用一个时间服务器。有两种Ҏ可以讄旉服务器。您可以指定一台内部的机器作ؓ旉服务器。然后其他机器就可以使用|络旉协议QNTPQ来与时间服务器的时间戳q行同步。另外,您可以?Internet 上提供的旉服务器(请参?参考资料)。在 AIX 上,xntpd 守护q程用来对不同机器的pȝ旉q行同步。当机器h相同的时间之后,可以对日志一赯行分析了?br /> <br /> 在集环境中搜集日志消息q面临着一些挑战。在q种环境中保存日志消息的一U简单方法是它们保存到L特定的日志文件中。当集群是?session affinity 配置Ӟq可以很好地工作 —?如果Ҏ个特定用户会话的h都要到同一个服务器上,q且 EJB 也都是部|在本地的。在q种配置中,集群中的机器所产生的日志文仉可以独立q行分析。如果不是这U情?—?换而言之,如果Ml定的请求都可以由多台机器进行处?—?那么对不同日志文件中的日志消息进行分析就会变得更加困难。在q种情况中,一U好的办法是使用pȝ理软g来管理日志消息,例如 IBM Tivoli&reg; 软gQ请参阅 参考资?中的链接Q。这UY件对所有的日志消息Q在pȝ理软g的术语中UC?事gQ提供了一个综合的视图Q从而便于管理员使用。系l管理Y件也可以Ҏ所接收到的事g的类型触发一些操作(例如发?e-mail 消息或传呼消息)?br /> <br /> <strong>l束?/strong> <br /> <br /> 在本文中Q我们介l了在规划日志策略时需要考虑哪些问题。正如在~程时所到的问题一P从一开始就采用一个经q详l考虑的规划要比在q行的同时规划更能节省工作量。良好的日志{略可以极大地帮助对问题q行诊断。最l,l端用户可以获得更好的应用程序,q能从技术支持团队获得迅速的响应?br /> 原址: http://www-128.ibm.com/developerworks/cn/java/j-logging/</div> <img src ="http://www.tkk7.com/masen/aggbug/202117.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/masen/" target="_blank">Masen</a> 2008-05-22 11:40 <a href="http://www.tkk7.com/masen/articles/202117.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>log4j注意事项http://www.tkk7.com/masen/articles/122945.htmlMasenMasenFri, 08 Jun 2007 14:09:00 GMThttp://www.tkk7.com/masen/articles/122945.htmlhttp://www.tkk7.com/masen/comments/122945.htmlhttp://www.tkk7.com/masen/articles/122945.html#Feedback0http://www.tkk7.com/masen/comments/commentRss/122945.htmlhttp://www.tkk7.com/masen/services/trackbacks/122945.html


一、ؓ多个目指定使用哪个log4j文g
情况一Q多个小目合成一个大目Q多个小目有自׃同的入口Q这个时候如果用同一个log4j文gQ各个项目的?br>Z混ؕ在一P如果拆分成多个小目Q看h又比较散不太好管理?br>情况二:一个项目实施在linux上,~写在windows?log4j的输出目?opt/xxx/web.log
q个时候开发者被q必d本机的workspace所在的目录加入一个opt/xxx/web.log的目录和文g
同时Q大多数情况下linux上的服务是不要输出log到ConsoleQ只要输出到文g
而windows大部份是只须要输出到consoleQ不要输出到文?br>本地调试的时候log4j的别多是debug ,而实际实施的时候多是之上的U别
造成要不停的修改log4j的属性文?cvs同步的时候不停的提示
也许你说可以整个目完成再来写log4j的属性文Ӟ但有的时候这个效果ƈ不好?br>因ؓq有q种时候,目完成Q包括logQ,反复试的这D|间?/p>

解决Q解军_法很单,建立一个log4j的配制文件的目录Q在q个目录下ؓ每个项目徏立一个目录,
每个目录下放着自己的log4j配制,然後把这些目录作为每个小工程的classpath的第一个,ok上边的问题就
解决了。这个时候可以写一个log4j攑֜src下,用来开发时候调试用Q而真正服务器上用的都在各自的文件夹?/p>

?为默写包Q某些类定义不同的log4jU别
是否惌q中需求呢Q一个项目调试的时候,希望其中默写包不打出log信息?br>比如struts的包Qspring的包Q还有你引用的别人已l开发好包,或者你自己写的c,但是你不想看到这?br>cȝlog信息.但是你须要调试当前的一些classQlogU别必须讄在debugU别
q个时候可以在log4j的属性文件中加入如下内容:
log4j.logger.包名orcd=高的U别
例如:
log4j.logger.org.springframework=error

三、注意事?br>   if (logger.isDebugEnabled()) {
4         logger.debug(getStr());
5     }



Masen 2007-06-08 22:09 发表评论
]]>
log4j配置相对路径实现日志记录(?http://www.tkk7.com/masen/articles/105955.htmlMasenMasenFri, 23 Mar 2007 11:22:00 GMThttp://www.tkk7.com/masen/articles/105955.htmlhttp://www.tkk7.com/masen/comments/105955.htmlhttp://www.tkk7.com/masen/articles/105955.html#Feedback0http://www.tkk7.com/masen/comments/commentRss/105955.htmlhttp://www.tkk7.com/masen/services/trackbacks/105955.html从网上简单搜索了一下,发现有三U介l的Ҏ。ȝ在这?br />1.

解决的办法自然是惛_法用相对路径代替l对路径Q其实log4j的FileAppender本n有q样的机Ӟ如:

log4j.appender.logfile.File=${WORKDIR}/logs/app.log

其中?{WORKDIR}/”是个变量,会被System Property中的“WORKDIR”的gѝ这P我们可以在log4j加蝲配置文g之前Q先用System.setProperty讄好根路径?/p>

?没有发现q个技巧之前,Z解决q个问题Q我曾自己扩展了log4j的RollingFileAppenderc,其他的FileAppender同样?理。扩展的ҎQ就是用一个子cd覆盖setFileҎQ这个方法在log4jd配置文g生成appender的时候调用,传入的就是配|文件中的\ 径,q样我就可以按照自己的想法在路径前面加上根\径了?br />

2.

可以使用环境变量
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=${catalina.base}/logs/logs_tomcat.log
log4j.appender.R.MaxFileSize=10KB






3.具体实现:

一般在我们开发项目过E中,log4j日志输出路径固定到某个文件夹,q样如果我换一个环?日志路径又需要重C?比较不方?目前我采用了动态改变日志\径方法来实现相对路径保存日志文g

(1).在项目启动时,装入初始化类: 
public class Log4jInit extends HttpServlet {
    static Logger logger = Logger.getLogger(Log4jInit.class);

    public Log4jInit() {
    }

    public void init(ServletConfig config) throws ServletException {
        String prefix = config.getServletContext().getRealPath("/");
        String file = config.getInitParameter("log4j");
        String filePath = prefix + file;
        Properties props = new Properties();
        try {
            FileInputStream istream = new FileInputStream(filePath);
            props.load(istream);
            istream.close();
            //toPrint(props.getProperty("log4j.appender.file.File"));
            String logFile = prefix + props.getProperty("log4j.appender.file.File");//讄路径
            props.setProperty("log4j.appender.file.File",logFile);
            PropertyConfigurator.configure(props);//装入log4j配置信息
        } catch (IOException e) {
            toPrint("Could not read configuration file [" + filePath + "].");
            toPrint("Ignoring configuration file [" + filePath + "].");
            return;
        }

    }

    public static void toPrint(String content) {
        System.out.println(content);
    }

}

(2).Web.xml中的配置

<servlet>
    <servlet-name>log4j-init</servlet-name>
    <servlet-class>Log4jInit</servlet-class>
    <init-param>
      <param-name>log4j</param-name>
      <param-value>WEB-INF/classes/log4j.properties</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

最后决?在项目中选择W二U比较方?/div>


Masen 2007-03-23 19:22 发表评论
]]>
[Log4j] 配置Log4jhttp://www.tkk7.com/masen/articles/105927.htmlMasenMasenFri, 23 Mar 2007 09:02:00 GMThttp://www.tkk7.com/masen/articles/105927.htmlhttp://www.tkk7.com/masen/comments/105927.htmlhttp://www.tkk7.com/masen/articles/105927.html#Feedback0http://www.tkk7.com/masen/comments/commentRss/105927.htmlhttp://www.tkk7.com/masen/services/trackbacks/105927.html

Log4J的配|文?Configuration File)是用来讄记录器的U别、存攑֙和布局的,它可接key=value格式的设|或xml格式的设|信息。通过配置Q可以创建出Log4J的运行环境?br />
1. 配置文g
Log4J配置文g的基本格式如下:

#配置根Logger
log4j.rootLogger 
=   [ level ]   ,  appenderName1 ,  appenderName2 ,
 ?br />
#配置日志信息输出目的地Appender
log4j.appender.appenderName 
=
 fully.qualified.name.of.appender.class 
  log4j.appender.appenderName.option1 
=
 value1 
  …?br />  log4j.appender.appenderName.optionN 
=
 valueN 

#配置日志信息的格式(布局Q?br />log4j.appender.appenderName.layout 
=
 fully.qualified.name.of.layout.class 
  log4j.appender.appenderName.layout.option1 
=
 value1 
  …?br />  log4j.appender.appenderName.layout.optionN 
=  valueN 

其中 [level] 是日志输出别,共有5U:
FATAL      0  
ERROR     
3
 
WARN      
4
 
INFO      
6
 
DEBUG     
7


Appender
为日志输出目的地QLog4j提供的appender有以下几U:
org.apache.log4j.ConsoleAppenderQ控制台Q,
org.apache.log4j.FileAppenderQ文ӞQ?br />org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?br />org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?br />org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)

LayoutQ日志输出格式,Log4j提供的layout有以下几U:
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)

打印参数: Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q如?
  %m   输出代码中指定的消息
  %p   输出优先U,即DEBUGQINFOQWARNQERRORQFATAL 
  %r   输出自应用启动到输出该log信息耗费的毫U数 
  %c   输出所属的cȝQ通常是所在类的全名?br />  %t   输出产生该日志事件的U程名?br />  %n   输出一个回车换行符QWindowsq_为“\r\n”,Unixq_为“\n”?br />  %d   输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss
, SSS}Q输出类|2002q?0?8日?/span> 22 Q?/span> 10 Q?/span> 28 Q?/span> 921
 
  %l   输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数。D例:Testlog4.main(TestLog4.java:
10

2. 在代码中初始化Logger:
1Q在E序中调?strong>BasicConfigurator.configure()ҎQ给根记录器增加一个ConsoleAppenderQ输出格式通过PatternLayout设ؓ"%-4r [%t] %-5p %c %x - %m%n"Q还有根记录器的默认U别?strong>Level.DEBUG.
2Q配|放在文仉Q通过命o行参C递文件名字,通过PropertyConfigurator.configure(args[x])解析q|;
3Q配|放在文仉Q通过环境变量传递文件名{信息,利用log4j默认的初始化q程解析q|;
4Q配|放在文仉Q通过应用服务器配|传递文件名{信息,利用一个特D的servlet来完成配|?br />
3. Z同的 Appender 讄日志输出U别Q?/strong>
当调试系l时Q我们往往注意的只是异常别的日志输出Q但是通常所有别的输出都是攑֜一个文仉的,如果日志输出的别是BUGQ?那就慢慢L吧?br />q时我们也许会想要是能把异常信息单独输出C个文仉该多好啊。当然可以,Log4j已经提供了这L功能Q我们只需要在配置中修?strong>Appender
?font color="#990000">Threshold
p实现,比如下面的例子:

[配置文g]

### set log levels ###
log4j.rootLogger = info,stdout,D ,E


log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = %d{ABSOLUTE} %5p %c{1}:%L - %m%n


log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern =%-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

 

log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File = logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n


[代码中用]
public   class  TestLog4j  {
    
public   static   void  main(String[] args) 
{
        PropertyConfigurator.configure(
" D:/Code/conf/log4j.properties "
);
        Logger logger 
=  Logger.getLogger(TestLog4j. class
);
        logger.debug(
" debug "
);
        logger.error(
" error "
);
    }

}

q行一下,看看异常信息是不是保存在了一个单独的文gerror.log中?/font>

Masen 2007-03-23 17:02 发表评论
]]>
Log4J 最佛_践之全能配置文g(转)http://www.tkk7.com/masen/articles/105923.htmlMasenMasenFri, 23 Mar 2007 08:52:00 GMThttp://www.tkk7.com/masen/articles/105923.htmlhttp://www.tkk7.com/masen/comments/105923.htmlhttp://www.tkk7.com/masen/articles/105923.html#Feedback0http://www.tkk7.com/masen/comments/commentRss/105923.htmlhttp://www.tkk7.com/masen/services/trackbacks/105923.html

LOG4J的配|之单它遍及于来多的应用中了:Log4J配置文g实现了输出到控制台、文件、回滚文件、发送日志邮件、输出到数据库日志表、自定义标签{全套功能。择其一二用就够用了,



log4j.rootLogger=DEBUG,CONSOLE,A1,im
log4j.addivity.org.apache=true



# 应用于控制台

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n


#应用于文?

log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
# Use this layout for LogFactor 5 analysis



# 应用于文件回?

log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


#应用于socket
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n


# Log Factor 5 Appender
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000



# 发送日志给邮g

log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=web@www.wuset.com
log4j.appender.MAIL.SMTPHost=www.wusetu.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=web@www.wusetu.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n



# 用于数据?
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES ('[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n')
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n


log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j'
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout

#自定义Appender

log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender

log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net

log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

Masen 2007-03-23 16:52 发表评论
]]>
վ֩ģ壺 һѸ߹ۿ| 337pŷ޴| Ʒһ| Ůվ߹ۿƵѵ| ޹AV߲| ޳ѵӰ| AVþþƷݺݰ˳| ŷ޹ۺ߹ۿ | ɫ͵͵͵³ۺ| ִִֻˬƵ| պ޹Ƶ| պƷרѲ| ëƬ߹ۿ| ձ18| һƬѿ| Ʒۺһ߹ۿ| ޾Ʒ| AVһţţ| ¶ѿ| ޻ɫ߲| һ| ɫ߹ۿ| 99þþƷ| ҹƷþþþþ| һ| ۺϾƷ㽶þ97| ۺϳ߹ۿ| þþƷAV鶹վ | ˵Ӱѹۿ| aëƬѿ| ߹ۿƵһ| ɫtvվѿ| ҹѸþӰԺ| 97Ƶ| ѹۿ˵ŮƵ| þþþþþõѲ | ڳ߿| ˾Ʒձ11| ձɫվwwwþ| Ļþ| 337pձŷ޴|