Java开发之路

文章32 |   阅读 13667 |   点赞0

来源:https://blog.csdn.net/sunnyyoona

[Java开发之路](16)学习log4j日志

x33g5p2x  于2021-03-13 发布在 其他  
字(9.5k)|赞(0)|评价(0)|浏览(537)

1. 新建一个Java工程,导入Jar包(log4j-1.2.17.jar)

Jar包下载地址:点击打开链接

2.配置文件:创建并设置log4j.properties

# 设置
log4j.rootLogger = debug,stdout,D,E
 
# 输出信息到控制台
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
# 输出格式
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss, SSS} method:%l%n%m%n
 
# 输出DEBUG 级别以上的日志到D://WorkSpace/logs/debug.log
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = D://WorkSpace/logs/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG 
log4j.appender.D.layout = org.apache.log4j.PatternLayout
# 打印DEBUG信息格式
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n
 
# 输出ERROR 级别以上的日志到=D://WorkSpace/logs/error.log
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =D://WorkSpace/logs/error.log 
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR 
log4j.appender.E.layout = org.apache.log4j.PatternLayout
# 打印ERROR信息格式
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

3.使用日志

package com.qunar.sjf;
 
import org.apache.log4j.Logger;
 
public class ImportMost {
	private static Logger logger = Logger.getLogger(ImportMost.class); 
	
	public static void main(String[] args) {  
		// debug级别的信息  
		logger.debug("This is a debug");  
		// info级别的信息  
		logger.info("This is a info");  
		// error级别的信息  
		logger.error("This is a error");  
	}  
}

4.输出信息

4.1 控制台输出信息

4.2 后台日志

error.log:

2016-01-13 20:55:05  [ main:6 ] - [ ERROR ]  This is a error

debug.log:

2016-01-13 20:55:05  [ main:0 ] - [ DEBUG ]  This is a debug

2016-01-13 20:55:05  [ main:5 ] - [ INFO ]  This is a info

2016-01-13 20:55:05  [ main:6 ] - [ ERROR ]  This is a error

5.Logger方法

Logger类提供了多种方法来处理日志活动。 Logger类不允许实例化一个新实例,但它可以通过两个静态方法获得一个 Logger 对象:

public static Logger getRootLogger();
public static Logger getLogger(String name);
public static Logger getLogger(Class clazz);

第一个方法返回根日志记录器,第二个方法根据给定额参数name检索日志记录器,第三个方法根据给定的Class对象返回日志记录器。

Logging 方法:

我们得到了一个日志记录器之后,可以使用日志记录器的几种方法来记录消息。 Logger类有专门用于打印日志信息方法。

所有的级别定义在org.apache.log4j.Level类中,并且任何上述方法都可以调用如下:

6.日志级别

org.apache.log4j.Level类提供以下级别,但也可以通过Level类的子类自定义级别。

级别描述
ALL最低级别,打开所有日志级别
DEBUG细粒度信息事件,对应用程序调试最有用
ERROR错误事件,可能仍然允许应用程序继续运行
FATAL非常严重的错误事件,这可能导致应用程序中止
INFO指定能够突出在粗粒度级别的应用程序运行情况的信息的消息
OFF最高级别,关闭日志记录
TRACE细粒度比DEBUG更低的信息事件
WARN具有潜在危害的情况

对于标准级别关系如下:ALL < DEBUG < INFO < WARN < ERROR < FATAL < OFF。ALL是最低级别,OFF是最高级别。

如果设置日志级别为a,则在记录日志时日志级别b可以启用,必须满足b >= a这一条件。

下面的例子明确指出如何可以过滤所有的DEBUG和INFO消息。这个程序使用记录并执行setLevel(Level.X)方法来设置所需的日志记录级别:

package com.qunar.sjf;
 
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
 
public class ImportMost {
	private static Logger logger = Logger.getLogger(ImportMost.class); 
	
