有不少童鞋私信我一些在写代码时候遇到的问题,但是无法定位问题出在哪里,也没有日志记录,实际上,写日志是开发项目过程中很重要的一个环节,很多问题都可以从日志中找到根源,从而定位到出错位置,为解决问题提供了基础,同时,对于一些关键性的操作,比如:银行转账,机票预订的时候,记录下日志,方便查看相关信息。

下面,介绍一个日志框架log4j的使用。

1.下载

http://logging.apache.org/log4j/1.2/download.html
我下的版本是:log4j-1.2.17.zip
下载完成后,解压,导入log4j-1.2.17.jar到项目中

2.创建Logger对象

T.java

package com.hui.demo;

import org.apache.log4j.Logger;

public class T {
public static final Logger logger = Logger.getLogger(T.class); public void test() { }
}

3.为日志设定不同的级别

日志级别:debug < info < warn < error < fatal

也就是说,如果设置日志为某个级别,则日志记录大于等于这个级别类型的日志,例如:设置日志级别为warn,最后日志中会显示示:warn,error,fatal类别的日志。

T.java

package com.hui.demo;

import org.apache.log4j.Logger;

public class T {
public static final Logger logger = Logger.getLogger(T.class);
public void test() {
logger.debug("这是debug类别的日志");
logger.info("这是info类别的日志");
logger.warn("这是warn类别的日志");
logger.error("这是error类别的日志");
logger.fatal("这是fatal类别的日志");
}
}

4.编写日志的配置文件

在项目的src目录下建一个文件:log4j.properties

#日志的输出方式:ConsoleAppender为控制台输出
#另外log4j还提供其他的输出方式,例如:文件输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#日志的布局设置,参考log4j API
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#日志的格式设置
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
#rootLogger表示根目录下所有类的日志都打印出来
#DEBUG为日志级别,表示DEBUG以及大于DEBUG级别的日志全部输出
log4j.rootLogger=DEBUG,stdout

5.测试

