[Java开发之路](16)学习log4j日志

# 设置log4j.rootLogger = debug,stdout,D,E# 输出信息到控制台log4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.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.loglog4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = D://WorkSpace/logs/debug.loglog4j.appender.D.Append = truelog4j.appender.D.Threshold = DEBUGlog4j.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.loglog4j.appender.E = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File =D://WorkSpace/logs/error.loglog4j.appender.E.Append = truelog4j.appender.E.Threshold = ERRORlog4j.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
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");}}
|
[DEBUG] 2016-01-13 20:55:05, 622 method:com.qunar.sjf.ImportMost.main(ImportMost.java:10)
This is a debug
[INFO ] 2016-01-13 20:55:05, 627 method:com.qunar.sjf.ImportMost.main(ImportMost.java:12)
This is a info
[ERROR] 2016-01-13 20:55:05, 628 method:com.qunar.sjf.ImportMost.main(ImportMost.java:14)
This is a error
|
public static Logger getRootLogger();public static Logger getLogger(String name);public static Logger getLogger(Class clazz);
| 方法 | 描写叙述 |
| public void debug(Object message) | 打印使用 Level.DEBUG 消息级别 |
| public void error(Object message) | 打印使用 Level.ERROR 消息级别 |
| public void fatal(Object message) | 打印使用 Level.FATAL 消息级别 |
| public void info(Object message) | 打印使用 Level.INFO 消息级别 |
| public void warn(Object message) | 打印使用 Level.WARN 消息级别 |
| public void trace(Object message) | 打印使用Level.TRACE消息级别 |
| 级别 | 描写叙述 |
|---|---|
| ALL | 最低级别,打开全部日志级别 |
| DEBUG | 细粒度信息事件。相应用程序调试最实用 |
| ERROR | 错误事件。可能仍然同意应用程序继续执行 |
| FATAL | 很严重的错误事件。这可能导致应用程序中止 |
| INFO | 指定可以突出在粗粒度级别的应用程序执行情况的信息的消息 |
| OFF | 最高级别,关闭日志记录 |
| TRACE | 细粒度比DEBUG更低的信息事件 |
| WARN | 具有潜在危害的情况 |
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!");}}
|
[WARN ] 2016-01-13 21:36:37, 967 method:com.qunar.sjf.ImportMost.main(ImportMost.java:15)
Warn Message!
[ERROR] 2016-01-13 21:36:37, 967 method:com.qunar.sjf.ImportMost.main(ImportMost.java:16)
Error Message!
[FATAL] 2016-01-13 21:36:37, 967 method:com.qunar.sjf.ImportMost.main(ImportMost.java:17)
Fatal Message!
|
在层次结构中的顶级类是抽象类是org.apache.log4j.Layout,是全部其它布局类的基类。
因为是抽象类。我们分不能直接使用Layout,而是使用Layout的子类。
| 方法 | 描写叙述 |
| format() | 将LoggingEvent类中的信息格式化成一行日志。 |
| getContentType() |
定义日志文件的内容类型。眼下在Log4J中仅仅是在SMTPAppender中用到,用于设置发送邮件的邮件内容类型。
而Layout本身也仅仅有HTMLLayout实现了它。 |
| getHeader() | 定义日志文件的头,眼下在Log4J中仅仅是在HTMLLayout中实现了它。 |
| getFooter() | 定义日志文件的尾,眼下在Log4J中仅仅是HTMLLayout中实现了它。 |
| ignoresThrowable() | 定义当前layout是否处理异常类型。在Log4J中,不支持处理异常类型的有:TTCLayout、PatternLayout、SimpleLayout。 |
- 生成特定的日志事件之前,从应用程序的開始所经过的时间(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 filelog = D://WorkSpace/logs/log4j.rootLogger = debug, FILE# Define the file appenderlog4j.appender.FILE=org.apache.log4j.FileAppenderlog4j.appender.FILE.File=${log}HtmlLayoutDemo.html# Define the layout for file appenderlog4j.appender.FILE.layout=org.apache.log4j.HTMLLayoutlog4j.appender.FILE.layout.Title=HTML Layout Demolog4j.appender.FILE.layout.LocationInfo=true

PatternLayout 继承自抽象类 org.apache.Log4j.Layout。覆盖了其 format() 方法,通过提供的模式,来格式化日志信息。
| 模式字符 | 含义 |
| 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 相应的值。 |
| % | 百分号, %% 会输出一个 %。 |
| 格式修饰符 | 左对齐 | 最小宽度 | 最大宽度 | 含义 |
| %20c | 否 | 20 | 无 | 假设列名少于 20 个字符,左边使用空格补齐(右对齐) |
| %-20c | 是 | 20 | 无 | 假设列名少于 20 个字符,右边使用空格补齐(左对齐)。 |
| %.30c | 不适用 | 无 | 30 | 假设列名长于 30 个字符,从开头去除。 |
| %20.30c | 否 | 20 | 30 |
假设列名少于 20 个字符,左边使用空格补齐(右对齐)。 假设列名长于 30 个字符。从开头去除。 |
| %-20.30c | 是 | 20 | 30 |
假设列名少于 20 个字符。右边使用空格补齐(左对齐); 假设列名长于 30 个字符,从开头去除。 |
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, FILElog4j.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
| 属性 | 描写叙述 |
| 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, FILElog4j.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
有下面除了已如上所述为 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, FILElog4j.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
最開始创建日志文件log.out,当超过日志文件最大值时,log.out.1新的日志文件将被创建。同一时候,log.out中的日志转移到log.out.1中(备份文件设置为1)。
log.out日志文件永远写入最新日志。




DatePattern选项的有效值为:
| DatePattern属性 | 描写叙述 |
| '.'yyyy-MM | 相应monthly(每月) |
| '.'yyyy-ww | 相应weekly(每周) |
| '.'yyyy-MM-dd | 相应daily(每天) |
| '.'yyyy-MM-dd-a | 相应half-daily(每半天) |
| '.'yyyy-MM-dd-HH | 相应hourly(每小时) |
| '.'yyyy-MM-dd-HH-mm | 相应minutely(每分钟) |

| 属性 | 含义 |
| driver | 设置驱动程序类为指定的字符串。假设没有指定驱动程序类,默觉得sun.jdbc.odbc.JdbcOdbcDriver |
| url | 设置JDBC URL |
| layout | 设置要使用的布局。默认布局org.apache.log4j.PatternLayout |
| user | 数据库username |
| password | 数据库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);

