1概述

一般的系统对程序的调试信息只进行了简单的粗放处理,将这些信息直接用System.out.println()语句输出到控制台中。由于在调度过程中程序员为了能够跟踪程序的运行情况往往将大量信息输出到控制台,而在调度成功后没有相应地将这些信息屏蔽掉,在程序部署运行后,往往一个简单的业务功能调用也会输出大容量的过程调度信息,一方面造成了大量IO的读写,占用硬盘空间,另一方面则因为日志量大,很难查找到运行期有用的日志信息。

程序异常,资源释放操作失败这些信息是发现程序问题,定位出错点的信息依据,得不到这些信息将导致程序错误被屏蔽,要想使问题浮出水面程序必须能够提供详细而简洁的日志信息。

?log4J是为java语言量身定做的一个日志模块,用统一的接口写日志,通过配置文件信息控制日志信息的输出格式、目的及输出级别(指定输出级别后,只有比输出级别更高的日志会被输出)。可以在不更改程序输出日志的情况下方便日志输出的控制,为日志的操作提供了很大的灵活性。

2 log4J的基本操作

2.1写日志的API

log4J将日志分为5个级别,从低到高分别是DEBUG,INFO,WARN,ERROR,FATAL,相应地log4J为记录这5个级别提供了5个方法,它们分别是:

public void debug(Object obj)

public void info(Object obj)

public void warn(Object obj)

public void error(Object obj)

public void fatal(Object obj)

同时每个方法还对应一个带Throwable入参的重载函数,用于将异常一并记录到日志中:

public void debug(Object obj,Throwable ex)

public void info(Object obj,Throwable ex)

public void warn(Object obj,Throwable ex)

public void error(Object obj,Throwable ex)

public void fatal(Object obj,Throwable ex)

5个级别记录信息的重要性依次提升,下面就每个记录方法对应的应用场合举例如下:

2.1.1 写日志API的使用示例

在程序中如何恰当级别的日志记录API记录日志信息是非常重要的,一般的我们将信息以其重要性调用将其划分为5个级别,分别调用相应的API来记录,我们以一个查询数据库的代码段来说明各级别的划分:

Connection conn = null;

String sqlStr = “select * from table1 where a=’”+a+”’”;

//测试变量是否正确,在调度时查看,以后不会用
logger.debug(“sqlStr字串为:”+sqlStr);

...

try

{

conn = DBBean.getConnection();

Statement stat = conn.createStatement();

ResultSet rs = stat.executeQuery(sqlStr);

if(rs.next())

{

logger.info(“有记录”);
           //查看程序运行中的信息,反映程序及配置信息的情况

}

else

{

logger.warn(“因配置要求至少要有一条记录,请核对配置信息。”);

//假设配置信息要求一条配置记录,当找不到记录时应该警告,
           //以并更改配置

}

}catch(SQLException e)

{

logger.error(“数据查询时发生异常”,e);

//发生了查询异常,可能是sqlStr语句的语法错误造成的

}

finally

{

try

{

if(conn != null)

{

conn.close();

conn = null;

}

}

catch(SQLException e)

{

logger.warn(“数据连接无法关闭,连接将无法释放”,e);

//数据连接无法关闭将导致资源泄漏,可能是系统原因产生的
           //如果持续产生这个问题,开发人员需要查明原因,
           //否则系统将因数据连接资源无法释放而崩溃

}

}

fatal日志级别是表示,一旦这个事情发生,系统即无法运行的情况。如系统有一个伺服线程,它如果崩溃后,系统服务无法正常运行,则此时可以用fatal()写日志:

try

{

while(true)

{

ServiceThread.run();

}

}

catch

{

logger.fatal("[SYS001]伺服线程异常终止");

}

2.1.2日志信息构成

通过配置,日志信息包括两部分,一部分是由日志引擎通过配置生成的信息,如信息来源的包、类、对应源码的行数,日志级别等信息,而另一部分是用户通过接口入参手工设置的对象信息,在写日志前,将调用对象的toString()将其转换成字符串。对于 error和fatal级别的日志,我们约定必须为每个日志指定错误日志的类型,错误的日志的类型和日志信息一起作为入参传入写日志引擎,错误类型用[]括起来。如:

