一、log4j日志框架的理论和不同场景使用
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是一个非常简单的布局对象,它提供以下方法:
setContentType(String)
设置 text/html 为 HTML内容的内容类型。默认为 text/html setLocationInfo(String)
设置位置信息记录事件。默认为 false setTitle(String)
设置为HTML文件的标题。默认值是Log4j的日志信息
简单示例:
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
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 对象添加到记录器:
方法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 |
滚动每个星期取决于区域设置时的第一天 |
简单示例:
# 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
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对象批准后的日志信息,然后才能发布到所连接的目的地。
方法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
一、log4j日志框架的理论和不同场景使用的更多相关文章
- Slf4j+Log4j日志框架入门
(一).日志系统介绍 slf4j,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统.简答的讲就是slf4j是一系列的 ...
- Log4j日志框架小记
人啊,总是在学习中发现不足,不足中学习,学习中成长. 今天来系统记录一下对于常用日志组件的理解.配置.使用. 仅供参考, 错误之处请各路好汉不吝笔墨批评指正. 转载请注明出处 Log4j日志框架是Ap ...
- SpringBoot系列之切换log4j日志框架
SpringBoot系列之使用切换log4j日志框架 ok,在pom文件右键->Diagrams->show Dependencies....,如图,找到spring-boot-start ...
- log4j日志框架学习
初识Log4j: log4j有三个部分: 1.loggers 负责捕获日志信息. 2.appenders 负责输出信息到不同的目的地 ...
- Spring源码学习:第2步--使用SLF4j+Log4j日志框架替换掉其自身的commons-logging日志框架
正如Spring官方文档所述,其底层的实现选择了commons-logging作为日志框架.这一"失足"性的选择,竟连Spring自身都抱怨.但是,谁叫Spring如此优秀呢,即使 ...
- Log4j日志框架学习零到壹(一)
日志是系统开发过程中用于排查问题重要的记录.通常使用日志来记录系统运行的行为,什么时间点发生了什么 事情.Java中常用的莫过于Log4j框架了.下面主要围绕Log4j的基础知识.Log4j的使用方式 ...
- SpringBoot整合log4j日志框架
Spring Boot 2.x默认使用Logback日志框架,要使用 Log4j2必须先排除 Logback. 加入修改依赖 <dependency> <groupId>org ...
- log4j日志框架的使用
java.util.logging.Logger——java 中提供的日志类 实际开发 90% 都是使用 log4j 记录日志,而 Log4j 底层就是 java.util.logging.Logge ...
- log4J日志框架
log4j的配置:log4j是一个日志输出框架,就是用于输出日志的,主流框架大部分都是Log4j输出.Spring框架也可以通过Log4j输出日志 Log4j提供了强大的日志输出的自定义功能(1)通过 ...
随机推荐
- laravel执行数据库迁移的过程中出现Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] Operation timed out (SQL: select * from information_schema.tables where table_schema = shop and table_name = migrations
向customers表添加字段phone php artisan make:migration add_phone_to_customers_table 问题: 解决方法: 将DB_HOST配置项修改 ...
- 极客大挑战 2019 web 部分解
复现环境:buuoj 0x01:Havefun F12查看源码,明显html注释里是一段php get方式传参数,payload:http://f5cdd431-df98-487f-9400-e8d0 ...
- JAVA基础学习(2)之判断
2判断 2.1比较 2.1.1比较 System.out.println(amount>=10);输出的值为true或false 2.1.2关系运算 优先级 <算术运算 >赋值运算 ...
- leetcode 387
Given a string, find the first non-repeating character in it and return it's index. If it doesn't ex ...
- Java面向对象编程 -4.3
static应用实例 编写一个程序类,这个类可以实现实例化对象个数的统计,每次创建的实例化对象都可以实现一个统计操作. 此时可以单独创建一个static属性,因为所有对象都共享同一个static属性, ...
- ax绘图相关的知识点
1.去边框 # 去掉上.下.左.右边框 ax.spines['top'].set_visible(False) ax.spines['bottom'].set_visible(False) ax.sp ...
- 【Android】数据存储和访问
一.SharedPreferences 2.SQLite
- Vue-全局变量和方法
一.单文件引入 1.创建存放全局变量和方法的vue文件 Common.uve <script> const userName = 'yangjing'; function add(a,b) ...
- Linux :ls 命令
常用命令: ls:列出当前路径下的文件和目录 ls -a:列出当前路径下的所有文件和目录(包括隐藏文件和目录) ls -l:以列表方式显示文件或目录的详细信息 ls -al:可以结合使用 ls xxx ...
- JDBC statement的常用方法
Statement接口: 用于执行静态SQL语句并返回它所生成结果的对象. 三种Statement类: Statement: 由createStatement创建,用于发送简单的SQL语句(最好是不带 ...