一种基于Log4J的日志输出组件的设计
- 格式:pdf
- 大小:202.83 KB
- 文档页数:3
Druid搭配log4j2输出SQL语句和结果⼀、引⾔其实Druid的内置了log4jdbc来显⽰SQL语句,虽然显⽰效果不如原⽣的log4jdbc效果好,但是因为内置所以不需要其他更多的配置。
⼆、使⽤1. 创建基于druid的logger1. <bean id="log-filter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter">2. <property name="connectionLogEnabled" value="false"/>3. <property name="statementLogEnabled" value="false"/>4. <property name="resultSetLogEnabled" value="true"/>5. <property name="statementExecutableSqlLogEnable" value="true"/>6. </bean>a. resultSetLogEnabled表⽰是否显⽰结果集。
b. statementExecutableSqlLogEnable 表⽰是否显⽰SQL语句。
2. 在 DruidDataSource中配置1. <!-- 数据连接池 -->2. <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">3. .....4. <property name="filters" value="stat,wall"/>5. ......6. <property name="proxyFilters">7. <list>8. <ref bean="log-filter"/>9. </list>10. </property>11. </bean>proxyFilters是代理filter的意思,将我们在第⼀步创建的log-filter写⼊进去。
Log4j优化(一)扩展Log4j来实现性能优化的异步日志收集器日志收集在互联网企业尤其是大数据时代是一件非常重要的事情,日志记录着用户行为和系统行为,是一种重要的数据来源。
Log4j是Java应用程序使用的最多的一种日志收集工作。
目前大量的Java应用程序都使用着Lo4j 1.2.X版本,Log4j 1.X版本饱受诟病的原因是使用了大量的锁,在高并发的情况下影响了系统的性能。
这篇简单提供一种思路,说说如何扩展一下Log4j,提升一下Log4j的性能。
网上有很多分析Log4j源码的文章,这里不重复说了,只简单分析一下最重要的几个组件。
先看一下Log4j的配置文件log4j.xml[java] view plain copy1.<?xml version="1.0" encoding="UTF-8" ?>2.<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">3.4.<log4j:configuration xmlns:log4j="/log4j/">5.<appender name="rootAppender" class="org.apache.log 4j.DailyRollingFileAppender">6.<param name="File" value="test.log" />7.<param name="DatePattern" value="'.'yyyy-MM-dd" />8.<layout class="org.apache.log4j.PatternLayout">9.<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %5p %c{1}:%L - %m%n" />10.</layout>11.</appender>12.<logger name="com.test" additivity="false">13.<level value="debug" />14.<appender-ref ref="rootAppender" />15.</logger>16.<root>17.<level value="debug" />18.<appender-ref ref="rootAppender" />19.</root>20.</log4j:configuration>从log4j.xml里面我们就可以看到Log4j最主要的几个组件1. Logger,表示日志收集器,包含了各种Level下收集日志的方法,比如debug, info, error等。
log4j输出到文件和数据库控制台的实现就不说了,这里提供两种实例的配置,一种是输出为文件的(每天输出一个文件),一种为输出到数据库的配置。
1、输出到文件:Properties代码log4j.rootCategory=WARN, CONSOLE, FILE.surfilter.bt=FATAL,TOFILElog4j.appender.TOFILE=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.TOFILE.Threshold=FATALlog4j.appender.TOFILE.File=E:/javascpace/bt/logs/union.htmllog4j.appender.TOFILE.Append=truelog4j.appender.TOFILE.ImmediateFlush=truelog4j.appender.TOFILE.DatePattern='.'yyyy-MM-dd'.html'yout=com.surfilter.bt.util.FormatHTMLLayoutlog4j.rootCategory=WARN, CONSOLE, FILE.surfilter.bt=FATAL,TOFILElog4j.appender.TOFILE=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.TOFILE.Threshold=FATALlog4j.appender.TOFILE.File=E:/javascpace/bt/logs/union.htmllog4j.appender.TOFILE.Append=truelog4j.appender.TOFILE.ImmediateFlush=truelog4j.appender.TOFILE.DatePattern='.'yyyy-MM-dd'.html'yout=com.surfilter.bt.util.FormatHTMLLayout这里的com.surfilter.bt.util.FormatHTMLLayout是重写了log4j提供的HTMLLayout类,具体代码如下:Java代码import java.text.SimpleDateFormat;import java.util.Map;import org.apache.log4j.HTMLLayout;import yout;import org.apache.log4j.Level;import org.apache.log4j.helpers.Transform;import org.apache.log4j.spi.LocationInfo;import org.apache.log4j.spi.LoggingEvent;import com.opensymphony.xwork2.ActionContext;import com.surfilter.core.Constants;import er;public class FormatHTMLLayout extends HTMLLayout {public FormatHTMLLayout() {}protected final int BUF_SIZE = 256;protected final int MAX_CAPACITY = 1024;static String TRACE_PREFIX = "<br> ";// output buffer appended to when format() is invokedprivate StringBuffer sbuf = new StringBuffer(BUF_SIZE);String title="系统操作日志";/*** A string constant used in naming the option for setting the the HTML* document title. Current value of this string constant is <b>Title</b>.*/public static final String TITLE_OPTION = "Title";// Print no location info by defaultboolean locationInfo = true;public String format(LoggingEvent event) {if (sbuf.capacity() > MAX_CAPACITY) {sbuf = new StringBuffer(BUF_SIZE);} else {sbuf.setLength(0);}sbuf.append(Layout.LINE_SEP + "<tr>" + Layout.LINE_SEP);/* sbuf.append("<td>");sbuf.append(String.valueOf(i));sbuf.append("</td>" + Layout.LINE_SEP);*/sbuf.append("<td>");sbuf.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(newjava.util.Date()));sbuf.append("</td>" + Layout.LINE_SEP);/* String escapedThread = Transform.escapeTags(event.getThreadName());sbuf.append("<td title=\"" + escapedThread + " thread\">");sbuf.append(escapedThread);sbuf.append("</td>" + Layout.LINE_SEP);*/sbuf.append("<td title=\"级别\">");if (event.getLevel().equals(Level.FATAL)) {sbuf.append("<font color=\"#339933\">");sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));sbuf.append("</font>");} else if (event.getLevel().isGreaterOrEqual(Level.WARN)) {sbuf.append("<font color=\"#993300\"><strong>");sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));sbuf.append("</strong></font>");} else {sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));}sbuf.append("</td>" + Layout.LINE_SEP);/* String escapedLogger = Transform.escapeTags(event.getLoggerName().substring(event.getLoggerName().lastIndexOf(".") ));sbuf.append("<td title=\"类名\">");sbuf.append(escapedLogger);sbuf.append("</td>" + Layout.LINE_SEP);*/if (locationInfo) {LocationInfo locInfo = event.getLocationInformation();sbuf.append("<td title=\"行号\">");sbuf.append(Transform.escapeTags(locInfo.getFileName()));sbuf.append(':');sbuf.append(locInfo.getLineNumber());sbuf.append("</td>" + Layout.LINE_SEP);}Map session = ActionContext.getContext().getSession();if(session!=null){User user = (User) session.get(ER_IN_SESSION);sbuf.append("<td>"+user.getName()+"</td>");}else{sbuf.append("<td> </td>");}sbuf.append("<td title=\"日志信息\">");sbuf.append(Transform.escapeTags(event.getRenderedMessage()));sbuf.append("</td>" + Layout.LINE_SEP);sbuf.append("</tr>" + Layout.LINE_SEP);if (event.getNDC() != null) {sbuf.append("<tr><td bgcolor=\"#EEEEEE\" style=\"font-size : xx-small;\" colspan=\"6\" title=\"Nested Diagnostic Context\">");sbuf.append("NDC: " + Transform.escapeTags(event.getNDC()));sbuf.append("</td></tr>" + Layout.LINE_SEP);}String[] s = event.getThrowableStrRep();if (s != null) {sbuf.append("<tr><td bgcolor=\"#993300\" style=\"color:White; font-size : xx-small;\" colspan=\"4\">");appendThrowableAsHTML(s, sbuf);sbuf.append("</td></tr>" + Layout.LINE_SEP);}return sbuf.toString();}private void appendThrowableAsHTML(String[] s, StringBuffer sbuf) {if (s != null) {int len = s.length;if (len == 0)return;sbuf.append(Transform.escapeTags(s[0]));sbuf.append(Layout.LINE_SEP);for (int i = 1; i < len; i++) {sbuf.append(TRACE_PREFIX);sbuf.append(Transform.escapeTags(s[i]));sbuf.append(Layout.LINE_SEP);}}}/*** Returns appropriate HTML headers.*/public String getHeader() {StringBuffer sbuf = new StringBuffer();sbuf.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"/TR/html4/loose.dtd\">" + Layout.LINE_SEP);sbuf.append("<html>" + Layout.LINE_SEP);sbuf.append("<head>" + Layout.LINE_SEP);// sbuf.append("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">");sbuf.append("<title>" + title + "</title>" + Layout.LINE_SEP);sbuf.append("<style type=\"text/css\">" + Layout.LINE_SEP);sbuf.append("<!--" + Layout.LINE_SEP);sbuf.append("body, table {font-family: '宋体',arial,sans-serif; font-size: 12px;}" + Layout.LINE_SEP);sbuf.append("th {background: #336699; color: #FFFFFF; text-align: left;}" + Layout.LINE_SEP);sbuf.append("-->" + Layout.LINE_SEP);sbuf.append("</style>" + Layout.LINE_SEP);sbuf.append("</head>" + Layout.LINE_SEP);sbuf.append("<body bgcolor=\"#FFFFFF\" topmargin=\"6\" leftmargin=\"6\">" + Layout.LINE_SEP);// sbuf.append("<hr size=\"1\" noshade>" + Layout.LINE_SEP);// sbuf.append("Log session start time " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new java.util.Date()) + "<br>" + Layout.LINE_SEP);// sbuf.append("<p>" + Layout.LINE_SEP);sbuf.append("<table cellspacing=\"0\" cellpadding=\"4\" border=\"1\" bordercolor=\"#224466\" width=\"100%\">" + Layout.LINE_SEP);sbuf.append("<tr>" + Layout.LINE_SEP);// sbuf.append("<th>序列</th>" + Layout.LINE_SEP);sbuf.append("<th>执行时间</th>" + Layout.LINE_SEP);sbuf.append("<th>级别</th>" + Layout.LINE_SEP);// sbuf.append("<th>所在类</th>" + Layout.LINE_SEP);if (locationInfo) {sbuf.append("<th>所在行</th>" + Layout.LINE_SEP);}sbuf.append("<th>操作人</th>");sbuf.append("<th>信息</th>" + Layout.LINE_SEP);sbuf.append("</tr>" + Layout.LINE_SEP);sbuf.append("<br></br>" + Layout.LINE_SEP);return sbuf.toString();}}import java.text.SimpleDateFormat;import java.util.Map;import org.apache.log4j.HTMLLayout;import yout;import org.apache.log4j.Level;import org.apache.log4j.helpers.Transform;import org.apache.log4j.spi.LocationInfo;import org.apache.log4j.spi.LoggingEvent;import com.opensymphony.xwork2.ActionContext;import com.surfilter.core.Constants;import er;public class FormatHTMLLayout extends HTMLLayout {public FormatHTMLLayout() {}protected final int BUF_SIZE = 256;protected final int MAX_CAPACITY = 1024;static String TRACE_PREFIX = "<br> ";// output buffer appended to when format() is invokedprivate StringBuffer sbuf = new StringBuffer(BUF_SIZE);String title="系统操作日志";/*** A string constant used in naming the option for setting the the HTML * document title. Current value of this string constant is <b>Title</b>.*/public static final String TITLE_OPTION = "Title";// Print no location info by defaultboolean locationInfo = true;public String format(LoggingEvent event) {if (sbuf.capacity() > MAX_CAPACITY) {sbuf = new StringBuffer(BUF_SIZE);} else {sbuf.setLength(0);}sbuf.append(Layout.LINE_SEP + "<tr>" + Layout.LINE_SEP);/* sbuf.append("<td>");sbuf.append(String.valueOf(i));sbuf.append("</td>" + Layout.LINE_SEP);*/sbuf.append("<td>");sbuf.append(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date()));sbuf.append("</td>" + Layout.LINE_SEP);/* String escapedThread = Transform.escapeTags(event.getThreadName());sbuf.append("<td title=\"" + escapedThread + " thread\">");sbuf.append(escapedThread);sbuf.append("</td>" + Layout.LINE_SEP);*/sbuf.append("<td title=\"级别\">");if (event.getLevel().equals(Level.FATAL)) {sbuf.append("<font color=\"#339933\">");sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));sbuf.append("</font>");} else if (event.getLevel().isGreaterOrEqual(Level.WARN)) {sbuf.append("<font color=\"#993300\"><strong>");sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));sbuf.append("</strong></font>");} else {sbuf.append(Transform.escapeTags(String.valueOf(event.getLevel())));}sbuf.append("</td>" + Layout.LINE_SEP);/* String escapedLogger = Transform.escapeTags(event.getLoggerName().substring(event.getLoggerName().lastIndexOf(".") ));sbuf.append("<td title=\"类名\">");sbuf.append(escapedLogger);sbuf.append("</td>" + Layout.LINE_SEP);*/if (locationInfo) {LocationInfo locInfo = event.getLocationInformation();sbuf.append("<td title=\"行号\">");sbuf.append(Transform.escapeTags(locInfo.getFileName()));sbuf.append(':');sbuf.append(locInfo.getLineNumber());sbuf.append("</td>" + Layout.LINE_SEP);}Map session = ActionContext.getContext().getSession();if(session!=null){User user = (User) session.get(ER_IN_SESSION);sbuf.append("<td>"+user.getName()+"</td>");}else{sbuf.append("<td> </td>");}sbuf.append("<td title=\"日志信息\">");sbuf.append(Transform.escapeTags(event.getRenderedMessage()));sbuf.append("</td>" + Layout.LINE_SEP);sbuf.append("</tr>" + Layout.LINE_SEP);if (event.getNDC() != null) {sbuf.append("<tr><td bgcolor=\"#EEEEEE\" style=\"font-size : xx-small;\" colspan=\"6\" title=\"Nested Diagnostic Context\">");sbuf.append("NDC: " + Transform.escapeTags(event.getNDC()));sbuf.append("</td></tr>" + Layout.LINE_SEP);}String[] s = event.getThrowableStrRep();if (s != null) {sbuf.append("<tr><td bgcolor=\"#993300\" style=\"color:White; font-size : xx-small;\" colspan=\"4\">");appendThrowableAsHTML(s, sbuf);sbuf.append("</td></tr>" + Layout.LINE_SEP);}return sbuf.toString();}private void appendThrowableAsHTML(String[] s, StringBuffer sbuf) {if (s != null) {int len = s.length;if (len == 0)return;sbuf.append(Transform.escapeTags(s[0]));sbuf.append(Layout.LINE_SEP);for (int i = 1; i < len; i++) {sbuf.append(TRACE_PREFIX);sbuf.append(Transform.escapeTags(s[i]));sbuf.append(Layout.LINE_SEP);}}}/*** Returns appropriate HTML headers.*/public String getHeader() {StringBuffer sbuf = new StringBuffer();sbuf.append("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"/TR/html4/loose.dtd\">" + Layout.LINE_SEP);sbuf.append("<html>" + Layout.LINE_SEP);sbuf.append("<head>" + Layout.LINE_SEP);// sbuf.append("<meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\">");sbuf.append("<title>" + title + "</title>" + Layout.LINE_SEP);sbuf.append("<style type=\"text/css\">" + Layout.LINE_SEP);sbuf.append("<!--" + Layout.LINE_SEP);sbuf.append("body, table {font-family: '宋体',arial,sans-serif; font-size: 12px;}" + Layout.LINE_SEP);sbuf.append("th {background: #336699; color: #FFFFFF; text-align: left;}" + Layout.LINE_SEP);sbuf.append("-->" + Layout.LINE_SEP);sbuf.append("</style>" + Layout.LINE_SEP);sbuf.append("</head>" + Layout.LINE_SEP);sbuf.append("<body bgcolor=\"#FFFFFF\" topmargin=\"6\" leftmargin=\"6\">" + Layout.LINE_SEP);// sbuf.append("<hr size=\"1\" noshade>" + Layout.LINE_SEP);// sbuf.append("Log session start time " + new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new java.util.Date()) + "<br>" + Layout.LINE_SEP);// sbuf.append("<p>" + Layout.LINE_SEP);sbuf.append("<table cellspacing=\"0\" cellpadding=\"4\" border=\"1\" bordercolor=\"#224466\" width=\"100%\">" + Layout.LINE_SEP);sbuf.append("<tr>" + Layout.LINE_SEP);// sbuf.append("<th>序列</th>" + Layout.LINE_SEP);sbuf.append("<th>执行时间</th>" + Layout.LINE_SEP);sbuf.append("<th>级别</th>" + Layout.LINE_SEP);// sbuf.append("<th>所在类</th>" + Layout.LINE_SEP);if (locationInfo) {sbuf.append("<th>所在行</th>" + Layout.LINE_SEP);}sbuf.append("<th>操作人</th>");sbuf.append("<th>信息</th>" + Layout.LINE_SEP);sbuf.append("</tr>" + Layout.LINE_SEP);sbuf.append("<br></br>" + Layout.LINE_SEP);return sbuf.toString();}}注,上面输出里包含了从当前session里取到的用户信息,只需要重写getHeader,format,appendThrowableAsHTML三个方法就可以了。
打印ibatis的SQL⽇志-通过log4j配置第⼀种:log4j.xml⽂件的1. <appender name="IBatis" class="org.apache.log4j.ConsoleAppender">2. <layout class="org.apache.log4j.PatternLayout">3. <param name="ConversionPattern" value="%-4r [%t] %-5p %c %x - %m%n" />4. </layout>5. <filter class="org.apache.log4j.varia.LevelRangeFilter">6. <param name="LevelMin" value="DEBUG" />7. <param name="LevelMax" value="DEBUG" />8. </filter>9. </appender>10.11. <logger name="com.ibatis" additivity="true">12. <level value="DEBUG" />13. </logger>14. <logger name="java.sql.Connection" additivity="true">15. <level value="DEBUG" />16. </logger>17. <logger name="java.sql.Statement" additivity="true">18. <level value="DEBUG" />19. </logger>20. <logger name="java.sql.PreparedStatement" additivity="true">21. <level value="DEBUG" />22. <appender-ref ref="IBatis" />23. </logger>24. <logger name="java.sql.ResultSet" additivity="true">25. <level value="DEBUG" />26. <appender-ref ref="IBatis" />27. </logger>第⼆种:log4j.properties1. log4j.appender.stdout=org.apache.log4j.ConsoleAppender2. yout=org.apache.log4j.PatternLayout3. yout.ConversionPattern=%d %p [%c] - %m%n4.5.6. .ibatis=debug7. mon.jdbc.SimpleDataSource=debug8. mon.jdbc.ScriptRunner=debug9. .ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug10. log4j.logger.java.sql.Connection=debug11. log4j.logger.java.sql.Statement=debug12. log4j.logger.java.sql.PreparedStatement=debug,stdout。
java日志,需要知道的几件事如果对于commons-loging 、log4j 、slf4j 、LogBack 等都已经非常清楚了,可以忽略本文。
几次解决日志冲突问题时对这几个概念的简单总结,希望对这块基础没有理解透的同学能有所帮助,当然如果对这块有更深刻理解的同学,也贡献出自己的知识和见解。
一、概念Commons-logging : apache最早提供的日志的门面接口。
避免和具体的日志方案直接耦合。
类似于JDBC 的api 接口,具体的的JDBC driver 实现由各数据库提供商实现。
通过统一接口解耦,不过其内部也实现了一些简单日志方案。
Log4j : 经典的一种日志解决方案。
内部把日志系统抽象封装成Logger 、appender 、pattern 等实现。
我们可以通过配置文件轻松的实现日志系统的管理和多样化配置。
Slf4j : 全称为Simple Logging Facade for JAVA:java简单日志门面。
是对不同日志框架提供的一个门面封装。
可以在部署的时候不修改任何配置即可接入一种日志实现方案。
和commons-loging 应该有一样的初衷。
个人感觉设从计上更好一些,没有commons 那么多潜规则。
同时有两个额外特点:1. 能支持多个参数,并通过{} 占位符进行替换,避免老写logger.isXXXEnabled 这种无奈的判断,带来性能提升见:/faq.html#logging_performance 。
2.OSGI 机制更好兼容支持一图胜千言,官网上的一个图:从上图可以发现,选择还是很多的。
Logback : LOGBack 作为一个通用可靠、快速灵活的日志框架,将作为Log4j 的替代和SLF4J 组成新的日志系统的完整实现。
官网上称具有极佳的性能,在关键路径上执行速度是log4j 的10 倍,且内存消耗更少。
具体优势见:http://logback.qos.ch/reasonsToSwitch.html二、常见日志方案和注意事项mons-logging+log4j : 经典的一个日志实现方案。
log4j⽇志输出格式⾃定义yout.ConversionPattern
类的⾃定义
1. #⾃定义样式
2. #%c 输出所属的类⽬,通常就是所在类的全名
3. #%C 输出Logger所在类的名称,通常就是所在类的全名
4. #%d 输出⽇志时间点的⽇期或时间,默认格式为ISO8601,也可以在其后指定格式,⽐如:
%d{yyy MMM dd HH:mm:ss , SSS},%d{ABSOLUTE},%d{DATE}
5. #%F 输出所在类的类名称,只有类名。
6. #%l 输出语句所在的⾏数,包括类名+⽅法名+⽂件名+⾏数
7. #%L 输出语句所在的⾏数,只输出数字
8. #%m 输出代码中指定的讯息,如log(message)中的message
9. #%M 输出⽅法名
10. #%p 输出⽇志级别,即DEBUG,INFO,WARN,ERROR,FATAL
11. #%r 输出⾃应⽤启动到输出该log信息耗费的毫秒数
12. #%t 输出产⽣该⽇志事件的线程名
13. #%n 输出⼀个回车换⾏符,Windows平台为“/r/n”,Unix平台为“/n”
14. #%% ⽤来输出百分号“%”
例如:
[%p] [%d{yyyy-MM-dd HH:mm:ss}][%t][%F-%L]%m%n
[%p] [%d{yyyy-MM-dd HH:mm:ss}][%l]%m%n。
利⽤log4j打印sql的log⽇志默认情况下,使⽤ibatis是不打印ibatis相关的log的,因为内部的sql执⾏都是内部调⽤,在server的控制台是不会打印log 的。
在log4j的配置⽂件log4j.properties⾥加上以下⼏句话就可以了:log4j.rootLogger=DEBUG,stdout,logfile.bill99.base=INFO.bill99.ctmp=INFO.bill99.golden.inf.sso=INFO.bill99.mdp=INFO.bill99=INFO#.bill99=falselog4j.appender.logfile=org.apache.log4j.RollingFileAppenderlog4j.appender.logfile.File=e\:\\opt\\log\\app-coe-prm.loglog4j.appender.logfile.MaxFileSize=10MB# Keep three backup files.log4j.appender.logfile.MaxBackupIndex=3# Pattern to output: date priority [category] - messageyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} [%p] %t [%l]%m%nlog4j.appender.stdout=org.apache.log4j.ConsoleAppenderyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d %p [%c] - %m%n# SqlMap logging configuration...log4j.logger.java.sql.Connection=INFOlog4j.logger.java.sql.Statement=INFOlog4j.logger.java.sql.PreparedStatement=INFOlog4j.logger.java.sql.ResultSet=INFO使⽤如下配置可以查看sql语句中?代表的实际参数:### direct log messages to stdout ###log4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n.hibernate=debug.hibernate.hql.ast.AST=debug#下⾯的两条配置⾮常重要,设置为trace后,将可以看到打印出sql中?占位符的实际内容#this is the most important config for showing parames like ?.hibernate.SQL=trace.hibernate.type=trace#above two configs.hibernate.tool.hbm2ddl=debug.hibernate.hql=debug.hibernate.cache=debug.hibernate.transaction=debug.hibernate.jdbc=debug.hibernate.connection.DriverManagerConnectionProvider=tracelog4j.rootLogger=warn, stdout.hibernate.type.descriptor.sql.BasicBinder=TRACElog4j.appender.stdout=org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target=System.outyout=org.apache.log4j.PatternLayoutyout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n .hibernate=debug.hibernate.hql.ast.AST=debug#下⾯的两条配置⾮常重要,设置为trace后,将可以看到打印出sql中?占位符的实际内容#this is the most important config for showing parames like ?.hibernate.SQL=trace.hibernate.type=trace#above two configs.hibernate.tool.hbm2ddl=debug.hibernate.hql=debug.hibernate.cache=debug.hibernate.transaction=debug.hibernate.jdbc=debug.hibernate.connection.DriverManagerConnectionProvider=tracelog4j.rootLogger=warn, stdout.hibernate.type.descriptor.sql.BasicBinder=TRACE。
log4j间隔时间输出日志只需要在log4j.properties文件中配置即可。
具体配置信息如下:log4j.rootLogger=debug,R###R is set to be a DailyRollingFileAppender.log4j.appender.R=org.apache.log4j.DailyRollingFileAppende rlog4j.appender.R.File=${user.dir}/logs/dialupLog4J.loglog4j.appender.R.DatePattern=yyyy-MM-dd-HH-mm'.log'#log4j.appender.R.MaxFileSize=30MB#log4j.appender.R.MaxBackupIndex=2/doc/8c3160143.html,yout=org.apach e.log4j.PatternLayout/doc/8c3160143.html,yout.Conversio nPattern=%d{yyyy:MM:dd:HH:mm:ss} %-5p [%C] (%F:%L) – %m%n这样配置就是一分钟输出一个日志文件,主要的格式是在log4j.appender.R.DatePattern这里配置的,如果配置成yyyy-MM-dd'.log'就是说每一天输出一个日志文件,但是#log4j.appender.R.MaxFileSize=30MB#log4j.appender.R.MaxBackupIndex=2这两句话没有起作用,应该是在org.apache.log4j.DailyRollingFileAppender这个类中没有配置这两个属性。
如果你想实现按大小输出文件的话,只需要将org.apache.log4j.DailyRollingFileAppender改成org.apache.log4j.RollingFileAppender即可,同时在org.apache.log4j.RollingFIleAppender中是定义了MaxFileSize和MaxBackupIndex的,也就是说可以按照大小来输出,例如我这里写的是30M,日志文件叫做dialupLog4J.log,那么当第dialupLog4J.log文件到达30M后就会自动备份成dialupLog4J.log.1,以此类推,直到备份文件的上限到达MaxBackupIndex后将会将过期的文件删除,然后重新备份生成新的。