logger.error(“[DB001]关闭数据连接时出错。”)

logger.fatal(“[HIB001]关闭Hibernate会话时发生异常。”);

logger.error(“[CFG001]审批流程配置信息不正确。”);

此外必须为每条日志类型构造说明字典:

错误编号

说明

产生原因

解决方法

DB001

关闭数据连接失败

数据连接打开的光标太多,会话因网络终止

仔细检查程序,查看该连接创建的Statement或PrepareStatemetn在用完后没有及时关闭。检查数据库的配置,或网络连接方面的硬件问题

HIB001

关闭Hibernate会话失败

会话对应的数据连接打开的光标太多,会话因网络终止

仔细检查程序,查看该会话对应的数据连接创建的Statement或PrepareStatemetn在用完后没有及时关闭。检查数据库的配置,或网络连接方面的硬件问题

CFG001

审批流程配置信息不正确

没有正确配置T_FLOW表的信息

每个流程在T_Flow表中都必须配置且只须配置一条配置信息,配置信息必须包括流程名、流程编号的信息,流程编号不能和其他流程编号重复。

3 log4J的配置

log4J通过一个配置文件决定输出日志的级别、目的以及格式,文件名为:log4j.properties

可以在web.xml中通过容器上下文参数指定该文件的地址:

logConfFile

WEB-INF/log4j.properties

相对于应用程序根目录

必须通过一个类读取该参数以初始化log4J的配置信息,我们在SysInit.java中设置该配置信息:

public void contextInitialized(ServletContextEvent sce) {???

System.out.println("初始化基于log4j的日志引擎...");

String prefix =sce.getServletContext().getRealPath("/");

String logFileConf = sce.getServletContext().getInitParameter("logConfFile");

PropertyConfigurator.configure(prefix+System.getProperty("file.separator")+logFileConf);

System.out.println("日志引擎就绪,日志配置文件位于"+prefix+System.getProperty("file.separator")+logFileConf+"/n");?

}

因为SysInit是实现容器监听器接口的类,这样在WEB容器初始化时,就会初始化该日志的配置信息.

log4J的配置文件内容如下:

log4j.rootLogger=DEBUG,R

#log4j.appender.A1=org.apache.log4j.ConsoleAppender

#log4j.appender.A1.layout=org.apache.log4j.PatternLayout

#log4j.appender.A1.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n

log4j.appender.R=org.apache.log4j.RollingFileAppender

log4j.appender.R.File=e:/tomcat/webLogs/log4j.log

log4j.appender.R.MaxFileSize=100KB

log4j.appender.R.MaxBackupIndex=1

log4j.appender.R.layout=org.apache.log4j.PatternLayout

log4j.appender.R.layout.ConversionPattern=%d %5p [%t] (%F:%L) - %m%n

该配置指定日志写入到 e:/tomcat/webLogs/log4j.log 文件中 , 大小为 100K, 以原文本方式写日志 , 日志信息中包括类名 , 方法名 , 行数等信息 .

