<!-- Struts Chapter 9 Log4j(系统运行时的状态记录日志) Goal:能够给自己的做的系统写一个系统运行的状态日志记录,便于以后系统的维护! 当然,也是为了学Hibernate打好基础!然后呢~这个呢,也没什么好说的~我就直接把前辈 们总结好的东西直接就贴上来了~呵呵~又懒了一次! --> 一,首先是向sir给我们的log4j.properties的标准版,然后我自己加了一点注释,然后其中的各个参数将会在第二点中讲到! 然后就是不能忘了必需的包:commons-logging.jar&log4j.jar #等号后面是别名,要在记录日志的地方用 log4j.rootLogger=ALL,CONSOLE,FILE,ROLLING_FILE,MAIL,A1,DATABASE ################### # Console Appender 在控制台输出的 ################### log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender #log4j.appender.CONSOLE.Threshold=INFO 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 ##################### # File Appender 输出到文件中 ##################### log4j.appender.FILE=org.apache.log4j.FileAppender #log4j.appender.FILE.Threshold=ERROR log4j.appender.FILE.File=c\:\\a\\file.html log4j.appender.FILE.Append=false log4j.appender.FILE.layout=org.apache.log4j.HTMLLayout log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n ######################## # Rolling File 回滚文件 ######################## log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender #log4j.appender.ROLLING_FILE.Threshold=DEBUG log4j.appender.ROLLING_FILE.File=c\:\\a\\rolling.log log4j.appender.ROLLING_FILE.Append=true log4j.appender.ROLLING_FILE.MaxFileSize=5KB #备份文件个数 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 ######################## # DailyRollingFile 每日产生一个日志文件 ####################### log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender log4j.appender.A1.File=c:\\a\\SampleMessages.log4j log4j.appender.A1.DatePattern=yyyyMMdd-HH'.log4j' log4j.appender.A1.layout=org.apache.log4j.HTMLLayout ######################## # SMTP Appender(发送到email-需要用户名和密码,还要有javamail.jar,dsn.jar,imap.jar,mailapi.jar,pop3.jar,smtp.jar包) ####################### #log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender ### 错误级别 ##log4j.appender.MAIL.Threshold=FATAL ## 缓存文件大小,日志达到10K时发送Email #log4j.appender.MAIL.BufferSize=10 #[email protected] #log4j.appender.MAIL.SMTPHost=smtp.163.com #log4j.appender.MAIL.SMTPUsername=wisdom_xw #log4j.appender.MAIL.SMTPPassword=密码 ### 邮件主题 #log4j.appender.MAIL.Subject=Messsage From LOG4J #[email protected] #注意:下面的layout=后面的值要是women写的解决转码问题的类,eg:com.shu.util.MyPattern #log4j.appender.MAIL.layout=com.shu.util.MyPattern #log4j.appender.MAIL.layout.ConversionPattern=[ErrorMessage] %d - %c -%-4r [%t] %-5p %c %x - %m%n ##邮件中,内容包含中文的处理方式 #public class MyPatternLayout extends PatternLayout { # @Override # public String getContentType() { # return "text/html;CHARSET=utf8"; //设定字符集 # # } #} #当布局是HTML时(该类位于com.shu.util.MyPattern) #public class MyPattern extends HTMLLayout{ # @Override # public String getContentType() { # return "text/html;CHARSET=utf-8"; //设定字符集 # # } #} ######################## # JDBC Appender 放入到DBSM中(需要jdbc驱动)(注意,系统默认没有处理单引号问题,晕~突然想不起这个是怎么处理的了) ####################### log4j.appender.DATABASE=BPSJDBCAppender log4j.appender.DATABASE.Threshold=all log4j.appender.DATABASE.URL=jdbc:sqlserver://localhost:1433;databaseName=testdb log4j.appender.DATABASE.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver log4j.appender.DATABASE.user=sa log4j.appender.DATABASE.password=123456 log4j.appender.DATABASE.sql=INSERT INTO error_msg VALUES ('%d - %c -%-4r [%t] %-5p %c %x - %m%n') log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout #只记得要写这个方法! #import org.apache.log4j.Category; #import org.apache.log4j.Priority; #import org.apache.log4j.spi.LoggingEvent; #public class BPSLoggingEvent extends LoggingEvent { # public BPSLoggingEvent(String fqnOfCategoryClass, Category logger, Priority level, Object message, Throwable throwable) { # super(fqnOfCategoryClass, logger, level, message, throwable); # // TODO Auto-generated constructor stub # } # public String getThreadName() { # // TODO Auto-generated method stub # String thrdName=super.getThreadName(); # if(thrdName.indexOf("'")!=-1){ # thrdName=thrdName.replaceAll("'", "''"); # } # return thrdName; # } # public String getRenderedMessage() { # String msg=super.getRenderedMessage(); # if(msg.indexOf("'")!=-1){ # msg=msg.replaceAll("'", "''"); # } # return msg; # } #} #还有这个方法 #import org.apache.log4j.Category; #import org.apache.log4j.Priority; #import org.apache.log4j.spi.LoggingEvent; #import org.apache.log4j.Category; #import org.apache.log4j.Priority; #import org.apache.log4j.jdbc.JDBCAppender; #import org.apache.log4j.spi.LoggingEvent; # #public class BPSJDBCAppender extends JDBCAppender { # protected String getLogStatement(LoggingEvent event) { # String fqnOfCategoryClass = event.fqnOfCategoryClass; # Category logger = Category.getRoot(); # Priority level = event.level; # Object message = event.getMessage(); # Throwable throwable = null; # BPSLoggingEvent bEvent = new BPSLoggingEvent(fqnOfCategoryClass, # logger, level, message, throwable); # return super.getLogStatement(bEvent); # } #} 二,log4j.properties中各个参数的讲解 //-----------------------大体上------------------------------ #log4j.rootLogger=输出级别(all<debug<info<error),输出位置(动态参数) #设置输出具体的位置 #log4j.appender.别名=ConsoleAppender(控制台)\FileAppender(文件中) #DailyRollingFileAppender(每日一个文件)\SMTPAppender(发送邮件)\BPSJDBCAppender(数据库中) #设置输出级别 #log4j.appender.别名.Threshold=可选值(all<debug<info<error) #设置输出文件的格式 #log4j.appender.别名.layout=PatternLayout(普通文本格式)、HTMLLayout(HTML格式) #设置日志的具体内容(使用特殊符号代替,详细见书:p174) #log4j.appender.ABC.layout.ConversionPattern=%F %L %d等等 //-------------------------------------------------------------- 输出级别的种类 ERROR、WARN、INFO、DEBUG ERROR 为严重错误 主要是程序的错误 WARN 为一般警告,比如session丢失 INFO 为一般要显示的信息,比如登录登出 DEBUG 为程序的调试信息 配置日志信息输出目的地 log4j.appender.appenderName = fully.qualified.name.of.appender.class 1.org.apache.log4j.ConsoleAppender(控制台) 2.org.apache.log4j.FileAppender(文件) 3.org.apache.log4j.DailyRollingFileAppender(每天产生一个日志文件) 4.org.apache.log4j.RollingFileAppender(文件大小到达指定尺寸的时候产生一个新的文件) 5.org.apache.log4j.WriterAppender(将日志信息以流格式发送到任意指定的地方) 配置日志信息的格式 log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class 1.org.apache.log4j.HTMLLayout(以HTML表格形式布局), 2.org.apache.log4j.PatternLayout(可以灵活地指定布局模式), 3.org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串), 4.org.apache.log4j.TTCCLayout(包含日志产生的时间、线程、类别等等信息) 控制台选项 Threshold=DEBUG:指定日志消息的输出最低层次。 ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。 Target=System.err:默认情况下是:System.out,指定输出控制台 FileAppender 选项 Threshold=DEBUF:指定日志消息的输出最低层次。 ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。 File=mylog.txt:指定消息输出到mylog.txt文件。 Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。 RollingFileAppender 选项 Threshold=DEBUG:指定日志消息的输出最低层次。 ImmediateFlush=true:默认值是true,意谓着所有的消息都会被立即输出。 File=mylog.txt:指定消息输出到mylog.txt文件。 Append=false:默认值是true,即将消息增加到指定文件中,false指将消息覆盖指定的文件内容。 MaxFileSize=100KB: 后缀可以是KB, MB 或者是 GB. 在日志文件到达该大小时,将会自动滚动,即将原来的内容移到mylog.log.1文件。 MaxBackupIndex=2:指定可以产生的滚动文件的最大数。 log4j.appender.A1.layout.ConversionPattern=%-4r %-5p %d{yyyy-MM-dd HH:mm:ssS} %c %m%n 日志信息格式中几个符号所代表的含义: -X号: X信息输出时左对齐; %p: 输出日志信息优先级,即DEBUG,INFO,WARN,ERROR,FATAL, %d: 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},输出类似:2002年10月18日 22:10:28,921 %r: 输出自应用启动到输出该log信息耗费的毫秒数 %c: 输出日志信息所属的类目,通常就是所在类的全名 %t: 输出产生该日志事件的线程名 %l: 输出日志事件的发生位置,相当于%C.%M(%F:%L)的组合,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main (TestLog4.java:10) %x: 输出和当前线程相关联的NDC(嵌套诊断环境),尤其用到像java servlets这样的多客户多线程的应用中。 %%: 输出一个"%"字符 %F: 输出日志消息产生时所在的文件名称 %L: 输出代码中的行号 %m: 输出代码中指定的消息,产生的日志具体信息 %n: 输出一个回车换行符,Windows平台为"\r\n",Unix平台为"\n"输出日志信息换行 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如: 1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。 2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。 3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。 4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉 三,使用java代码记录日志 [代码中使用] 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 " ); .... } } <!-- Author:Lovingshu's Forever Date:2011-11-02 22:33 Remark:I've nothing to say~but there is someone leave my life and never back~ -->