Jade Dungeon

log4j基础

日志有级别

debug < info < warn < error < fatal

默认就是这五个了,可以自己加新的级别,但正常情况下应该是用不着的。

在java程序中,记录不同级别日志的方法就是对应的:

log.debug("Debug info.");
log.info("Info info");
log.warn("Warn info");
log.error("Error info");
log.fatal("Fatal info"); 

日志有输出

输出适配器定义了日志输出的目标与输出的格式。输出的目标可以是控制台、文件、 邮件……

配置文件中配置一个输出到控制台的适配器:

log4j.appender.ConsoleInfo=org.apache.log4j.ConsoleAppender
log4j.appender.ConsoleInfo.Encoding=UTF-8
log4j.appender.ConsoleInfo.layout=org.apache.log4j.PatternLayout
log4j.appender.ConsoleInfo.layout.ConversionPattern=%d %-5p - %m%n 

再看一个输出到文件的:

log4j.appender.FileInfo=org.apache.log4j.RollingFileAppender
log4j.appender.FileInfo.Encoding=UTF-8
log4j.appender.FileInfo.layout=org.apache.log4j.PatternLayout
log4j.appender.FileInfo.layout.ConversionPattern=%d %-5p - %m%n
log4j.appender.FileInfo.File=./log-info.log
log4j.appender.FileInfo.MaxFileSize = 500KB
log4j.appender.FileInfo.MaxBackupIndex = 1 

日志有实例

log4j.rootLogger这个实例肯定是存在的(即使不配置它),默认的级别是DEBUG

自定义实例

logger实例的名字可以随便起。比如在java程序中:

Logger logger = Logger.getLogger("dao");
Logger logger = Logger.getLogger("dao.user");
Logger logger = Logger.getLogger("dao.lesson"); 

这样就取得了三个logger,在配置日志的时候分别用对应的log4j.logger.名字来指定 它们的日志级别:

log4j.logger.dao=INFO
log4j.logger.dao.user=DEBUG
log4j.logger.dao.lesson=DEBUG 

继承关系

这里有一个问题,logger名称中的点号意义有点像Java类名与包名。所以子包中的日志 会在上一级包中再输出一遍。

因为user和lesson都是DEBUG级别的,所以dao中除了正常的INFO日志,也还会包含下面 user和lesson的内容。

相当于:user和lesson的DEBUG日志不光自己记录了一遍,还在dao中记录了一遍,一共 记录了两遍。这样在服务器上重复记录日志太浪费性能和存储空间了,所以我们可以指定 取消继承:

log4j.logger.dao=INFO
log4j.logger.dao.user=DEBUG
log4j.logger.dao.lesson=DEBUG
 
log4j.additivity.user.lesson=false
log4j.additivity.dao.lesson=false 

命名惯例

一般在习惯上,我们都会用程序所在类的类名来作为日志的名字。因为一般情况下用不着 在一个类中有多个日志,而且包名加类名还很好地体现了层级关系:

package com.izenesoft.b5m.pdc.service;

public class PdcUserShareService {
  private static Logger LOGGER =
    logger.getLogger(PdcUserShareService.class);
} 

日志有配置

日志的配置文件为log4j.properties。有了日志的级别和输出,就可以定义一个具体的 日志实例了:

实例=级别,输出1,输出2,输出3 ... 

例如:

log4j.rootLogger=INFO, FileInfo
log4j.logger.com.mycop=DEBUG, ConsoleDebug, FileDebug
log4j.additivity.com.mycop=false 

例子

#
log4j.rootLogger=INFO, FileInfo
log4j.logger.com.mycop=DEBUG, ConsoleDebug, FileDebug
log4j.additivity.com.mycop=false
 
# log info to console
log4j.appender.ConsoleInfo=org.apache.log4j.ConsoleAppender
log4j.appender.ConsoleInfo.Encoding=UTF-8
log4j.appender.ConsoleInfo.layout=org.apache.log4j.PatternLayout
log4j.appender.ConsoleInfo.layout.ConversionPattern=%d %-5p - %m%n
 
# log debug to console
log4j.appender.ConsoleDebug=org.apache.log4j.ConsoleAppender
log4j.appender.ConsoleDebug.Encoding=UTF-8
log4j.appender.ConsoleDebug.layout=org.apache.log4j.PatternLayout
log4j.appender.ConsoleDebug.layout.ConversionPattern=%d %-5p [%t] %l - %m%n
 
# log to info file
log4j.appender.FileInfo=org.apache.log4j.RollingFileAppender
log4j.appender.FileInfo.Encoding=UTF-8
log4j.appender.FileInfo.layout=org.apache.log4j.PatternLayout
log4j.appender.FileInfo.layout.ConversionPattern=%d %-5p - %m%n
log4j.appender.FileInfo.File=./log-info.log
log4j.appender.FileInfo.MaxFileSize = 500KB
log4j.appender.FileInfo.MaxBackupIndex = 1
 
# log to DebugFile
log4j.appender.FileDebug=org.apache.log4j.RollingFileAppender
log4j.appender.FileDebug.Encoding=UTF-8
log4j.appender.FileDebug.layout=org.apache.log4j.PatternLayout
log4j.appender.FileDebug.layout.ConversionPattern=%d %-5p [%t] %l - %m%n
log4j.appender.FileDebug.File=./log-debug.log
log4j.appender.FileDebug.MaxFileSize = 500KB
log4j.appender.FileDebug.MaxBackupIndex = 1 

输出到数据库

#定义A3输出到数据库
log4j.appender.A3=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.A3.URL=jdbc:mysql://localhost:3306/db_log4j
log4j.appender.A3.driver=com.mysql.jdbc.Driver
log4j.appender.A3.user=root
log4j.appender.A3.password=root
#定义A3的布局和执行的SQL语句
log4j.appender.A3.layout=org.apache.log4j.PatternLayout
log4j.appender.A3.layout.ConversionPattern=INSERT INTO tb_log(createDate,thread,level,class,message) values('%d','%t','%-5p','%c','%m')

输出到MongoDB

og4j.rootLogger=INFO, stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.logger.MongoDB=INFO,MongoDB
log4j.appender.MongoDB=org.log4mongo.MongoDbPatternLayoutAppender
log4j.appender.MongoDB.Threshold=INFO
log4j.appender.MongoDB.databaseName=mydb
log4j.appender.MongoDB.collectionName=optlog
log4j.appender.MongoDB.hostname=10.25.193.16
log4j.appender.MongoDB.port=9933
log4j.appender.MongoDB.layout=org.log4mongo.MongoDbPatternLayout

log4j.logger.MongoDB2=INFO,MongoDB2
log4j.appender.MongoDB2=org.log4mongo.MongoDbPatternLayoutAppender
log4j.appender.MongoDB2.Threshold=INFO
log4j.appender.MongoDB2.databaseName=mydb
log4j.appender.MongoDB2.collectionName=abclog
log4j.appender.MongoDB2.hostname=10.25.193.16
log4j.appender.MongoDB2.port=9933
log4j.appender.MongoDB2.layout=org.log4mongo.MongoDbPatternLayout

程序:

public static void main(String[] args) {
	Logger logger = Logger.getLogger("MongoDB");
	logger.info("{'provinceCode': null, 'channelSubCode': null, 'platFormCode': '002', 'optCode': null, 'startTimeLong': 1384599600000, 'processTime_sum': 10081,'count': 404, 'suc_count': 0,'suc_rate': '0.00000'}");
	
	Logger logger2 = Logger.getLogger("MongoDB2");
	logger2.info("{'provinceCode':123}");
}