学习使用中遇到日志的问题,就查看了一些关于log4j的使用方法,在这记录下,方便于日后查询
使用log4j需要一个jar包 log4j-1.2.14.jar 选择一个任何一个版本的,只要不会在项目中造成版本冲突
使用log4j的一般步骤:
1.配置及读取配置文件
log4j.properties配置文件内容样例:
log4j.rootLogger=INFO, stdout1
#输出日志到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
如果配置文件的名称是log4j.properties,且放在工程的默认目录下,比如放在src目录下,则不需要初始话,log4j会自动加载给文件
BasicConfigurator.configure (): 自动快速地使用缺省Log4j环境。使用这个配置方法时,不需要log4j.properties配置文件,且记录日志的级别为DEBUG
PropertyConfigurator.configure ( String configFilename) :读取使用Java的特性文件编写的配置文件。
DOMConfigurator.configure ( String filename ) :读取XML形式的配置文件。
2.得到记录器
使用Log4j,第一步就是获取日志记录器,这个记录器将负责控制日志信息。其语法为:
public static Logger getLogger( String name)
或
protected final Log log = LogFactory.getLog(getClass());
Name一般取本类的名字,比如:
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
可通过指定的名字获得记录器,则为这个名字创建一个新的记录器,这个名字必须在配置文件中设置过。
如:
Logger logger = Logger.getLogger(“logname”);
//logname是在log4j.properties配置文件设置过的名称,如:log4j.logger.logname=INFO,A2
3.插入记录信息(格式化日志信息)
当上两个必要步骤执行完毕,您就可以轻松地使用不同优先级别的日志记录语句插入到您想记录日志的任何地方,其语法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
不使用log4j.properties配置文件的方法
加载jar包后 直接在代码中使用
初始化log4j配置
private static void initLog4j()
{
Properties prop = new Properties();
//设置log4j的配置信息
prop.setProperty("log4j.rootLogger", "DEBUG, CONSOLE");
prop.setProperty("log4j.appender.CONSOLE", "org.apache.log4j.ConsoleAppender");
prop.setProperty("log4j.appender.CONSOLE.layout", "org.apache.log4j.PatternLayout");
prop.setProperty("log4j.appender.CONSOLE.layout.ConversionPattern", "%d{HH:mm:ss,SSS} [%t] %-5p %C{1} : %m%n");
//初始化log4j配置信息
PropertyConfigurator.configure(prop);
}
初始化logger记录器
Logger logger = Logger.getLogger(当前的类名.class);
插入日志信息
//记录日志信息
logger.debug("mens");
logger.error("error");
logger.warn("warn");
logger.info("info");
实例:
//Class类代码:
package mylogtest;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
public class LogTest
{
public static void main(String[] args)
{
//一次执行一个进行测试
LogTest1();
//LogTest2();
//LogTest3();
}
//通过代码动态的配置log4j配置信息,使用时不需要配置文件
private static void initLog4j() {
//设置配置信息
Properties prop = new Properties();
prop.setProperty("log4j.rootLogger", "DEBUG, CONSOLE");
prop.setProperty("log4j.appender.CONSOLE", "org.apache.log4j.ConsoleAppender");
prop.setProperty("log4j.appender.CONSOLE.layout", "org.apache.log4j.PatternLayout");
prop.setProperty("log4j.appender.CONSOLE.layout.ConversionPattern", "%d{HH:mm:ss,SSS} [%t] %-5p %C{1} : %m%n");
//初始化配置信息
PropertyConfigurator.configure(prop);
}
//通过获取设置日志的名称
public static void LogTest1()
{
Logger logger = Logger.getLogger("INFO");
//INFO是log4j的配置文件中设置过的名称,log4j.logger.INFO=INFO,A2
logger.debug("INFO/mens");
logger.error("INFO/error");
logger.warn("INFO/warn");
logger.info("INFO/info");
logger = Logger.getLogger("WARN");
logger.debug("WARN/mens");
logger.error("WARN/error");
logger.warn("WARN/warn");
logger.info("WARN/info");
}
//
public static void LogTest2()
{
Logger logger = Logger.getLogger(LogTest.class);
logger.debug("mens");
logger.error("error");
logger.warn("warn");
logger.info("info");
}
//如使用这中方法,可不加载配置文件
public static void LogTest()
{
BasicConfigurator.configure ()
Logger logger = Logger.getLogger(LogTest.class);
logger.debug("mens");
logger.error("error");
logger.warn("warn");
logger.info("info");
}
//如使用这中方法,可不加载配置文件
public static void LogTest3()
{
initLog4j();
Logger logger = Logger.getLogger(LogTest.class);
logger.debug("mens");
logger.error("error");
logger.warn("warn");
logger.info("info");
}
}
log4j.properties配置文件
#默认配置对整个工程生效
#log4j.rootLogger=INFO, stdout1
#输出日志到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#指定包名称”mylogtest”,使其对该包”mylogtest”里的所有类生效
log4j.logger.datapost.mylogtest=INFO, appender2
#输出日志到文件中以追加的方式写入文件
log4j.appender.appender2=org.apache.log4j.FileAppender
log4j.appender.appender2.File=Log4.log #输出日志文件的名称
log4j.appender.appender2.layout=org.apache.log4j.PatternLayout
log4j.appender.appender2.layout.ConversionPattern=[%d{HH:mm:ss:SSS}][%C-%M] -%m%n #输出日志格式
#指定日志的名称,在代码中可通过Logger logger = Logger.getLogger("WARN");获取logger记录器
log4j.logger.WARN=WARN,A1
log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.File=Log4-warn.log
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=[%d{HH:mm:ss:SSS}][%C-%M] -%m%n
#指定日志的名称,在代码中可通过Logger logger = Logger.getLogger("INFO");获取logger记录器
log4j.logger.INFO=INFO,A2
log4j.appender.A2=org.apache.log4j.FileAppender
log4j.appender.A2.File=Log4-info.log
log4j.appender.A2.layout=org.apache.log4j.PatternLayout
log4j.appender.A2.layout.ConversionPattern=[%d{HH:mm:ss:SSS}][%C-%M] -%m%n
log4j.properties配置文件详解
以下内容是对网络资源的整理
日志级别,DEBUG, INFO, WARN,ERROR, FATAL
日志级别不区分大小写,
ERROR 为严重错误 主要是程序的错误 ,使用此级别仅记录ERROR的信息
WARN 为一般警告,比如session丢失;使用此级别时仅记录WARN ERROR的信息
INFO 为一般要显示的信息,比如登录登出;使用此级别时仅记录INFO WARN ERROR的信息
DEBUG 为程序的调试信息 ;使用此级别时仅记录DEBUG INFO WARN ERROR的信息
配置日志的级别及其别名
log4j.rootLogger=日志级别,appender1, appender2, ….
设置日志的默认级别,对整个工程生效
- 日志级别:ALL<DEBUG<INFO<WARN<ERROR<FATAL<OFF,不区分大小写
- appender* 是对前面的“日志”的别称。比如“INFO,appender1”,appender1就是INFO的别名,可以使用appender1代指INFO。当指代多个别名时,对其中的任何一个进行操作,都会使其生效。多个操作课同时生效
- 如需在控制台输入,只需将其中一个appender定义为stdout即可
- 注意,rootLogger默认是对整个工程生效
- 注意,如果只想对某些包操作,那么:log4j.logger.com.hutu=info, stdout,表示该日志对package com.hutu生效
- 注意,这样做可以区分dev/线上,也可以减小性能影响:if(log.isDebugEnabled()){log.debug();}
指定使得日志生效的名称(可选择)
log4j.logger.warn=日志级别,appender1, appender2, ….
指定logger的名称,在程序中使用时可通过Logger logger = Logger.getLogger("warn");获取相应配置的logger。
如:log4j.logger.warn=WARN,A1
在程序中使用Logger logger = Logger.getLogger("warn");便可获取对A1相对应配置的logger,然后便可使用logger.warn(“警告”);写入日志(注:由于例子中的日志级别为“WARN”,所以只能写入WARN和ERROR的日志信息)
当然,像上面提到的,可以将其设置为对应的包名称,使得日志对该包生效,在程序中使用Logger logger = Logger.getLogger(当前类名.class);
配置日志信息输出目的地
log4j.appender.appender1=org.apache.log4j.日志输出到哪儿
- ConsoleAppender(控制台)
- FileAppender(文件)
- DailyRollingFileAppender(每天产生一个日志文件)
- RollingFileAppender(文件大小到达指定尺寸(MaxFileSize设定的最大尺寸)时产生一个新的文件)
- WriteAppender(将日志信息以流格式发送到任意指定的地方)
- JDBCAppender(将日志信息保存到数据库中)
例如:log4j.appender.appender1=arg.apache.log4j.ConsoleAppender 指定日志输出到控制台
日志文件的目录
log4j.appender.appender1.File=文件目录及文件
- ${user.home}/logs/...
- 可使用绝对路径来表示。
- 如果直接使用文件名,则日志文件会保存在应用程序的根目录下
- 例如:log4j.appender.appender1= mylogger.log就会在应用程序的根目录下出现mylogger.log日志文件
日志文件的最大大小
log4j.appender.appender1.MaxFileSize=最大文件大小
- 日志文件的最大尺寸
日志文件的备份个数
log4j.appender.appender1.MaxBackupIndex=备份文件个数
- 其中,appender1是在第一行定义过的;
- 文件目录及文件,例如,/home/admin/logs/hutudan.log
- 最大文件大小,例如,100KB
- 备份文件个数,例如,1
配置日志的后缀格式
log4j.appender.ServerDailyRollingFile.DatePattern=日志后缀格式
- 例如,'.'yyyy-MM-dd
配置日志信息的布局格式
log4j.appender.appender1.layout=org.apache.log4j.日志布局格式
- HTMLLayout(以HTML表格形式布局)
- SimpleLayout(包含日志信息的级别和信息字符串)
- TTCCLayout(包含日志产生的时间,执行绪,类别等信息)
- PatternLayout(可以灵活的指定布局格式,常用)
配置日志信息的输出格式
log4j.appender.appender1.layout.ConversionPattern=日志输出格式
- 例如,%d - %m%n或%d{yyyy-MM-dd HH:mm:ss} %p [%c] %m%n
- %c 输出日志信息所属的类的全名
- %d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyy-M-dd HH:mm:ss },输出类似:2002-10-18 22:10:28
- %f 输出日志信息所属的类的类名
- %l 输出日志事件的发生位置,即输出日志信息的语句处于它所在的类的第几行
- %m 输出代码中指定的信息,如log(message)中的message
- %n 输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
- %p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL。如果是调用debug()输出的,则为DEBUG,依此类推
- %r 输出自应用启动到输出该日志信息所耗费的毫秒数
- %t 输出产生该日志事件的线程名
- 可参考:http://blog.sina.com.cn/s/blog_4e4dd5570100qowy.html
- 1)%20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,默认的情况下右对齐。
2)%-20c:指定输出category的名称,最小的宽度是20,如果category的名称小于20的话,"-"号指定左对齐。
3)%.30c:指定输出category的名称,最大的宽度是30,如果category的名称大于30的话,就会将左边多出的字符截掉,但小于30的话也不会有空格。
4)%20.30c:如果category的名称小于20就补空格,并且右对齐,如果其名称长于30字符,就从左边较远输出的字符截掉。
log4j.appender.ServerDailyRollingFile.Append=true
- 以追加的方式写