打印日志小结

来源:互联网 发布:淘宝致一科技 编辑:程序博客网 时间:2024/06/05 05:06

 

日志常用的五个级别:

 

DEBUG :为程序的调试信息,最低级一般不输出,随意使用,任何有利与在调试的时候,了解系统状态的东西,比如变量之类,都可以输出看看


INFO :为一般要显示的信息,比如登录登出当前状态给最终用户的,所以内容要看的明白


ERROR:为严重错误 主要是程序的错误


WARN :为一般警告,比如session丢失


FATAL:崩溃,整个程序终止运行

 

Log4j由三个重要的组件构成:日志信息的优先级,日志信息的输出目的地,日志信息的输出格式。

 

 

需要导入log4j-1.2.17.jar包

Log4j 获得logger对象

在一个对象中通常只使用一个Logger对象,Logger应该是static final的,只有在少数需要在构造函数中传递logger的情况下才使用private final。

 

public class A {  

private static Logger logger = Logger.getLogger(A.class);

}

Log4j 实例

package com.skyon.sql;

 

import java.sql.CallableStatement;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.SQLException;

 

import org.apache.log4j.Logger;

/**

 * 调用oracle存储过程

 * @author 余茂元

 *

 */

public class Procddure {

private static Loggerlogger = Logger.getLogger(Procddure.class);

public static void main(String[]args) {

//进入方法

logger.debug(System.currentTimeMillis()+"entering main ");

Connection conn=null;

try {

//加载驱动

Class.forName(ConstantFile.getValueByKey("jdbc"));

//获取连接

           conn=DriverManager.getConnection(ConstantFile.getValueByKey("url"),

ConstantFile.getValueByKey("username"),

ConstantFile.getValueByKey("password"));

System.out.println(conn);

if(conn==null){

logger.error(System.currentTimeMillis()+"get empty conn,check!!!");

}else{

//获取存储过程对象

CallableStatement c=conn.prepareCall("call wtf(?)");

logger.info(System.currentTimeMillis()+":"+c);

//给存储过程中的参数赋值

c.setString(1, ConstantFile.getValueByKey("id_no"));

//执行存储过程

c.execute();

}

} catch (Exception e) {

/**

 * 异常通常不写e.printStackTrace();

 */

Logger.error(e.getMessage);//错误

Logger.error(something,e.getMessage);错误

//上面两种输出方式会丢失最重要的StackTrace信息

logger.error(System.currentTimeMillis()+"conn fail",e);

//不允许记录日志后再抛出异常,会导致多次记录,日志只允许记录一次

Throw new Exception(something,e);

//不允许出现System.out.println(e.Message);不允许出现e.printStackTrance();

}finally{

if(conn!=null){

try {

//关闭连接

conn.close();

} catch (SQLExceptione) {

e.printStackTrace();

}

}

}

}

}

Log4j配置文件log4j.proerpties文件,放在src/main/resource下面,不用配置,log4j框架会自动寻找并加载

Log4j.properties配置模板

# Root Logger

#可同时指定多个目的地 consolesqlhtml

log4j.rootLogger=debug,file

#log4j.rootLogger=file

#\u81EA\u5B9A\u4E49\u65E5\u5FD7\u8BB0\u5F55\u5668\uFF08\u533A\u5206\u5927\u5C0F\u5199\uFF09

#\u5BF9\u6307\u5B9A\u547D\u540D\u7A7A\u95F4\u4E2D\u7684\u8BED\u53E5\u8FDB\u884C\u65E5\u5FD7\u8BB0\u5F55

#log4j.logger.com.company.mybatisdemo.dao.MyadminDAO=error

#\u5BF9\u6307\u5B9A\u8BED\u53E5\u8FDB\u884C\u65E5\u5FD7\u8BB0\u5F55

#log4j.logger.com.company.mybatisdemo.dao.MyadminDAO.get=error

 

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

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

#log4j.appender.console.layout.ConversionPattern=%5p [%t] - %m%n

#输出到文件

log4j.appender.file=org.apache.log4j.DailyRollingFileAppender

#按指定的格式输出

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

#指定输出格式

log4j.appender.toFile.layout.ConversionPattern=%d %p [%c %M] %m %n

#文件会自动生成,直接指定路径即可

log4j.appender.file.File=E:\\error.log

 

输出到数据库
lo4j.rootLogger=debug,toJDBC

#输出到数据库
log4j.appender.toJDBC=org.apache.log4j.jdbc.JDBCAppender

#指明输出的格式
log4j.appender.toJDBC.layout=org.apache.log4j.PatternLayout

#数据源在数据库输出格式
log4j.appender.toJDBC.layout.ConversionPattern=%d %p [%c %M] %m %n

#指明驱动
log4j.appender.toJDBC.driver=net.sourceforge.jtds.jdbc.Driver

#数据库URL
log4j.appender.toJDBC.URL=jdbc:jtds:sqlserver://localhost:1433/pet

#数据库用户名
log4j.appender.toJDBC.user=sa

#数据库密码
log4j.appender.toJDBC.password=sa

#指定数据库sql语句
log4j.appender.toJDBC.sql=insert into loginfo(log4jinfo) values('%d %p [%c %M] %m %n')

 

输出到控制台,输出的是调试的信息

log4j.rootLogger=debug,toCon,


#配置Appendder的全路径ConsoleAppender:输出到控制台
log4j.appender.toCon=org.apache.log4j.ConsoleAppender


#说明输出的格式:SimpleLayout 简单格式,只有信息和级别的输出
log4j.appender.toCon.layout=org.apache.log4j.SimpleLayout

 

输出到网页
log4j.rootLogger=debug,html

#输出到HTML
log4j.appender.html=org.apache.log4j.DailyRollingFileAppender

#按指定的格式输出
log4j.appender.html.layout=org.apache.log4j.HTMLLayout

#指定输出格式
#log4j.appender.toFile.layout.ConversionPattern=%d %p [%c %M] %m %n

#指定文件输出文件路径
log4j.appender.html.file=Html/b.html

 

使用log

 

应该在程序的哪些地方添加日志的输出?

系统启动参数、环境变量 

异常捕获处

调用函数时(函数的进出,需要的话查看变量的变化等)

关键操作增删改查

所有输入输出处,无论是从文件输入还是从网络等其他地方输入,执行命令处

 

异常处理处(捕获异常后,不要e.printStackTrace()logger.error输入到日志里面

注:大部分人在程序里面会去写logger.error(exception),其实这个时候log4j会去把这个exception tostring。真正的写法应该是logger(message.exception);

 

输出什么内容?

通常情况下在程序日志里记录一些比较有意义的状态数据:程序启动,退出的时间点;程序运行消耗时间;耗时程序的执行进度;重要变量的状态变化。除此之外,在公共的日志里规避打印程序的调试或者提示信息。

日志性能的考虑,如果代码为核心代码,执行频率非常高,则输出日志建议增加判断,尤其是低级别的输出<debug、info、warn>。

debug日志太多后可能会影响性能,有一种改进方法是:

If(Logger.isDebugEnabled){

Logger.debug(something,object);
}

 

 

 

原创粉丝点击