	public static void main(String[] args) {  
		// 设置日志记录器级别 
		logger.setLevel(Level.WARN);
		// 日志信息
		logger.trace("Trace Message!");
		logger.debug("Debug Message!");
		logger.info("Info Message!");
		logger.warn("Warn Message!");
		logger.error("Error Message!");
		logger.fatal("Fatal Message!"); 
	}  
}

运行结果:

7.日志格式化

Apache log4j提供了各种布局对象,每一个对象都可以根据各种布局格式记录数据。在层次结构中的顶级类是抽象类是org.apache.log4j.Layout,是所有其他布局类的基类。由于是抽象类,我们分不能直接使用Layout,而是使用Layout的子类。

(1)DateLayout

(2)HTMLLayout

(3)PatternLayout

(4)SimpleLayout

(5)XMLLayout

7.1 HTMLLayout

如果想生成一个HTML格式的日志文件,可以使用HTMLLayout 布局格式。HTMLLayout类扩展抽象org.apache.log4j.Layout类,并覆盖其基类的 format()方法来提供HTML样式格式。

这提供了以下信息显示:

  • 生成特定的日志事件之前,从应用程序的开始所经过的时间(Time)
  • 调用该记录请求的线程的名称(Thread)
  • 与此记录请求相关联的级别(Level)
  • 日志记录器(Logger)和记录消息的名称(Message)
  • 可选程序文件的位置信息,并从其中记录被调用的行号(Category 和 Line)
方法描述
void setContentType(String)设置 HTML 的内容类型,默认为 text/html
void setLocationInfo(String)设置日志事件的位置信息(所在目录,所在行数等)。
void setTitle(String)设置 HTML 文件的标题,默认为 Log4j Log Messages。

实例:

package com.qunar.log;
 
import org.apache.log4j.Logger;
 
public class HtmlLayoutDemo {
	// 日志记录器
	private static Logger logger = Logger.getLogger(HtmlLayoutDemo.class);
	
	public static void main(String[] args) {
		logger.debug("this is an debug message");
		logger.info("this is an info message");
	}
}

配置文件:

# Define the root logger with appender file
log = D://WorkSpace/logs/
log4j.rootLogger = debug, FILE
 
# Define the file appender
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=${log}HtmlLayoutDemo.html
 
# Define the layout for file appender
log4j.appender.FILE.layout=org.apache.log4j.HTMLLayout
log4j.appender.FILE.layout.Title=HTML Layout Demo
log4j.appender.FILE.layout.LocationInfo=true

日志输出:

7.2 PatternLayout

如果您希望基于某种模式生成特定格式的日志信息,可使用 org.apache.Log4j.PatternLayout 格式化您的日志信息。PatternLayout 继承自抽象类 org.apache.Log4j.Layout,覆盖了其 format() 方法,通过提供的模式,来格式化日志信息。

设置转换模式,默认为** %r [%t] %p %c %x - %m%n**。

下面的表格解释了上面模式中用到的字符,以及所有定制模式时能用到的字符:

模式字符含义
c为输出的日志事件分类,比如对于分类 "a.b.c",模式 %c{2} 会输出 "b.c" 。
C输出发起记录日志请求的类的全名。比如对于类 "org.apache.xyz.SomeClass",模式 %C{1} 会输出 "SomeClass"。
d输出记录日志的日期,比如 %d{HH:mm:ss,SSS} 或 %d{dd MMM yyyy HH:mm:ss,SSS}。
F输出文件名。
l输出生成日志的调用者的位置信息。
L输出发起日志请求的行号。
m输出和日志事件关联的,由应用提供的信息。
M输出发起日志请求的方法名。
n输出平台相关的换行符。
p输出日志事件的优先级。
r输出从构建布局到生成日志事件所花费的时间,以毫秒为单位。
t输出生成日志事件的线程名。
x输出和生成日志事件线程相关的 NDC (嵌套诊断上下文)。
X该字符后跟 MDC 键,比如 X{clientIP} 会输出保存在 MDC 中键 clientIP 对应的值。
%百分号, %% 会输出一个 %。

