1、日志框架:
工作中要进行Java输出日志时,你需要一个或者多个日志框架。框架能提供对象、方法和必要的配置来发送日志信息。Java语言本身有自带的日志实现包java.util.logging。还有很多第三方的日志框架,包括log4j、log4j 2、logback。sl4j和Apache Commons Logging提供了日志的抽象层次,通过它可以从底层的日志框架实现解耦合,从而在不同的日志框架间切换。关于sl4j和logback的日志学习和使用可以参看好朋友的博文(https://fengmengzhao.github.io/2018/06/12/detailed-explanation-of-java-logging-framework.html)。本篇旨在让你能够轻松使用log4j日志框架。
2、log4j日志框架
Log4j API设计为分层结构,其中每一层提供了不同的对象,对象执行不同的任务。这使得设计灵活,根据将来需要来扩展。Log4j的框架的核心对象即为log4j的核心组件。
Log4j框架的主要学习其:核心对象、支持对象、配置、支持的功能实现。
2.1 Log4j框架对象
2.1.1核心对象: 框架的强制对象和框架的使用,包括:
1)Logger对象:顶级层的Logger,它提供Logger对象。Logger对象负责捕获日志信息及它们存储在一个空间的层次结构。
2)LayOut布局对象:该层提供其用于格式化不同风格的日志信息的对象。布局层提供支持Appender对象到发布日志信息之前。
我们使用的PatternLayout 使用 appender。所有可能的选项有:
• DateLayout
• HTMLLayout
• PatternLayout
• SimpleLayout
• XMLLayout
使用HTMLLayout和XMLLayout,可以在HTML和XML格式和生成日志。
--HTMLLayout布局对象
如果想生成一个HTML格式的文件,日志信息,那么可以使用 org.apache.log4j.HTMLLayout 格式化日志信息。HTMLLayout类扩展抽象org.apache.log4j.Layout类,并覆盖其基类的 format()方法来提供HTML样式格式。其提供了以下信息显示:
• 生成特定的日志事件之前,从应用程序的开始所经过的时间
• 调用该记录请求的线程的名称
• 与此记录请求相关联的级别
• 日志记录器(Logger)和记录消息的名称
• 可选程序文件的位置信息,并从其中记录被调用的行号
HTMLLayout是一个非常简单的布局对象,它提供以下方法:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
setContentType(String) 设置 text/html 为 HTML内容的内容类型。默认为 text/html setLocationInfo(String) 设置位置信息记录事件。默认为 false setTitle(String) 设置为HTML文件的标题。默认值是Log4j的日志信息
简单示例:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
log4j.properties文件: # Define the root logger with appender file log = D\://ceshiZJB/learnLogs/log4-demo log4j.rootLogger = DEBUG, FILE # Define the file appender log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=${log}/htmlLayout.html # Define the layout for file appender log4j.appender.FILE.layout=org.apache.log4j.HTMLLayout log4j.appender.FILE.layout.Title=HTML Layout Example log4j.appender.FILE.layout.LocationInfo=true
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
import java.io.*; import java.sql.SQLException; import org.apache.log4j.Logger; public class log4jExample{ /* Get actual class name to be printed on */ static Logger log = Logger.getLogger( log4jExample.class.getName()); public static void main(String[] args) throws IOException,SQLException{ log.debug("Hello this is an debug message"); log.info("Hello this is an info message"); } }
备注:一个具有HTML格式的日志文件的一大优势是,它可以被发布为网页可以远程查看。
--PatternLayout布局对象
如果想生成基于模式的特定格式的日志信息,那么可以使用 org.apache.log4j.PatternLayout 格式化日志信息。
PatternLayout类扩展抽象 org.apache.log4j.Layout 类并覆盖format()方法根据提供的模式构建日志信息。
PatternLayout也是一个简单的布局对象,它提供conversionPattern属性(设置转换模式。默认为 %r [%t] %p %c %x - %m%n),可以通过配置文件进行设置。
参看文章地址:https://www.yiibai.com/log4j/log4j_patternlayout.html
3)Appender对象:下位层提供Appender对象,Appender对象负责打印日志信息到不同的目的地,如控制台,文件,sockets,NT事件日志,数据库等,可以通过包括以下方法的配置文件,设置一个 Appender 对象添加到记录器:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
方法1:log4j.logger.[logger-name]=level, appender1,appender..n 方法2:可以编写以XML格式相同的结构如下: <logger name="com.apress.logging.log4j" additivity="false"> <appender-ref ref="appender1"/> <appender-ref ref="appender2"/> </logger> 方法3:如果想要添加Appender对象到程序,那么可以使用下面的方法: public void addAppender(Appender appender); addAppender()方法添加一个appender到Logger对象。作为示例配置演示,可以添加很多Appender对象到记录器在逗号分隔的列表,每个打印日志信息分离目的地。
日志追加到一个文件中:即写日志信息到一个文件中,必须使用org.apache.log4j.FileAppender。有以下FileAppender的配置参数:
immediateFlush | 标志的默认设置为true,这意味着输出流的文件被刷新,在每个追加操作 |
encoding | 它可以使用任何字符编码。默认情况下是特定于平台的编码方案 |
threshold | 这个 appender 阈值级别 |
Filename | 日志文件的名称 |
fileAppend | 默认设置为true,这意味着记录的信息被附加到同一文件的末尾 |
bufferedIO | 此标志表示是否需要写入缓存启用。默认设置为false |
bufferSize | 如果 bufferedI/O 启用,这表示缓冲区的大小,默认设置为8KB |
日志追加到多个文件中:当想生成每一天的日志文件,以保持日志记录信息的良好记录。日志记录信息纳入日常的基础文件,就必须它扩展FileAppender类,并继承其所有属性useorg.apache.log4j.DailyRollingFileAppender类。除了如上所述属性,FileAppender还有一个重要的配置参数:DatePattern (这表示在滚动的文件,并按命名惯例来执行。默认情况下,在每天午夜滚动)
DatePattern控制使用下列滚动的时间表方式之一:
DatePattern | 描述 |
'.' yyyy-MM | 滚动在每个月的结束和下一个月初 |
'.' yyyy-MM-dd | 这是默认值,每天午夜滚动 |
'.' yyyy-MM-dd-a | 滚动每一天的午夜和中午 |
'.' yyyy-MM-dd-HH | 滚动在每一个小时 |
'.' yyyy-MM-dd-HH-mm | 滚动在每一个分钟 |
'.' yyyy-ww | 滚动每个星期取决于区域设置时的第一天 |
简单示例:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
# Define the root logger with appender file log = D\://ceshiZJB/learnLogs/log4-demo # Define the root logger with appender file log4j.rootLogger = DEBUG, FILE # Define the file appender log4j.appender.FILE=org.apache.log4j.DailyRollingFileAppender # Set the name of the file log4j.appender.FILE.File=${log}/log.out # Set the immediate flush to true (default) log4j.appender.FILE.ImmediateFlush=true # Set the threshold to debug mode log4j.appender.FILE.Threshold=debug # Set the append to false, should not overwrite log4j.appender.FILE.Append=true # Set the DatePattern log4j.appender.FILE.DatePattern='.' yyyy-MM-dd-HH-mm # Define the layout for file appender log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.conversionPattern=%m%n
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
public class log4jExample{ /* 每分钟生成日志文件 * */ static Logger log = Logger.getLogger( log4jExample.class.getName()); static Object obj =new Object(); public static void main(String[] args) throws IOException,SQLException, InterruptedException{ synchronized (obj) { for(int i=0;i<350;i++){ obj.wait(1000L); log.debug("Hello this is an debug message"+i); //log.info("Hello this is an info message"); } } } }
日志存放到数据库中
参看文章地址:https://www.yiibai.com/log4j/log4j_logging_database.html#article-start
2.1.2支持对象:可选的对象执行另外重要的任务,log4j框架的其他重要的对象(支持对象)起到日志框架的一个重要作用。包括:
1)Level对象:Level对象(级别对象)用来定义任何记录信息的粒度和优先级。有记录的七个级别在API中定义:OFF, DEBUG, INFO, ERROR, WARN, FATAL 和 ALL
使用DEBUG两个追加程序。所有可能的选项有:org.apache.log4j.Level类提供以下级别,但也可以通过Level类的子类自定义级别。
Level | 描述 |
ALL | 各级包括自定义级别 |
DEBUG | 指定细粒度信息事件是最有用的应用程序调试 |
ERROR | 错误事件可能仍然允许应用程序继续运行 |
FATAL | 指定非常严重的错误事件,这可能导致应用程序中止 |
INFO | 指定能够突出在粗粒度级别的应用程序运行情况的信息的消息 |
OFF | 这是最高等级,为了关闭日志记录 |
TRACE | 指定细粒度比DEBUG更低的信息事件 |
WARN | 指定具有潜在危害的情况 |
2)Filter过滤对象用于分析日志信息及是否应记录或是否需要根据这些信息做出进一步的决定。
一个appender对象可以有与之关联的几个Filter对象。如:日志记录信息传递给特定Appender对象,经由 Filter对象批准后的日志信息,然后才能发布到所连接的目的地。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
方法1: private static org.apache.log4j.Logger log = Logger.getLogger(LogClass.class); log.setLevel(Level.WARN); 方法2: # Define the root logger with appender file log = /usr/home/log4j log4j.rootLogger = WARN, FILE # Define the file appender log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=${log}/log.out # Define the layout for file appender log4j.appender.FILE.layout=org.apache.log4j.PatternLayout log4j.appender.FILE.layout.conversionPattern=%m%n
3)ObjectRenderer(对象渲染器)
ObjectRenderer对象是一个指定提供传递到日志框架的不同对象的字符串表示。这个对象所使用的布局对象来准备最后的日志信息。
4)日志管理对象:管理日志框架。它负责从一个系统级的配置文件或配置类读取初始配置参数。
上述所有学习资料的来源均转自:https://www.yiibai.com/log4j/
学习源码和笔记可在百度网盘进行下载:https://pan.baidu.com/s/1QZ57clyQYUIOBQ5M12vIcg pg1y