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}"); }