缺省情况下,信息保持原样输出。但是借助格式修饰符的帮助,就可调整最小列宽、最大列宽以及对齐。

实例:

package com.qunar.log;
 
import org.apache.log4j.Logger;
 
public class PatternLayoutDemo {
	// 日志记录器
	private static Logger logger = Logger.getLogger(PatternLayoutDemo.class);
	
	public static void main(String[] args) {
		logger.debug("this is an debug message");
		logger.info("this is an info message");
	}
}

配置文件:

log4j.rootLogger = DEBUG, FILE
 
log4j.appender.FILE=org.apache.log4j.FileAppender
 
# 日志存储位置
log4j.appender.FILE.File=D:/WorkSpace/logs/log.out
 
# 追加方式写入文件
log4j.appender.FILE.Append=true
 
# 日志布局方式
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
 
# 日志格式
log4j.appender.FILE.layout.conversionPattern=%d{yyyy-MM-dd}-%t-%x-%-p-%-10c-%n%m%n

日志输出 log.out:

2016-01-16-main--DEBUG-com.qunar.log.PatternLayoutDemo-

this is an debug message

2016-01-16-main--INFO-com.qunar.log.PatternLayoutDemo-

this is an info message

8.日志写到文件

8.1 FileAppender

日志记录到文件中,主要用到FileAppender类。FileAppender继承自WriterAppender。

FileAppender配置:

属性描述
ImmediateFlush默认设置为true,表示所有消息都会被立即输出,设为false则不输出
Encoding编码格式。它可以使用任何字符编码。默认情况下是特定于平台的编码方案
Threshold写入文件的日志级别。
Filename日志文件名称。
Append默认设置为true,以追加的方式把日志写入文件。
BufferedIO默认设置为false,表示是否需要写入缓存启用。
BufferSize默认设置为8KB,如果 bufferedI/O 启用,表示缓冲区的大小,

实例:

package com.qunar.log;
 
import org.apache.log4j.Logger;
 
public class PatternLayoutDemo {
	// 日志记录器
	private static Logger logger = Logger.getLogger(PatternLayoutDemo.class);
	
	public static void main(String[] args) {
		logger.debug("this is an debug message");
		logger.info("this is an info message");
	}
}

配置文件:

log4j.rootLogger = DEBUG, FILE
 
log4j.appender.FILE=org.apache.log4j.FileAppender
 
# 日志存储位置
log4j.appender.FILE.File=D:/WorkSpace/logs/log.out
 
# 表示所有消息都会被立即输出,设为false则不输出
log4j.appender.FILE.ImmediateFlush=true
 
# 写入的日志级别
log4j.appender.FILE.Threshold=info
 
# 追加方式写入文件
log4j.appender.FILE.Append=true
 
# 日志布局方式
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
 
# 日志格式
log4j.appender.FILE.layout.conversionPattern=%d{yyyy-MM-dd}-%t-%x-%-p-%-10c-%n%m%n

日志输出(注意:只有输出info信息  与配置文件设置有关):

2016-01-16-main--INFO-com.qunar.log.PatternLayoutDemo-

this is an info message

8.2 RollingFileAppender

当想要写日志信息转化多个文件要求一样,例如,如果文件大小达到一定的阈值等。

写日志记录信息分成多个文件,必须扩展FileAppender类,并继承其所有属性org.apache.log4j.RollingFileAppender类。有以下除了已如上所述为 FileAppender 可配置参数:

属性描述
maxFileSize默认值是10MB,文件的回滚临界尺寸。
maxBackupIndex默认值是1,创建的备份文件的数量。

实例:

package com.qunar.log;
 
import org.apache.log4j.Logger;
 
public class PatternLayoutDemo {
	// 日志记录器
	private static Logger logger = Logger.getLogger(PatternLayoutDemo.class);
	
	public static void main(String[] args) {
		for(int i = 0;i < 15;++i){
			logger.debug("this is an debug message:" + i);
		}//for
	}
}

配置文件:

log4j.rootLogger = DEBUG, FILE
 
log4j.appender.FILE=org.apache.log4j.RollingFileAppender
 
# 日志存储位置
log4j.appender.FILE.File=D:/WorkSpace/logs/log.out
 
# 日志回滚最大值
log4j.appender.FILE.MaxFileSize=1KB
 
# 日志文件备份个数
log4j.appender.FILE.MaxBackupIndex=1
 
# 日志布局方式
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
 
# 日志格式
log4j.appender.FILE.layout.conversionPattern=%d{yyyy-MM-dd}-%t-%x-%-p-%-10c-%n%m%n

此示例配置说明每个日志文件的最大值为1KB。最开始创建日志文件log.out,当超过日志文件最大值时,log.out.1新的日志文件将被创建。同时,log.out中的日志转移到log.out.1中(备份文件设置为1)。log.out日志文件永远写入最新日志。

日志输出:

8.3 DailyRollingFileAppender

如果想它能够按一定的时间频率滚动日志记录文件,以保持日志记录信息的良好记录,就必须它扩展FileAppender类,并继承其所有属性useorg.apache.log4j.DailyRollingFileAppender类。

在DailyRollingFileAppender中可以指定monthly(每月)、 weekly(每周)、daily(每天)、half-daily(每半天)、hourly(每小时)和minutely(每分钟)六个频度,这是通过为 DatePattern选项赋予不同的值来完成的。DatePattern选项的有效值为:

DatePattern中不用处理的文字要放到单引号(')中,如上面的(.)。如果您对此有疑问可以查阅SimpleDateFormat的文档。DailyRollingFileAppender中使用这个类来处理DatePattern。

日志文件输出结果:

9.日志输出到数据库中

log4j API提供 org.apache.log4j.jdbc.JDBCAppender 对象,它能够将日志信息在指定的数据库。

属性含义
driver设置驱动程序类为指定的字符串。如果没有指定驱动程序类,默认为sun.jdbc.odbc.JdbcOdbcDriver
url设置JDBC URL
layout设置要使用的布局。默认布局org.apache.log4j.PatternLayout
user数据库用户名
password数据库密码
sql指定SQL语句在每次记录事件发生的时间执行。这可能是INSERT,UPDATE或DELETE
bufferSize设置缓冲区的大小。默认大小为1

数据库设置:

创建存储日志的表:

CREATE TABLE LOGS
   (ID VARCHAR(20) NOT NULL,
    TIME   DATE NOT NULL,
    LOGGER  VARCHAR(50) NOT NULL,
    LEVEL   VARCHAR(10) NOT NULL,
    MESSAGE VARCHAR(1000) NOT NULL
   );

日志配置文件:

log4j.rootLogger = DEBUG, DB
 
log4j.appender.DB=org.apache.log4j.jdbc.JDBCAppender
 
# url链接
log4j.appender.DB.URL=jdbc:mysql://localhost/test
 
# 驱动
log4j.appender.DB.driver=com.mysql.jdbc.Driver
 
# 用户名
log4j.appender.DB.user=root
 
# 密码
log4j.appender.DB.password=root
 
# 日志插入数据库  %d 日期 %C 类名 %p 优先级 %m 日志信息
log4j.appender.DB.sql=INSERT INTO LOGS VALUES('%t','%d{yyyy-MM-dd}','%C','%p','%m')
 
# 日志布局方式
log4j.appender.DB.layout=org.apache.log4j.PatternLayout

程序文件:

package com.qunar.log;
 
import org.apache.log4j.Logger;
 
public class JDBCAppenderDemo {
	// 日志记录器
	private static Logger logger = Logger.getLogger(JDBCAppenderDemo.class);
	
	public static void main(String[] args) {
		for(int i = 0;i < 5;++i){
			logger.debug("this is an debug message:" + i);
		}//for
	}
}

必须添加mysql的驱动jar包:点击打开链接

运行结果:

相关文章