TestLog4j.java
```
package com.hui.demo;

public class TestLog4j {

public static void main(String[] args) {

T t = new T();

t.test();

}

}

运行,可以看到控制台打印出日志信息。

2015-06-18 01:25:23,885 [main] DEBUG com.hui.demo.T - 这是debug类别的日志

2015-06-18 01:25:23,885 [main] INFO com.hui.demo.T - 这是info类别的日志

2015-06-18 01:25:23,885 [main] WARN com.hui.demo.T - 这是warn类别的日志

2015-06-18 01:25:23,885 [main] ERROR com.hui.demo.T - 这是error类别的日志

2015-06-18 01:25:23,885 [main] FATAL com.hui.demo.T - 这是fatal类别的日志


以上是一个把日志打印在控制台的例子。 <h2>另外一个例子</h2> T.java

package com.hui.demo;

import org.apache.log4j.Logger;

public class T {

public static final Logger logger = Logger.getLogger(T.class);

public int divide(int num1, int num2) {

int result = 0;

logger.debug("num1 = "+num1 + " num2 = "+ num2);

try {

result = num1/num2;

logger.debug("result is :"+ result);

} catch (Exception e) {

logger.error("出错了:"+e.getMessage());

}

return result;

}

}

TestLog4j.java

package com.hui.demo;

public class TestLog4j {

public static void main(String[] args) {

int a = 4;

int b = 2;

T t = new T();

t.divide(4, 0);

}

}

运行,打印出日志信息:

2015-06-18 01:53:24,855 [main] DEBUG com.hui.demo.T - num1 = 4 num2 = 0

2015-06-18 01:53:24,855 [main] ERROR com.hui.demo.T - 出错了:/ by zero

看到日志,问题就很清晰的定位到了。

童鞋们可以考虑以下拓展:
1.把日志打印到文件。
2.日志文件 按每天/按照固定大小 生成一份新的。
3.将日志框架应用到你们的项目中,在关键代码中加记录日志的操作。 <h2>参考资料:</h2>
log4j Manual: http://logging.apache.org/log4j/1.2/manual.html
log4j API : http://logging.apache.org/log4j/1.2/apidocs/index.html

【助教】浅析log4j的使用的更多相关文章

  1. log4j 实例 , 浅析

    一.新建log4j.propperties,放在工程的src目录下. #fileAppender log4j.rootCategory = DEBUG,file,consoleAppender log ...

  2. slf4j,log4j,logback 初步使用

    log4j,slf4j,logback简单介绍见 LogBack简易教程 Logback浅析 简单的将,slf4j是一个日志的框架,有各种日志的接口,但是并不包含实际的写日志的方法. log4j,lo ...

  3. 从底层源码浅析Mybatis的SqlSessionFactory初始化过程

    目录 搭建源码环境 POM依赖 测试SQL Mybatis全局配置文件 UserMapper接口 UserMapper配置 User实体 Main方法 快速进入Debug跟踪 源码分析准备 源码分析 ...

  4. SQL Server on Linux 理由浅析

    SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...

  5. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  6. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  7. netty5 HTTP协议栈浅析与实践

      一.说在前面的话 前段时间,工作上需要做一个针对视频质量的统计分析系统,各端(PC端.移动端和 WEB端)将视频质量数据放在一个 HTTP 请求中上报到服务器,服务器对数据进行解析.分拣后从不同的 ...

  8. Jvm 内存浅析 及 GC个人学习总结

    从诞生至今,20多年过去,Java至今仍是使用最为广泛的语言.这仰赖于Java提供的各种技术和特性,让开发人员能优雅的编写高效的程序.今天我们就来说说Java的一项基本但非常重要的技术内存管理 了解C ...

  9. 从源码浅析MVC的MvcRouteHandler、MvcHandler和MvcHttpHandler

    熟悉WebForm开发的朋友一定都知道,Page类必须实现一个接口,就是IHttpHandler.HttpHandler是一个HTTP请求的真正处理中心,在HttpHandler容器中,ASP.NET ...

随机推荐

  1. jQuery----各版本

    jQuery是一套跨浏览器的JavaScript库,简化HTML与JavaScript之间的操作.由John Resig在2006年1月的BarCamp NYC上发布第一个版本.目前是由 Dave M ...

  2. 基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!

    1.基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示 在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样 //设置方式1 glutInitDisplayMode (G ...

  3. C++ 虚函数的使用

    虚函数是C++中用于实现多态(polymorphism)的机制.核心理念就是通过基类访问派生类定义的函数.假设我们有下面的类层次: #include <iostream> using na ...

  4. HDU 4857 逃生(反向建边的拓扑排序+贪心思想)

    逃生 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...

  5. 开启路由转发 - route add -net 0.0.0.0 netmask 0.0.0.0 gateway 192.168.0.131 window tracert 追踪路由

    1.登录方式内网访问172.28.101.0/19网段的方法:在192.168.1.0/24网段的上网机器上,或在自己的操作机上加个192.168.1.0网段的ip,注意不要跟别人设置的冲突了,并添加 ...

  6. 允许Ubuntu系统下Mysql数据库远程连接

    第一步: vim /etc/mysql/my.cnf找到bind-address = 127.0.0.1 注释掉这行,如:#bind-address = 127.0.0.1 或者改为: bind-ad ...

  7. 20155301 Exp7 网络欺诈防范

    20155301 Exp7 网络欺诈防范 1.基础问题回答 (1)通常在什么场景下容易受到DNS spoof攻击 (2)在日常生活工作中如何防范以上两攻击方法 2.实践过程记录 简单应用SET工具建立 ...

  8. mfc CImageList和CListCtrl

    知识点: CImageList类的运用 CListCtrl添加图标 一.CImageList CImageList*SetImageList(CImageList*pImageList,int nIm ...

  9. ZeroMQ使用汇总

    ZeroMQ,史上最快的消息队列 —– ZMQ的学习和研究 ZeroMQ 的模式 [架构] ZeroMQ 深度探索(一)  消息队列ZeroMQ 服务端使用流程: void* m_Context; v ...

  10. vector 去重

    1.使用unique函数: sort(v.begin(),v.end()); v.erase(unique(v.begin(), v.end()), v.end()); //unique()函数将重复 ...