[java]如何在项目中用好log4J写项目日志相关推荐

  1. java题库难_为什么平常写项目感觉java也不是那么难,一到面试刷题得时候感觉那么吃力呢。你们呢?...

    因为你平时写的代码可能大多数时候是和面试题无关的. 如果你日常工作就是解决面试题里的内容,那么就不会吃力了. 像楼上楼所说的,面试时是造飞机平时是开飞机 如果你平时也是造飞机那么就不会吃力了 说白了还 ...

  2. java中的final关键字(2013-10-11-163 写的日志迁移

    final关键字:修饰符,表示最后的.最终的 修饰类: 表示该类不能派生子类(不能被继承) 1.当不希望父类的的某个方法被子类覆盖(override)时,可以用final关键字来修饰. 2.当不希望类 ...

  3. 项目经历怎么写_这样写项目经历可以锦上添花

    昨天我们详细介绍了写好工作经历的5个技巧,在这些技巧中,最重要的是量化思维!今天再来说说困扰大家已久的项目经历是怎么回事! 为什么要写项目经历?大多数人写项目经历是因为求职网站上有这个模块的要求,如果 ...

  4. yaml for java_细数Java项目中用过的配置文件(YAML篇)

    灵魂拷问:YAML,在项目中用过没?它与 properties 文件啥区别? 目前 SpringBoot.SpringCloud.Docker 等各大项目.各大组件,在使用过程中几乎都能看到 YAML ...

  5. c读取ini配置文件_细数Java项目中用过的配置文件(ini 篇)

    Java 菜鸟,会把可变的配置信息写死在代码里:Java 老鸟,会把可变的配置信息提取到配置文件中.坊间流传这么一句非科学的衡量标准,来评判程序员的级别. 那么,项目中的配置信息,你平时都是怎样来实现 ...

  6. log日志java web_Javaweb项目中使用Log4j记录日志

    Log4j 是 Apache 的一个开放源代码项目,通过使用 Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI 组件.甚至是套接口服务器.NT 的事件记录器.UNIX Syslog ...

  7. 【Java EE】从零开始写项目【总结】

    从零开发项目概述 最近这一直在复习数据结构和算法,也就是前面发出去的排序算法八大基础排序总结,Java实现单向链表,栈和队列就是这么简单,十道简单算法题等等- 被虐得不要不要的,即使是非常简单有时候绕 ...

  8. IDEA为java项目中用到python的模块设置Python interpreter

    IDEA为java项目中用到python的模块设置Python interpreter Java项目中模块用到了python,没有为模块设置Python解释器,因此点击右上角Configure Pyt ...

  9. java后端简历项目经历_从面试官甄别项目经验的角度,说说如何在简历中写项目经验(Java后端方向)...

    在大多的JD(职位介绍)里,会写明该职位需要xx时间的相关经验,换句话说就是需要在简历中看到一定年限的相关商业项目经验,否则估计连面试的机会都没. 在本文里,不讨论这种门槛是否合理,而会以Java相关 ...

最新文章

  1. php查询记录是否存在,php – 插入查询检查是否存在记录 – 如果不存在,插入它...
  2. leetcod003 Longest_Substring_Without_Repeating
  3. 使用Spyder生成动态二维码遇到的问题 ImportError 、ValueError 、OSError
  4. C/C++:程序的内存分配方式
  5. python Django创建数据库时can't open file 'manage.py': [Errno 2] No such file or directory
  6. 宁夏公安打传销端窝点为春节保平安
  7. java页面代码下载_java 下载页面代码
  8. 设计模式之单例模式8种实现方式,其七:静态内部类
  9. 小学计算机打字比赛教案,小学信息技术二年级教案
  10. Spring连接数据库的几种常用的方式
  11. matlab报错索引超出数组范围
  12. html音乐播放器代码大全,关于HTML 音乐播放器代码|音乐播放器网页代码大全(转)...
  13. 一个前端开发者的mac装机清单
  14. twitter最多关注者_Twitter的10个最具创意的用途
  15. 推荐12个优秀的 HTML5 网站设计案例欣赏
  16. oracle drop怎么用,Oracle Drop Table
  17. 互联网新半场的流量生态——阿里云定向免流方案
  18. 计算机系单身率排行榜,今天6一波~单身率特高的那些大学专业排行榜!
  19. 微信小程序绘制canvas图片
  20. matlab tecplot data,MATLAB讀取TECPLOT笛卡爾網格三維流場數據

热门文章

  1. 程序媛审美测评——控制台256种颜色搭配及控制台改变界面颜色的方法
  2. 对于任一整数n,符号函数sign(n)的定义如下
  3. js实现中英文切换(jquery.i18n.js)
  4. OpenStack的产品化历程
  5. 学习笔记 | 建站流程
  6. SAP中参照采购协议发票校验时带出价格与协议当前价格不一致的案例分析
  7. Android App内打开淘宝详情页
  8. 【二十】 H.266/VVC | 仿射运动估计AMVP继承相邻块的运动信息函数 | addAffineMVPCandUnscaled函数
  9. 鸿蒙宴中的人物故事,鸿门宴简介_鸿门宴的主要人物和背景_鸿门宴的目的和结局是什么? - 趣历史...
  10. 老友记台词笔记S0101-ijk英语