`

log4j的配置文件介绍(一)

 
阅读更多

 

  1. 本文主要解释log4j的配置文件各个配置项的含义,内容是从网上转载的

  2. 1章. Log4j 的优点  
  3.  
  4. Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。  
  5. log4j的好处在于:  
  6. 1) 通过修改配置文件,就可以决定log信息的目的地——控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等  
  7. 2) 通过修改配置文件,可以定义每一条日志信息的级别,从而控制是否输出。在系统开发阶段可以打印详细的log信息以跟踪系统运行情况,而在系统稳定后可以关闭log输出,从而在能跟踪系统运行情况的同时,又减少了垃圾代码(System.out.println(......)等)。  
  8. 3) 使用log4j,需要整个系统有一个统一的log机制,有利于系统的规划。  
  9.   
  10. 2章. 配置文件  
  11.   
  12.   
  13. Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。日志信息的优先级从高到低有FATAL、ERROR、WARN、INFO、DEBUG,分别用来指定这条日志信息的重要程度;日志信息的输出目的地指定了日志将打印到控制台还是文件中;而输出格式则控制了日志信息的显示内容。  
  14.   
  15. 2.1. 日志信息的优先级  
  16.   
  17. 分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的级别。  
  18. Log4j建议只使用四个级别,优先级从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的级别,您可以控制到应用程序中相应级别的日志信息的开关。 假如在一个级别为q的Logger中发生一个级别为p的日志请求,如果p>=q,那么请求将被启用。这是Log4j的核心原则。 比如在这里定义了INFO级别,则应用程序中所有DEBUG级别的日志信息将不被打印出来;  
  19.   
  20. 2.2. 输出源的使用  
  21.   
  22. 有选择的能用或者禁用日志请求仅仅是Log4j的一部分功能。Log4j允许日志请求被输出到多个输出源。用Log4j的话说,一个输出源被称做一个Appender。  
  23. Appender包括console(控制台), files(文件), GUI components(图形的组件), remote socket servers(socket 服务), JMS(java信息服务), NT Event Loggers(NT的事件日志), and remote UNIX Syslog daemons(远程UNIX的后台日志服务)。它也可以做到异步记录。 一个logger可以设置超过一个的appender。 用addAppender 方法添加一个appender到一个给定的logger。对于一个给定的logger它每个生效的日志请求都被转发到该logger所有的appender上和该logger的父辈logger的appender上。  
  24.   
  25. 2.2.1. ConsoleAppender  
  26.   
  27. 如果使用ConsoleAppender,那么log信息将写到Console。效果等同于直接把信息打印到System.out上了。  
  28.   
  29. 2.2.2. FileAppender  
  30.   
  31. 使用FileAppender,那么log信息将写到指定的文件中。这应该是比较经常使用到的情况。 相应地,在配置文件中应该指定log输出的文件名。如下配置指定了log文件名为dglog.txt  
  32. log4j.appender.A2.File=dglog.txt 注意将A2替换为具体配置中Appender的别名。  
  33.   
  34. 2.2.3. DailyRollingAppender  
  35.   
  36. 使用FileAppender可以将log信息输出到文件中,但是如果文件太大了读起来就不方便了。这时就可以使用DailyRollingAppender。DailyRollingAppender可以把Log信息输出到按照日期来区分的文件中。配置文件就会每天产生一个log文件,每个log文件只记录当天的log信息:  
  37. log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender  
  38. log4j.appender.A2.file=dglog  
  39. log4j.appender.A2.DatePattern='.'yyyy-MM-dd  
  40. log4j.appender.A2.layout=org.apache.log4j.PatternLayout  
  41. log4j.appender.A2.layout.ConversionPattern= %5r %-5p %c{2} - %m%n  
  42.   
  43. 2.2.4. org.apache.log4j.RollingFileAppender  
  44.   
  45. 文件大小到达指定尺寸的时候产生一个新的文件。  
  46. log4j.appender.R=org.apache.log4j.RollingFileAppender  
  47. log4j.appender.R.File= ../logs/dglog.log  
  48. # Control the maximum log file size  
  49. log4j.appender.R.MaxFileSize=100KB  
  50. # Archive log files (one backup file here)  
  51. log4j.appender.R.MaxBackupIndex=1  
  52. log4j.appender.R.layout=org.apache.log4j.PatternLayout  
  53. log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n 这个配置文件指定了输出源R,是一个轮转日志文件。最大的文件是100KB,当一个日志文件达到最大尺寸时,Log4J会自动把example.log重命名为dglog.log.1,然后重建一个新的dglog.log文件,依次轮转。  
  54.   
  55. 2.2.5. org.apache.log4j.WriterAppender  
  56.   
  57. 将日志信息以流格式发送到任意指定的地方。  
  58.   
  59. 2.3. Layout的配置  
  60.   
  61.   
  62. Layout指定了log信息输出的样式。  
  63.   
  64. 2.3.1. 布局样式  
  65.   
  66.   
  67. org.apache.log4j.HTMLLayout(以HTML表格形式布局),  
  68. org.apache.log4j.PatternLayout(可以灵活地指定布局模式),  
  69. org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),  
  70. org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息)  
  71.   
  72. 2.3.2. 格式  
  73.   
  74.   
  75. %m 输出代码中指定的消息  
  76. %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL  
  77. %r 输出自应用启动到输出该log信息耗费的毫秒数  
  78. %c 输出所属的类目,通常就是所在类的全名  
  79. %t 输出产生该日志事件的线程名  
  80. %n 输出一个回车换行符,Windows平台为"rn",Unix平台为"n"  
  81. %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:20021018日 221028921  
  82. %l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(Test Log4.java:10)  
  83.   
  84. 2.3.3. 例子  
  85.   
  86. 例子1:显示日期和log信息  
  87. log4j.appender.A2.layout=org.apache.log4j.PatternLayout  
  88. log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n 打印的信息是:  
  89. 2002-11-12 11:49:42,866 SELECT * FROM Role WHERE 1=1 order by createDate desc 例子2:显示日期,log发生地方和log信息  
  90. log4j.appender.A2.layout=org.apache.log4j.PatternLayout  
  91. log4j.appender.A2.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %l "#" %m%n  
  92. 2002-11-12 11:51:46,313 cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409"#"  
  93. SELECT * FROM Role WHERE 1=1 order by createDate desc 例子3:显示log级别,时间,调用方法,log信息  
  94. log4j.appender.A2.layout=org.apache.log4j.PatternLayout  
  95. log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}  
  96. method:%l%n%m%n  
  97. log信息:  
  98. [DEBUG] 2002-11-12 12:00:57,376  
  99. method:cn.net.unet.weboa.system.dao.RoleDAO.select(RoleDAO.java:409)  
  100. SELECT * FROM Role WHERE 1=1 order by createDate desc  
  101.   
  102. 2.4. 配置文件的例子:  
  103.   
  104.   
  105. log4j.rootLogger=DEBUG  
  106. #将DAO层log记录到DAOLog,allLog中  
  107. log4j.logger.DAO=DEBUG,A2,A4  
  108. #将逻辑层log记录到BusinessLog,allLog中  
  109. log4j.logger.Businesslog=DEBUG,A3,A4  
  110.   
  111. #A1--打印到屏幕上  
  112. log4j.appender.A1=org.apache.log4j.ConsoleAppender  
  113. log4j.appender.A1.layout=org.apache.log4j.PatternLayout  
  114. log4j.appender.A1.layout.ConversionPattern=%-5p [%t] %37c %3x - %m%n  
  115.   
  116. #A2--打印到文件DAOLog中--专门为DAO层服务  
  117. log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender  
  118. log4j.appender.A2.file=DAOLog  
  119. log4j.appender.A2.DatePattern='.'yyyy-MM-dd  
  120. log4j.appender.A2.layout=org.apache.log4j.PatternLayout  
  121. log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}  
  122. method:%l%n%m%n  
  123.   
  124. #A3--打印到文件BusinessLog中--专门记录逻辑处理层服务log信息  
  125. log4j.appender.A3=org.apache.log4j.DailyRollingFileAppender  
  126. log4j.appender.A3.file=BusinessLog  
  127. log4j.appender.A3.DatePattern='.'yyyy-MM-dd  
  128. log4j.appender.A3.layout=org.apache.log4j.PatternLayout  
  129. log4j.appender.A3.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}  
  130. method:%l%n%m%n  
  131.   
  132. #A4--打印到文件alllog中--记录所有log信息  
  133. log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender  
  134. log4j.appender.A4.file=alllog  
  135. log4j.appender.A4.DatePattern='.'yyyy-MM-dd  
  136. log4j.appender.A4.layout=org.apache.log4j.PatternLayout  
  137. log4j.appender.A4.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS}  
  138. method:%l%n%m%n  
  139.   
  140. 3章. API使用  
  141.   
  142.   
  143. log4j使用步骤有3个:  
  144.   
  145. 3.1. 初始化  
  146.   
  147. 3.1.1. Tomcat下的初始化  
  148.   
  149. 默认的Log4j initialization典型的应用是在web-server 环境下。在tomcat3.x和tomcat4.x下,你应该将配置文件Log4j.properties放在你的web应用程序的WEB-INF/classes 目录下。  
  150. Log4j将发现属性文件,并且以此初始化。这是使它工作的最容易的方法。 你也可以选择在运行tomcat前设置系统属性Log4j.configuration 。对于tomcat 3.x,TOMCAT_OPTS 系统变量是用来设置命令行的选项。对于tomcat4.0,用系统环境变量CATALINA_OPTS 代替了TOMCAT_OPTS。  
  151. UNIX 命令行  
  152. export TOMCAT_OPTS="-DLog4j.configuration=foobar.txt" 告诉Log4j用文件foobar.txt作为默认的配置文件。这个文件应该放在WEB-INF/classes 目录下。这个文件将被PropertyConfigurator所读。每个web-application将用不同的默认配置文件,因为每个文件是和它的web-application 相关的。  
  153. 1. export TOMCAT_OPTS="-DLog4j.debug -DLog4j.configuration=foobar.xml" export TOMCAT_OPTS="-DLog4j.debug -DLog4j.configuration=foobar.xml" 告诉Log4j输出Log4j-internal的调试信息,并且用foobar.xml作为默认的配置文件。这个文件应该放在你的web-application的WEB-INF/classes 目录下。因为有.xml的扩展名,它将被DOMConfigurator所读。每个web-application将用不同的默认配置文件。因为每个文件都和它所在的web-application 相关的。  
  154. 2. set TOMCAT_OPTS=-DLog4j.configuration=foobar.lcf  
  155. -DLog4j.configuratorClass=com.foo.BarConfigurator 告诉Log4j用文件foobar.lcf作为默认的配置文件。这个文件应该放在你的web-application的WEB-INF/classes 目录下。因为定义了Log4j.configuratorClass 系统属性,文件将用自定义的com.foo.barconfigurator类来解析。每个web-application将用不同的默认配置文件。因为每个文件都和它所在的web-application 相关的。  
  156. 3. set TOMCAT_OPTS=-DLog4j.configuration=file:/c:/foobar.lcf set TOMCAT_OPTS=-DLog4j.configuration=file:/c:/foobar.lcf 告诉Log4j用文件foobar.lcf作为默认的配置文件。这个配置文件用URL file:/c:/foobar.lcf定义了全路径名。这样同样的配置文件将被所有的web-application所用。 不同的web-application将通过它们自己的类装载器来装载Log4j。这样,每个Log4j的环境将独立的运作,而没有任何的相互同步。例如:在多个web-application中定义了完全相同的输出源的FileAppenders将尝试写同样的文件。结果好象是缺乏安全性的。你必须确保每个不同的web-application的Log4j配置没有用到同样的系统资源。  
  157.   
  158. 3.1.2. Servlet 的初始化  
  159.   
  160. 用一个特别的servlet来做Log4j的初始化也是可以的。如下是一个例子:  
  161. public class Log4jInit extends HttpServlet {  
  162. public void init() {  
  163. String prefix = getServletContext().getRealPath("/");  
  164. String file = getInitParameter("Log4j-init-file");  
  165. if(file != null) {  
  166. PropertyConfigurator.configure(prefix+file);  
  167. }  
  168. }  
  169. public void doGet(HttpServletRequest req, HttpServletResponse res) {  
  170. }  
  171. } 在web.xml中定义随后的servlet为你的web-application。  
  172. <servlet>  
  173. <servlet-name>Log4j-init</servlet-name>  
  174. <servlet-class>xx.xx.Log4jInit</servlet-class>  
  175. <init-param>  
  176. <param-name>Log4j-init-file</param-name>  
  177. <param-value>WEB-INF/classes/Log4j.properties</param-value>  
  178. </init-param>  
  179. <load-on-startup>1</load-on-startup>  
  180. </servlet> 写一个初始化的servlet是最有弹性的初始化Log4j的方法。代码中没有任何限制,你可以在servlet的init方法中定义它。  
  181.   
  182. 3.2. 根据配置文件初始化log4j  
  183.   
  184.   
  185. log4j可以使用3中配置器来初始化:BasicConfigurator,DOMConfigurator,PropertyConfigurator 其语法为:  
  186. BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。  
  187. PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。  
  188. DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。 这里用的是PropertyConfigurator。使用PropertyConfigurator适用于所有的系统。如下的语句:  
  189. PropertyConfigurator.configure("log4j.properties"); 就以log4j.properties为配置文件初始化好了log4j环境。 注意一点:这个语句只需要在系统启动的时候执行一次。例如,在ActionServlet的init()方法中调用一次。  
  190. public class ActionServlet extends HttpServlet{  
  191. ...  
  192. /** 
  193. * Initialize global variables 
  194. */  
  195. public void init() throws ServletException {  
  196. // 初始化Action资源  
  197. try{  
  198. initLog4j();  
  199. ...  
  200. }catch(IOException e){  
  201. throw new ServletException("Load ActionRes is Error");  
  202. }  
  203. }  
  204. ...  
  205. protected void initLog4j(){  
  206. PropertyConfigurator.configure("log4j.properties");  
  207. }  
  208. ...  
  209. }//end class ActionServlet  
  210.   
  211. 3.3. 在需要使用log4j的地方获取Logger实例  
  212.   
  213. 使用Log4j,首先就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:  
  214. public static Logger getLogger( String name), 通过指定的名字获得记录器,如果必要的话,则为这个名字创建一个新的记录器。Name一般取本类的名字,比如:  
  215. static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () ) ;  
  216. Log4j使得通过软件组件命名logger很容易。我们可以通过Logger的静态的初始化方法在每一个类里定义一个logger,令logger的名字等于类名的全局名,而实现logger的命名。这是一个实效的简单的定义一个logger的方法。因为日志输出带有产生日志的类的名字,这个命名策略使得我们更容易定位到一个日志信息的来源。虽然普通,但却是命名logger的常用策略之一。  
  217. Log4j没有限制定义logger的可能。开发员可以自由的按照它们的意愿定义logger的名称。 然而,以类的所在位置来命名Logger好象是目前已知的最好方法。  
  218.   
  219. 3.4. 使用Logger对象的debug,info,fatal...方法  
  220.   
  221.   
  222. log.debug("it is the debug info");  
  223.   
  224. 4章. 优化  
  225.   
  226. 一个经常引用的依靠于logging的参数是可以计算的花费。这是一个合理的概念,一个适度的应用程序可能产生成千上万个日志请求。许多努力花在测量和调试logging的优化上。Log4j要求快速和弹性:速度最重要,弹性是其次。  
  227.   
  228. 4.1. 日志为禁用时,日志的优化。  
  229.   
  230. 当日志被彻底的关闭,一个日志请求的花费等于一个方法的调用加上整数的比较时间。在233mhz的Pentium II 机器上这个花费通常在5-50纳秒之间。 然而,方法调用包括参数构建的隐藏花费。 例如,对于logger cat,logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i])); 引起了构建信息参数的花费,例如,转化整数i和entry[i]到一个string,并且连接中间字符串,不管信息是否被输出。这个参数的构建花费可能是很高,它主要决定于被调用的参数的大小。 避免参数构建的花费应如下,  
  231.   
  232.   
  233. if(logger.isDebugEnabled())  
  234. {  
  235. logger.debug("result is" + result );  
  236. }  
  237.   
  238. 如果logger的debug被关闭这将不会招致参数构建的花费。另一方面,如果logger是debug的话,它将产生两次判断 logger是否能用的花费。一次是在debugenabled,一次是debug。这是无关紧要的,因为判断日志的能用 只占日志实际花费时间的约1%。 在Log4j里,日志请求在Logger 类的实例里。Logger 是一个类,而不是一个接口。这大量的减少了在方法调用上的弹性化的花费。 当然用户采用预处理或编译时间技术去编译出所有的日志声明。这将导致完美的执行成效。然而因为二进制应用程序不包括任何的日志声明的结果,日志不可能对那个二进制程序开启。以我的观点,以这种较大的代价来换取较小的性能优化是不值得的。  
  239.   
  240. 4.2. 当日志状态为启用时,日志的优化。  
  241.   
  242. 这是本质上的优化logger的层次。当日志状态为开,Log4j依然需要比较请求的级别与logger的级别。然而, logger可能没有被安排一个级别;它们将从它们的father继承。这样,在继承之前,logger可能需要搜索它的ancestor。 这里有一个认真的努力使层次的搜索尽可能的快。例如,子logger仅仅连接到它的存在的father logger。 在先前展示的BasicConfigurator 例子中,名为com.foo.bar 的logger是连接到跟根logger,因此绕过了不存在的logger com和com.foo。这将显著的改善执行的速度,特别是解析logger的层结构时。 典型的层次结构的解析的花费是logger彻底关闭时的三倍。  
  243.   
  244. 4.3. 日志信息的输出时,日志的优化。  
  245.   
  246. 这是主要花费在日志输出的格式化和发送它到它的输出源上。这里我们再一次的付出努力以使格式化执行的尽可能快。同appender一样。实际上典型的花费大约是100-300毫秒。 详情看org.apache.log4.performance.Logging。 虽然Log4j有许多特点,但是它的第一个设计目标还是速度。一些Log4j的组件已经被重写过很多次以改善性能。不过,投稿者经常提出了新的优化。你应该满意的知道,以SimpleLayout的配置执行测试已经展示了Log4j的输出同System.out.println一样快。  

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics