大家好,我是IT修真院深圳分院第01期学员,一枚正直纯洁善良的web程序员。
今天给大家分享一下,修真院官网JAVA(职业)任务1,深度思考中的知识点——log4j的使用。
1.介绍
Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。
2.涉及
2.1 从System.out.println到Log4j
System.out(还有System.err)是一个直接和控制台打交道的PrintStream对象,是终端显示的基础,高级的Logger要在终端显示日志内容,就必然会用到。但它还不是一个日志系统,一个比较完善的日志系统应当有输出媒介、优先级、格式化、日志过滤、日志管理、参数配置等功能。
然后伴随J2SE 1.4一起发布了Java Logging API(java.util.logging),它满足了基本日志系统构建的需求,包含7大部分:
日志记录器Logger
日志对象:LogRecord
日志管理器:LogManager
输出媒介控制:Handler
输出格式:Formatter
日志级别:Level
日志过滤器:Filter
Apache Jakarta log4j日志工具包是当前比较流行的一个工具包,它在Logging API的基础上提供更多的输出媒介、输出格式和配置选择。
Logging中的类 log4j中的类
日志记录器 Logger Logger
日志管理器 LogManager LogManager
日志对象 LogRecord LoggingEvent
输出媒介控制 Handler Appender
格式化 Formatter Layout
级别 Level Level
过滤器 Filter Filter
2.2 Log4j用法
建立maven工程,在pom.xml文件中加入依赖包,通过设置Log Level,定义Appender和在配置文件中指定Layout对象来配置log4j。log4j.properties 文件是一个log4j配置文件,它保留键/值对中的属性。默认情况下, LogManager 在CLASSPATH中查找名为log4j.properties的文件。
Logger是日志记录器,其通常在主类中静态实例化,如:static Logger log = Logger.getLogger(log4jExample.class.getName());
Logger类具有处理日志记录活动的方法:
public void debug(Object message):打印Level.DEBUG级别的消息。
public void error(Object message):打印Level.ERROR级别的消息。
public void fatal(Object message):打印具有Level.FATAL级别的消息。
public void info(Object message):打印Level.INFO级别的消息。
public void warn(Object message):打印Level.WARN级别的消息。
public void trace(Object message):打印Level.TRACE级别的消息
日志级别用Level类表示,一个日志级别对应的是一个整数值,范围和整型值的范围是一致的,该整数值愈大,说明警戒级别愈高。Level有9个内置的级别,分别是:
类型 对应的整数
OFF 最大整数(Integer.MAX_VALUE)
SEVERE 1000
WARNING 900
INFO 800
CONFIG 700
FINE 500
FINER 400
FINEST 300
ALL 最小整数(Integer.MIN_VALUE)
Appender对象用于将日志消息打印到不同目标(如控制台,文件,套接字,NT事件日志等),所有类别:
AppenderSkeleton,AsyncAppender,ConsoleAppender,DailyRollingFileAppender,ExternallyRolledFileAppender,FileAppender,JDBCAppender,JMSAppender,LF5Appender,NTEventLogAppender,NullAppender,RollingFileAppender,SMTPAppender,SocketAppender,SocketHubAppender,SyslogAppender,TelnetAppender,WriterAppender。
每个Appender对象都具有与其关联的不同属性,这些属性指示该对象的行为。
layout:Appender使用布局对象和转换模式来格式化日志记录信息。
target:目标可以是控制台,文件或其他项目,具体取决于附加程序。
level:级别过滤日志消息。
threshold:Appender可以具有阈值级别,并忽略具有低于阈值级别的级别的任何日志记录消息。
filter:Filter对象决定日志记录请求是由特定Appender处理还是忽略。
org.apache.log4j.Layout是日志格式类,是log4j API中所有其他Layout类的基类。
它有以下子类:DateLayout,HTMLLayout,PatternLayout,SimpleLayout,XMLLayout。
Log4j采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下:
%m:输出代码中指定的消息
%p:输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL
%r:输出自应用启动到输出该log信息耗费的毫秒数
%c:输出所属的类目,通常就是所在类的全名
%t:输出产生该日志事件的线程名
%n:输出一个回车换行符,Windows平台为“rn”,Unix平台为“n”
%l:输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。举例:Testlog4.main(TestLog4.java:10)
3. 常见问题
实际使用
4.解决方案
5.编码实战
一个简单的log4j.properties:
# Define the root logger with appender file
log4j.rootLogger = DEBUG, stdout, file
# Redirect log messages to console
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=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
# Redirect log messages to a log file, support file rolling.
log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=log4j.log
log4j.appender.file.MaxFileSize=5MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
在主类中静态实例化:
public class SpringMain {
private static org.apache.log4j.Logger log = Logger.getLogger(SpringMain.class);
public static void main(String args[]){
............
}}
6. 扩展思考
日志应该怎么打,在什么位置,需要打印出来什么样的关键参数?
日志打印应该从4个方面进行:模块运行日志、业务日志、模块性能日志、模块外部资源日志。关键参数为堆栈信息和运行场景。
7. 参考文献
参考一:Java调试的变迁:从System.out.println到log4j【zz】
8. 更多讨论
Common-logging、SLF4J、Logback
鸣谢
感谢大家观看
------------------------------------------------------------------------------------------------------------------------
今天的分享就到这里啦,欢迎大家点赞、转发、留言、拍砖~