log4j.rootLogger = DEBUG, DBlog4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender# url链接log4j.appender.DB.URL=jdbc:mysql://localhost/test# 驱动log4j.appender.DB.driver=com.mysql.jdbc.Driver# usernamelog4j.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}}

[Java开发之路](16)学习log4j日志的更多相关文章
- Alibaba Java开发手册索引规约学习笔记
最近一段时间再看阿里巴巴 Java开发手册索引规约,写篇帖子总结一下,索引规约内容如下 为了通用,更为了避免造数据的痛苦,文中所涉及表.数据,均来自于MySQL官网提供的示例库employees,可通 ...
- Java web 自动备份数据库和log4j日志
利用监听自动备份 web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns: ...
- 【java开发】数组基本学习
一维数组 定义:具有相同数据类型的一组数据. 声明:int []a=new int[3]; 释义:该数组的数据类型为int型,该数组长度为3,有3个元素 可采用如下方式为元素赋值:a[0]=1; ...
- [Java开发之路](8)输入流和输出流
1. Java流的分类 按流向分: 输入流: 能够从当中读入一个字节序列的对象称作输入流. 输出流: 能够向当中写入一个字节序列的对象称作输出流. 这些字节序列的来源地和目的地能够是文件,并且通常都是 ...
- [Java开发之路](7)RandomAccessFile类具体解释
RandomAccessFile适用于大小已知的记录组成的文件.提供的对文件訪问.既能够读文件.也能够写文件,而且支持随机訪问文件.能够訪问文件的任何位置. 文件里记录的大小不一定都同样.仅仅要我们知 ...
- [Java开发之路](9)对象序列化与反序列化
1. 对象序列化 当你创建对象时.仅仅要你须要.它会一直存在,可是程序终止时,不管何时它都不会继续存在.虽然这样做是很有意义的,可是在某些情况下.假设程序不执行时扔能存在而且保存其信息,那将对我们很实 ...
- java开发之多线程需要学习和理解的东西
40个Java多线程问题总结 http://www.codeceo.com/article/40-java-thread-problems.html
- [Java开发之路](23)装箱与拆箱
1. 简单介绍 大家对基本数据类型都很熟悉.比如 int.float.double.boolean.char 等.基本数据类型是不具备对象的特性,比方基本类型不能调用方法.功能简单. ..,为了让基本 ...
- [Java开发之路](6)File类的使用
1. 构造方法 构造方法 描写叙述 File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建一个新的文件实例. File(String parent , String ...
随机推荐
- tail---显示文件中的尾部内容
tail命令用于输入文件中的尾部内容.tail命令默认在屏幕上显示指定文件的末尾10行.如果给定的文件不止一个,则在显示的每个文件前面加一个文件名标题.如果没有指定文件或者文件名为“-”,则读取标准输 ...
- 紫书 例题 10-5 UVa 12716 (枚举方式)
设gcd(a, b) = a xor b = c 那么我们可以证明c=a-b 那么同时c又是a的因子(c是a与b的最大公因数) 所以我们可以枚举c,然后枚举c的倍数,也就是a 有了a和c可以算出b为a ...
- vue2.0学习教程
十分钟上手-搭建vue开发环境(新手教程)https://www.jianshu.com/p/0c6678671635 如何在本地运行查看github上的开源项目https://www.jianshu ...
- unity 5.6.1 Oculus手柄输入问题
unity文档中提到 轴的 ID 是5和6,但是测试后发现,ID是6和7,很坑 void Update () { if (Input.GetKeyDown(KeyCode.JoystickButton ...
- 一 梳理 从 HDFS 到 MR。
MapReduce 不仅仅是一个工具,更是一个框架.我们必须拿问题解决方案去适配框架的 map 和 reduce 过程 很多情况下,需要关注 MapReduce 作业所需要的系统资源,尤其是集 ...
- 利用NSProxy解决NSTimer内存泄漏问题
之前写过一篇利用RunTime解决由NSTimer导致的内存泄漏的文章,最近和同事讨论觉得这样写有点复杂,然后发现有NSProxy这么好用的根类,根类,根类,没错NSProxy与NSObject一样是 ...
- 10010序列检测器的三段式状态机实现(verilog)
序列检测器是时序数字电路设计中经典的教学范例,夏宇闻的<verilog数字系统设计教程>一书中有这个例子,用verilog设计一个“10010”序列的检测器.看完后我觉得F和G两个状态多余 ...
- 在IIS中给某一个网站添加binding的坑
以http为例, 假如ip地址从局域网的地址172.31.212.20改为127.0.0.1 但是网站没法访问了http://172.31.212.20/chile.backoffice/ 必须通过 ...
- 直播聊天室,点亮效果,jquery实现
1.css #like_area img{ width: 30px; height: 30px; position: absolute; bottom: 100px; left: 60%; margi ...
- OpenCV与Socket实现树莓派获取摄像头视频至电脑
OpenCV能够为我们带来便捷的图像处理接口,但是其处理速度在一块树莓派上肯定是不尽如人意的.尤其当我们想要使用复杂的算法时,只能把算法托到服务器上才有可能.这里介绍了一种方法,实现树莓派传输Mat至 ...