企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### 1. 新建一个Java工程,导入Jar包(log4j-1.2.17.jar) ![](https://box.kancloud.cn/2016-03-18_56eba2a88f5f7.jpg) Jar包下载地址:[点击打开链接](http://download.csdn.net/detail/sunnyyoona/9411178) ### 2.配置文件:创建并设置log4j.properties ~~~ # 设置 log4j.rootLogger = debug,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 = [%-5p] %d{yyyy-MM-dd HH:mm:ss, SSS} method:%l%n%m%n # 输出DEBUG 级别以上的日志到D://WorkSpace/logs/debug.log log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = D://WorkSpace/logs/debug.log log4j.appender.D.Append = true log4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayout # 打印DEBUG信息格式 log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n # 输出ERROR 级别以上的日志到=D://WorkSpace/logs/error.log log4j.appender.E = org.apache.log4j.DailyRollingFileAppender log4j.appender.E.File =D://WorkSpace/logs/error.log log4j.appender.E.Append = true log4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayout # 打印ERROR信息格式 log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n ~~~ ### 3.使用日志 ~~~ package com.qunar.sjf; import org.apache.log4j.Logger; public class ImportMost { private static Logger logger = Logger.getLogger(ImportMost.class); public static void main(String[] args) { // debug级别的信息 logger.debug("This is a debug"); // info级别的信息 logger.info("This is a info"); // error级别的信息 logger.error("This is a error"); } } ~~~ ### 4.输出信息 4.1 控制台输出信息 <table cellspacing="0" cellpadding="0" style="margin:8px 0px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:852px"><tbody><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:835px"><br/><br/><div style="margin:0px"><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">[DEBUG] 2016-01-13 20:55:05, 622 method:com.qunar.sjf.ImportMost.main(<span style="color:rgb(0,0,128)"><u>ImportMost.java:10</u></span>)</span></div><div style="margin:0px"><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">This is a debug</span></div><div style="margin:0px"><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">[INFO ] 2016-01-13 20:55:05, 627 method:com.qunar.sjf.ImportMost.main(<span style="color:rgb(0,0,128)"><u>ImportMost.java:12</u></span>)</span></div><div style="margin:0px"><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">This is a info</span></div><div style="margin:0px"><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">[ERROR] 2016-01-13 20:55:05, 628 method:com.qunar.sjf.ImportMost.main(<span style="color:rgb(0,0,128)"><u>ImportMost.java:14</u></span>)</span></div><div style="margin:0px"><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">This is a error</span></div></td></tr></tbody></table> 4.2 后台日志 error.log: 2016-01-13 20:55:05  [ main:6 ] - [ ERROR ]  This is a error debug.log: 2016-01-13 20:55:05  [ main:0 ] - [ DEBUG ]  This is a debug 2016-01-13 20:55:05  [ main:5 ] - [ INFO ]  This is a info 2016-01-13 20:55:05  [ main:6 ] - [ ERROR ]  This is a error ### 5.Logger方法 Logger类提供了多种方法来处理日志活动。 Logger类不允许实例化一个新实例,但它可以通过两个静态方法获得一个 Logger 对象: ~~~ public static Logger getRootLogger(); public static Logger getLogger(String name); public static Logger getLogger(Class clazz); ~~~ 第一个方法返回根日志记录器,第二个方法根据给定额参数name检索日志记录器,第三个方法根据给定的Class对象返回日志记录器。 Logging 方法: 我们得到了一个日志记录器之后,可以使用日志记录器的几种方法来记录消息。 Logger类有专门用于打印日志信息方法。 <table cellspacing="0" cellpadding="0" style="margin:8px 0px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:852px"><tbody><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:409px">方法</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:409px">描述</td></tr><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">public void debug(Object message)</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">打印使用 Level.DEBUG 消息级别</td></tr><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">public void error(Object message)</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">打印使用 Level.ERROR 消息级别</td></tr><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">public void fatal(Object message)</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">打印使用 Level.FATAL 消息级别</td></tr><tr><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">public void info(Object message)</td><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">打印使用 Level.INFO 消息级别</td></tr><tr><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">public void warn(Object message)</td><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">打印使用 Level.WARN 消息级别</td></tr><tr><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">public void trace(Object message)</td><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">打印使用Level.TRACE消息级别</td></tr></tbody></table> 所有的级别定义在org.apache.log4j.Level类中,并且任何上述方法都可以调用如下: ### 6.日志级别 org.apache.log4j.Level类提供以下级别,但也可以通过Level类的子类自定义级别。 | 级别 | 描述 | |-----|-----| | ALL | 最低级别,打开所有日志级别 | | DEBUG | 细粒度信息事件,对应用程序调试最有用 | | ERROR | 错误事件,可能仍然允许应用程序继续运行 | | FATAL | 非常严重的错误事件,这可能导致应用程序中止 | | INFO | 指定能够突出在粗粒度级别的应用程序运行情况的信息的消息 | | OFF | 最高级别,关闭日志记录 | | TRACE | 细粒度比DEBUG更低的信息事件 | | WARN | 具有潜在危害的情况 | 对于标准级别关系如下:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF。ALL是最低级别,OFF是最高级别。 如果设置日志级别为a,则在记录日志时日志级别b可以启用,必须满足b >= a这一条件。 下面的例子明确指出如何可以过滤所有的DEBUG和INFO消息。这个程序使用记录并执行setLevel(Level.X)方法来设置所需的日志记录级别: ~~~ package com.qunar.sjf; import org.apache.log4j.Level; import org.apache.log4j.Logger; public class ImportMost { private static Logger logger = Logger.getLogger(ImportMost.class); public static void main(String[] args) { // 设置日志记录器级别 logger.setLevel(Level.WARN); // 日志信息 logger.trace("Trace Message!"); logger.debug("Debug Message!"); logger.info("Info Message!"); logger.warn("Warn Message!"); logger.error("Error Message!"); logger.fatal("Fatal Message!"); } } ~~~ 运行结果: <table cellspacing="0" cellpadding="0" style="margin:8px 0px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:852px"><tbody><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:835px"><br/><div style="margin:0px"><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">[WARN ] 2016-01-13 21:36:37, 967 method:com.qunar.sjf.ImportMost.main(<span style="color:rgb(0,0,128)"><u>ImportMost.java:15</u></span>)</span></div><div style="margin:0px"><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">Warn Message!</span></div><div style="margin:0px"><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">[ERROR] 2016-01-13 21:36:37, 967 method:com.qunar.sjf.ImportMost.main(<span style="color:rgb(0,0,128)"><u>ImportMost.java:16</u></span>)</span></div><div style="margin:0px"><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">Error Message!</span></div><div style="margin:0px"><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">[FATAL] 2016-01-13 21:36:37, 967 method:com.qunar.sjf.ImportMost.main(<span style="color:rgb(0,0,128)"><u>ImportMost.java:17</u></span>)</span></div><div style="margin:0px"><span style="font-size:14pt; color:windowtext; font-family:微软雅黑">Fatal Message!</span></div></td></tr></tbody></table> ### 7.日志格式化 Apache log4j提供了各种布局对象,每一个对象都可以根据各种布局格式记录数据。在层次结构中的顶级类是抽象类是org.apache.log4j.Layout,是所有其他布局类的基类。由于是抽象类,我们分不能直接使用Layout,而是使用Layout的子类。 (1)DateLayout (2)HTMLLayout (3)PatternLayout (4)SimpleLayout (5)XMLLayout <table cellspacing="0" cellpadding="0" style="margin:8px 0px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:852px"><tbody><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:409px"><strong>方法</strong></td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:409px"><strong>描述</strong></td></tr><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px"><span style="font-size:1rem">format()</span></td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px"><span style="font-size:14px; line-height:22px">将LoggingEvent类中的信息格式化成一行日志。</span></td></tr><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px"><span style="font-size:14px; line-height:22px">getContentType()</span></td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px"><span style="font-size:14px; line-height:22px">定义日志文件的内容类型,目前在Log4J中只是在SMTPAppender中用到,用于设置发送邮件的邮件内容类型。而Layout本身也只有HTMLLayout实现了它。</span></td></tr><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px"><span style="font-size:14px; line-height:22px">getHeader()</span></td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px"><span style="font-size:14px; line-height:22px">定义日志文件的头,目前在Log4J中只是在HTMLLayout中实现了它。</span></td></tr><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px"><span style="font-size:14px; line-height:22px">getFooter()</span></td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px"><span style="font-size:14px; line-height:22px">定义日志文件的尾,目前在Log4J中只是HTMLLayout中实现了它。</span></td></tr><tr><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px"><span style="font-size:14px; line-height:22px">ignoresThrowable()</span></td><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px"><span style="font-size:14px; line-height:22px">定义当前layout是否处理异常类型。在Log4J中,不支持处理异常类型的有:TTCLayout、PatternLayout、SimpleLayout。</span></td></tr></tbody></table> 7.1 HTMLLayout 如果想生成一个HTML格式的日志文件,可以使用HTMLLayout 布局格式。HTMLLayout类扩展抽象org.apache.log4j.Layout类,并覆盖其基类的 format()方法来提供HTML样式格式。 这提供了以下信息显示: - 生成特定的日志事件之前,从应用程序的开始所经过的时间(Time) - 调用该记录请求的线程的名称(Thread) - 与此记录请求相关联的级别(Level) - 日志记录器(Logger)和记录消息的名称(Message) - 可选程序文件的位置信息,并从其中记录被调用的行号(Category 和 Line) | **方法** | **描述** | |-----|-----| | void setContentType(String) | 设置 HTML 的内容类型,默认为 text/html | | void setLocationInfo(String) | 设置日志事件的位置信息(所在目录,所在行数等)。 | | void setTitle(String) | 设置 HTML 文件的标题,默认为 Log4j Log Messages。 | 实例: ~~~ package com.qunar.log; import org.apache.log4j.Logger; public class HtmlLayoutDemo { // 日志记录器 private static Logger logger = Logger.getLogger(HtmlLayoutDemo.class); public static void main(String[] args) { logger.debug("this is an debug message"); logger.info("this is an info message"); } } ~~~ 配置文件: ~~~ # Define the root logger with appender file log = D://WorkSpace/logs/ log4j.rootLogger = debug, FILE # Define the file appender log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=${log}HtmlLayoutDemo.html # Define the layout for file appender log4j.appender.FILE.layout=org.apache.log4j.HTMLLayout log4j.appender.FILE.layout.Title=HTML Layout Demo log4j.appender.FILE.layout.LocationInfo=true ~~~ 日志输出: ![](https://box.kancloud.cn/2016-03-18_56eba2a89f7fe.jpg) 7.2 PatternLayout 如果您希望基于某种模式生成特定格式的日志信息,可使用 org.apache.Log4j.PatternLayout 格式化您的日志信息。PatternLayout 继承自抽象类 org.apache.Log4j.Layout,覆盖了其 format() 方法,通过提供的模式,来格式化日志信息。 设置转换模式,默认为** %r [%t] %p %c %x - %m%n**。 下面的表格解释了上面模式中用到的字符,以及所有定制模式时能用到的字符: | **模式字符** | **含义** | |-----|-----| | c | 为输出的日志事件分类,比如对于分类 "a.b.c",模式 %c{2} 会输出 "b.c" 。 | | C | 输出发起记录日志请求的类的全名。比如对于类 "org.apache.xyz.SomeClass",模式 %C{1} 会输出 "SomeClass"。 | | d | 输出记录日志的日期,比如 %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}。 | | F | 输出文件名。 | | l | 输出生成日志的调用者的位置信息。 | | L | 输出发起日志请求的行号。 | | m | 输出和日志事件关联的,由应用提供的信息。 | | M | 输出发起日志请求的方法名。 | | n | 输出平台相关的换行符。 | | p | 输出日志事件的优先级。 | | r | 输出从构建布局到生成日志事件所花费的时间,以毫秒为单位。 | | t | 输出生成日志事件的线程名。 | | x | 输出和生成日志事件线程相关的 NDC (嵌套诊断上下文)。 | | X | 该字符后跟 MDC 键,比如 X{clientIP} 会输出保存在 MDC 中键 clientIP 对应的值。 | | % | 百分号, %% 会输出一个 %。 | 缺省情况下,信息保持原样输出。但是借助格式修饰符的帮助,就可调整最小列宽、最大列宽以及对齐。 <table cellspacing="0" cellpadding="0" style="margin:8px 0px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:852px"><tbody><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center"><strong>格式修饰符</strong></td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center"><strong>左对齐</strong></td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center"><strong>最小宽度</strong></td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center"><strong>最大宽度</strong></td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center"><strong>含义</strong></td></tr><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">%20c</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">否</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">20</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">无</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">如果列名少于 20 个字符,左边使用空格补齐(右对齐)</td></tr><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">%-20c</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">是</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">20</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">无</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">如果列名少于 20 个字符,右边使用空格补齐(左对齐)。</td></tr><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">%.30c</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">不适用</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">无</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">30</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">如果列名长于 30 个字符,从开头去除。</td></tr><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">%20.30c</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">否</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">20</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">30</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">如果列名少于 20 个字符,左边使用空格补齐(右对齐);<br/>如果列名长于 30 个字符,从开头去除。</td></tr><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">%-20.30c</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">是</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">20</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">30</td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187)">如果列名少于 20 个字符,右边使用空格补齐(左对齐);<br/>如果列名长于 30 个字符,从开头去除。</td></tr></tbody></table> 实例: ~~~ package com.qunar.log; import org.apache.log4j.Logger; public class PatternLayoutDemo { // 日志记录器 private static Logger logger = Logger.getLogger(PatternLayoutDemo.class); public static void main(String[] args) { logger.debug("this is an debug message"); logger.info("this is an info message"); } } ~~~ 配置文件: ~~~ log4j.rootLogger = DEBUG, FILE log4j.appender.FILE=org.apache.log4j.FileAppender # 日志存储位置 log4j.appender.FILE.File=D:/WorkSpace/logs/log.out # 追加方式写入文件 log4j.appender.FILE.Append=true # 日志布局方式 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout # 日志格式 log4j.appender.FILE.layout.conversionPattern=%d{yyyy-MM-dd}-%t-%x-%-p-%-10c-%n%m%n ~~~ 日志输出 log.out: 2016-01-16-main--DEBUG-com.qunar.log.PatternLayoutDemo- this is an debug message 2016-01-16-main--INFO-com.qunar.log.PatternLayoutDemo- this is an info message ### 8.日志写到文件 8.1 FileAppender 日志记录到文件中,主要用到FileAppender类。FileAppender继承自WriterAppender。 FileAppender配置: | **属性** | **描述** | |-----|-----| | ImmediateFlush | 默认设置为true,表示所有消息都会被立即输出,设为false则不输出 | | Encoding | 编码格式。它可以使用任何字符编码。默认情况下是特定于平台的编码方案 | | Threshold | 写入文件的日志级别。 | | Filename | 日志文件名称。 | | Append | 默认设置为true,以追加的方式把日志写入文件。 | | BufferedIO | 默认设置为false,表示是否需要写入缓存启用。 | | BufferSize | 默认设置为8KB,如果 bufferedI/O 启用,表示缓冲区的大小, | 实例: ~~~ package com.qunar.log; import org.apache.log4j.Logger; public class PatternLayoutDemo { // 日志记录器 private static Logger logger = Logger.getLogger(PatternLayoutDemo.class); public static void main(String[] args) { logger.debug("this is an debug message"); logger.info("this is an info message"); } } ~~~ 配置文件: ~~~ log4j.rootLogger = DEBUG, FILE log4j.appender.FILE=org.apache.log4j.FileAppender # 日志存储位置 log4j.appender.FILE.File=D:/WorkSpace/logs/log.out # 表示所有消息都会被立即输出,设为false则不输出 log4j.appender.FILE.ImmediateFlush=true # 写入的日志级别 log4j.appender.FILE.Threshold=info # 追加方式写入文件 log4j.appender.FILE.Append=true # 日志布局方式 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout # 日志格式 log4j.appender.FILE.layout.conversionPattern=%d{yyyy-MM-dd}-%t-%x-%-p-%-10c-%n%m%n ~~~ 日志输出(注意:只有输出info信息  与配置文件设置有关): 2016-01-16-main--INFO-com.qunar.log.PatternLayoutDemo- this is an info message 8.2 RollingFileAppender 当想要写日志信息转化多个文件要求一样,例如,如果文件大小达到一定的阈值等。 写日志记录信息分成多个文件,必须扩展FileAppender类,并继承其所有属性org.apache.log4j.RollingFileAppender类。有以下除了已如上所述为 FileAppender 可配置参数: | **属性** | **描述** | |-----|-----| | maxFileSize | 默认值是10MB,文件的回滚临界尺寸。 | | maxBackupIndex | 默认值是1,创建的备份文件的数量。 | 实例: ~~~ package com.qunar.log; import org.apache.log4j.Logger; public class PatternLayoutDemo { // 日志记录器 private static Logger logger = Logger.getLogger(PatternLayoutDemo.class); public static void main(String[] args) { for(int i = 0;i < 15;++i){ logger.debug("this is an debug message:" + i); }//for } } ~~~ 配置文件: ~~~ log4j.rootLogger = DEBUG, FILE log4j.appender.FILE=org.apache.log4j.RollingFileAppender # 日志存储位置 log4j.appender.FILE.File=D:/WorkSpace/logs/log.out # 日志回滚最大值 log4j.appender.FILE.MaxFileSize=1KB # 日志文件备份个数 log4j.appender.FILE.MaxBackupIndex=1 # 日志布局方式 log4j.appender.FILE.layout=org.apache.log4j.PatternLayout # 日志格式 log4j.appender.FILE.layout.conversionPattern=%d{yyyy-MM-dd}-%t-%x-%-p-%-10c-%n%m%n ~~~ 此示例配置说明每个日志文件的最大值为1KB。最开始创建日志文件log.out,当超过日志文件最大值时,log.out.1新的日志文件将被创建。同时,log.out中的日志转移到log.out.1中(备份文件设置为1)。log.out日志文件永远写入最新日志。 日志输出: ![](https://box.kancloud.cn/2016-03-18_56eba2a8b0990.jpg) ![](https://box.kancloud.cn/2016-03-18_56eba2a8c0c9c.jpg) ![](https://box.kancloud.cn/2016-03-18_56eba2a8d0b18.jpg) ![](https://box.kancloud.cn/2016-03-18_56eba2a8e54c1.jpg) 8.3 DailyRollingFileAppender 如果想它能够按一定的时间频率滚动日志记录文件,以保持日志记录信息的良好记录,就必须它扩展FileAppender类,并继承其所有属性useorg.apache.log4j.DailyRollingFileAppender类。 在DailyRollingFileAppender中可以指定monthly(每月)、 weekly(每周)、daily(每天)、half-daily(每半天)、hourly(每小时)和minutely(每分钟)六个频度,这是通过为 DatePattern选项赋予不同的值来完成的。DatePattern选项的有效值为: <table cellspacing="0" cellpadding="0" style="margin:8px 0px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:852px"><tbody><tr><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:409px"><span style="text-align:start"><strong>DatePattern</strong></span><strong>属性</strong></td><td style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); text-align:center; width:409px"><strong>描述</strong></td></tr><tr><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">'.'yyyy-MM</td><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">对应monthly(每月)</td></tr><tr><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">'.'yyyy-ww</td><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">对应weekly(每周)</td></tr><tr><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">'.'yyyy-MM-dd</td><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">对应daily(每天)</td></tr><tr><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">'.'yyyy-MM-dd-a</td><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">对应half-daily(每半天)</td></tr><tr><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">'.'yyyy-MM-dd-HH</td><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">对应hourly(每小时)</td></tr><tr><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">'.'yyyy-MM-dd-HH-mm</td><td colspan="1" style="padding:4px 8px; border-collapse:collapse; border:1px solid rgb(187,187,187); width:409px">对应minutely(每分钟)</td></tr></tbody></table> DatePattern中不用处理的文字要放到单引号(')中,如上面的(**.**)。如果您对此有疑问可以查阅SimpleDateFormat的文档。DailyRollingFileAppender中使用这个类来处理DatePattern。 日志文件输出结果: ![](https://box.kancloud.cn/2016-03-18_56eba2a903b26.jpg) ### 9.日志输出到数据库中 log4j API提供 org.apache.log4j.jdbc.JDBCAppender 对象,它能够将日志信息在指定的数据库。 | **属性** | **含义** | |-----|-----| | driver | 设置驱动程序类为指定的字符串。如果没有指定驱动程序类,默认为sun.jdbc.odbc.JdbcOdbcDriver | | url | 设置JDBC URL | | layout | 设置要使用的布局。默认布局org.apache.log4j.PatternLayout | | user | 数据库用户名 | | password | 数据库密码 | | sql | 指定SQL语句在每次记录事件发生的时间执行。这可能是INSERT,UPDATE或DELETE | | bufferSize | 设置缓冲区的大小。默认大小为1 | 数据库设置: 创建存储日志的表: ~~~ CREATE TABLE LOGS (ID VARCHAR(20) NOT NULL, TIME DATE NOT NULL, LOGGER VARCHAR(50) NOT NULL, LEVEL VARCHAR(10) NOT NULL, MESSAGE VARCHAR(1000) NOT NULL ); ~~~ ![](https://box.kancloud.cn/2016-03-18_56eba2a914660.jpg) 日志配置文件: ~~~ log4j.rootLogger = DEBUG, DB log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender # url链接 log4j.appender.DB.URL=jdbc:mysql://localhost/test # 驱动 log4j.appender.DB.driver=com.mysql.jdbc.Driver # 用户名 log4j.appender.DB.user=root # 密码 log4j.appender.DB.password=root # 日志插入数据库 %d 日期 %C 类名 %p 优先级 %m 日志信息 log4j.appender.DB.sql=INSERT INTO LOGS VALUES('%t','%d{yyyy-MM-dd}','%C','%p','%m') # 日志布局方式 log4j.appender.DB.layout=org.apache.log4j.PatternLayout ~~~ 程序文件: ~~~ package com.qunar.log; import org.apache.log4j.Logger; public class JDBCAppenderDemo { // 日志记录器 private static Logger logger = Logger.getLogger(JDBCAppenderDemo.class); public static void main(String[] args) { for(int i = 0;i < 5;++i){ logger.debug("this is an debug message:" + i); }//for } } ~~~ 必须添加mysql的驱动jar包:[点击打开链接](http://download.csdn.net/detail/sunnyyoona/9412989) 运行结果: ![](https://box.kancloud.cn/2016-03-18_56eba2a929445.jpg)